繁体   English   中英

User.Identity.IsAuthenticated 是假的,即使我设置了 cookie

[英]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是假的。

为什么会这样?

有提出了几个答案在这里 引起我注意的两个是:

  1. 西蒙·霍珀的回答

创建一个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>();
}
  1. 来自 ozzy 的回答

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM