User.Identity.IsAuthenticated为false,即使我设置了cookie



我知道已经有人问了几个标题相似的问题。通过,它们与ASP.NET相关,而与ASP.NET核心标识无关。因此他们帮不了我。

我使用以下方法登录我的用户:

await SignInManager.SignInAsync(user, isPersistent: true);

我可以验证HTTP响应标头是否包含Set-Cookie标头字段。如下所示:

Set-Cookie: .AspNetCore.Identity.Application=CfDJ8DQK2l...

然后我调用另一个API来访问User.Identity,我可以看到HTTP请求将身份验证cookie发送回服务器。但是我发现User.Identity.IsAuthenticated是假的。

为什么会这样?

这里有一些答案。引起我注意的两个是:

  1. simon hooper的回答

创建一个允许在开发环境中匿名登录的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>();
}
ozzy的
  1. 答案

您可能需要考虑的另一个解决方案是使用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>();
}
...

最新更新