ASP.NET Core 2.1如何确定没有授权属性的声明?

时间:2018-12-08 22:47:08

标签: c# asp.net authentication

我正在构建一个Web应用程序,该应用程序使用ASP.NET Core 2.1中内置的cookie身份验证。

我有自己的登录方法,可以查询自己的自定义密码验证和声明设置。大致看起来像这样:

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声明,以便可以在网站的某些公共部分传递个性化消息。

我遇到的问题是,仅当我的控制器或控制器操作具有[Authorize]属性时,我才能获取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

我发誓我不需要[Authorize]属性就可以在早期版本的ASP.NET Core中工作,但是我在更改日志中找不到任何有意义的东西。

是否有一些技巧可以使ASP.NET Core在所有调用上建立用户身份,还是我采取了错误的方法?

1 个答案:

答案 0 :(得分:3)

看来这是一个愚蠢的错误。配置应用程序构建器时,我在app.UseAuthentication()之后调用app.UseMvc()

文档实际上明确声明以下内容:

  

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

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