问题描述
我有一种这样的登录方法,我添加了三个声明,其中一个是自定义声明
public async Task SignInAsync(IUser user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier,user.Id.ToString("N")),new Claim(ClaimTypes.Name,$"{user.FirstName} {user.LastName}"),new Claim(ClaimsPrincipalHelper.LoginSessionIdClaimsType,Guid.NewGuid().ToString())
};
var identity = new ClaimsIdentity(claims,DefaultAuthenticationTypes.ApplicationCookie);
var principal = new ClaimsPrincipal(identity);
var properties = new AuthenticationProperties
{
AllowRefresh = true,IsPersistent = true,ExpiresUtc = DateTime.UtcNow.AddDays(7)
};
await _authenticationService.SignInAsync(_context,CookieAuthenticationDefaults.AuthenticationScheme,principal,properties);
}
我的理解是,只要调用此方法,就可以获取声明,因此基本上在此行之后
await SignInAsync(user);
我什么时候会立即这样做
var claims = HttpContext.User.Claims.ToList();
所有三个声明都应该可用。但事实并非如此,当我立即执行时,它返回零声明,但是当我在一段时间后尝试访问声明时,我得到了所有三个声明。
那么是cookie编写需要时间还是什么? 为什么不能立即获得索赔或我的理解有误?
解决方法
您的自定义声明必须实现 IClaimsTransformation
接口和 TransformAsync
函数,这会被 ASP 自动调用。然后需要将其添加到 Startup.cs
类中的应用服务集合中,现在您就可以访问它了。
第 1 步:为您的.. IClaimsTransformation
实现接口 MyCustomClaim
第 2 步:在您的服务集合中注册 services.AddScoped<IClaimsTransformation,MyCustomClaim>();
两者都需要,否则它会返回 null,这是一个很好的 ref。