代码之家  ›  专栏  ›  技术社区  ›  kriskalish

如何确定没有Authorize属性的声明?

  •  2
  • kriskalish  · 技术社区  · 6 年前

    我有自己的登录方法,查询自己的自定义密码验证和索赔设置。大致如下:

    public async Task<ActionResult<LoginResponse>> DoLogin([FromBody] LoginRequest req)
    {
        // fetch account and verify password
    
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Sid, account.AccountId.ToString(), ClaimValueTypes.Integer),
            new Claim(ClaimTypes.Email, account.EmailAddress, ClaimValueTypes.Email),
            new Claim(ClaimTypes.Role, "member", ClaimValueTypes.String)
        };
    
        var identity = new ClaimsIdentity(claims, "password");
        var principal = new ClaimsPrincipal(identity);
    
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
    
        return new LoginResponse
        {
            Success = true
        };
    }
    

    如果用户有用于验证用户身份的cookie,我想有条件地在站点的各个部分呈现一个“注销”按钮。另外,我想获取Sid声明,这样我就可以在站点的某些公共部分传递个性化消息。

    我遇到的问题是,我获取Sid的方式只有在我的控制器或控制器操作具有 [Authorize] 它的属性。没有 [授权]

    代码:

    public static int? GetNullableAccountId(this ClaimsPrincipal principal)
    {
        var claim = principal.FindFirst((Claim c) => { return c.Type == ClaimTypes.Sid; });
    
        if (claim == null)
            return null;
    
        return int.Parse(claim.Value);
    }
    
    // then in the controller I try to get the account id:
    var accountId = accessor.HttpContext.User.GetNullableAccountId();
    // always null even when I have a valid cookie
    

    我发誓我不需要 [授权]

    让ASP.NET内核在所有调用上构建用户身份有什么诀窍吗?还是我在所有调用上都采用了错误的方法?

    1 回复  |  直到 6 年前
        1
  •  3
  •   kriskalish    6 年前

    这似乎是个愚蠢的错误。我在召唤 app.UseAuthentication() 之后 app.UseMvc()

    文件实际上明确规定了以下内容:

    在调用UseMvcWithDefaultRoute或UseMvc之前调用UseAuthentication方法

    https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.2#configuration