如何解决在 IAuthenticationService.SignInSync 之后无法立即读取身份声明
我有一种这样的登录方法,我添加了三个声明,其中一个是自定义声明
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。