![](/img/trans.png)
[英]How to set value to User.Identity.IsAuthenticated as false in Forms Authentication
[英]User.Identity.IsAuthenticated is false, even when I have a cookie set
我知道已经有人问了几个具有类似标题的问题。 它们与 ASP.NET 而不是 ASP.NET Core Identity 相关。 所以他们帮不了我。
我使用此方法登录我的用户:
await SignInManager.SignInAsync(user, isPersistent: true);
我可以验证 HTTP 响应标头是否包含Set-Cookie
标头字段。 它如下:
Set-Cookie: .AspNetCore.Identity.Application=CfDJ8DQK2l...
然后我调用另一个 API 来访问User.Identity
,我可以看到 HTTP 请求将身份验证 cookie 发送回服务器。 但我看到User.Identity.IsAuthenticated
是假的。
为什么会这样?
有提出了几个答案在这里。 引起我注意的两个是:
创建一个IAuthorizationHandler
单例服务,允许在开发环境中匿名登录
/// <summary>
/// This authorisation handler will bypass all requirements
/// </summary>
public class AllowAnonymous : IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
foreach (IAuthorizationRequirement requirement in context.PendingRequirements.ToList())
context.Succeed(requirement); //Simply pass all requirements
return Task.CompletedTask;
}
}
然后在Startup.ConfigureServices
有条件地注册此处理程序。
private readonly IWebHostEnvironment _env;
public Startup(IWebHostEnvironment env)
{
_env = env;
}
public void ConfigureServices(IServiceCollection services)
{
{...}
//Allows auth to be bypassed
if (_env.IsDevelopment())
services.AddSingleton<IAuthorizationHandler, AllowAnonymous>();
}
您可能要考虑的另一个解决方案是使用 IPolicyEvaluator。 这意味着您可以保留所有现有的安全元素。
public class DisableAuthenticationPolicyEvaluator : IPolicyEvaluator
{
public async Task<AuthenticateResult> AuthenticateAsync(AuthorizationPolicy policy, HttpContext context)
{
// Always pass authentication.
var authenticationTicket = new AuthenticationTicket(new ClaimsPrincipal(), new AuthenticationProperties(), JwtBearerDefaults.AuthenticationScheme);
return await Task.FromResult(AuthenticateResult.Success(authenticationTicket));
}
public async Task<PolicyAuthorizationResult> AuthorizeAsync(AuthorizationPolicy policy, AuthenticateResult authenticationResult, HttpContext context, object resource)
{
// Always pass authorization
return await Task.FromResult(PolicyAuthorizationResult.Success());
}
}
在Startup.cs
,确保它出现在 ConfigureServices 方法的顶部。 例如。
public void ConfigureServices(IServiceCollection services)
{
if (env.IsDevelopment())
{
// Disable authentication and authorization.
services.TryAddSingleton<IPolicyEvaluator, DisableAuthenticationPolicyEvaluator>();
}
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.