我有自己的登录方法,查询自己的自定义密码验证和索赔设置。大致如下:
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内核在所有调用上构建用户身份有什么诀窍吗?还是我在所有调用上都采用了错误的方法?