我正在构建一个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在所有调用上建立用户身份,还是我采取了错误的方法?
答案 0 :(得分:3)
看来这是一个愚蠢的错误。配置应用程序构建器时,我在app.UseAuthentication()
之后调用app.UseMvc()
。
文档实际上明确声明以下内容:
在调用UseMvcWithDefaultRoute或UseMvc之前,先调用UseAuthentication方法