简介
我正在构建Identity 2.0的自定义实现。默认情况下,框架每30分钟刷新用户的身份,创建一个新的ClaimsIdentity
。因为我有一些自定义声明(我在登录方法中设置),我想在刷新时转移到新的ClaimsIdentity
,我想出了一种从{读取当前ClaimsIdentity
的方法{1}}并将其作为“新”HttpContext
返回。问题是,在刷新身份时ClaimsIdentity
为空,因此我无法将旧的声明复制到新身份。
代码:
在我的HttpContext.Current
文件中,我有这段代码,每x分钟刷新用户的身份:
Startup.cs
此app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidatorExtensions.OnValidateIdentity(
validateInterval: TimeSpan.FromMinutes(0.5),
regenerateIdentity: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie))
}
});
func在我的RegenerateIdentity
中调用此方法:
UserManager
问题:
第一次调用public async override Task<ClaimsIdentity> CreateIdentityAsync(ApplicationUser user, string authenticationType)
{
ClaimsIdentity claimsIdentity;
if (HttpContext.Current != null &&
HttpContext.Current.User != null &&
HttpContext.Current.User.Identity != null &&
HttpContext.Current.User.Identity.IsAuthenticated)
{
// Just return the existing ClaimsIdentity so we don't lose our custom claims
claimsIdentity = (ClaimsIdentity)HttpContext.Current.User.Identity;
// TODO refresh some claims from the database
return claimsIdentity;
}
// Create a new ClaimsIdentity if none exists
claimsIdentity = await ClaimsIdentityFactory.CreateAsync(this, user, authenticationType);
claimsIdentity.AddClaim(new Claim(Constants.DefaultSecurityStampClaimType, await GetSecurityStampAsync(user.Id)));
return claimsIdentity;
}
(当我登录时),CreateIdentityAsync
有一个值,创建了身份,一切都很好。问题是:当再次调用HttpContext.Current
时(因为正在刷新身份),CreateIdentityAsync
为HttpContext.Current
。我不明白为什么会这样,我无法解决它。
理论
我对null
为HttpContext.Current
的原因的一些理论:
null
没有被转移到新线程?我尝试构建自己的awaiter来复制HttpContext
,但这不起作用。HttpContext.Current
以确保它摆脱一切?我无法找到任何代码来执行此操作,因此似乎不太可能。有没有人对如何做到这一点有任何建议?
答案 0 :(得分:0)
Cookie中间件在IIS管道中的身份验证阶段运行,该阶段在HttpContext或会话状态可用之前。所以你需要在没有它的情况下工作。