我使用的是带有Owin身份的MVC5。
我正在努力重用regenerateIdentityCallback中的任何自定义声明。
我在启动这个配置(在新的MVC项目的标准模板中提供)
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, Guid>(
validateInterval: TimeSpan.FromSeconds(10),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (user) => Guid.Parse(user.GetUserId()))
}
});
GenerateUserIdentityAsync看起来是这样的(也很符合模板的标准)
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, Guid> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// I want here instead of generating new one, just reuse the previous one
userIdentity.AddClaim(new Claim(ClaimTypes.Sid, Guid.NewGuid().ToString()));
return userIdentity;
}
问题是,我不能重用Claim,我总是必须为它获取新的值。在对身份dll进行调查后,我看到,用户的this
实例没有声明,因为它是来自数据库的新用户,userIdentity
只有标准声明作为Id和UserName,这是由CreateIdentityAsync方法创建的。从HttpContext中获取用户。当前是不可能的,在这个地方是空的。
重用声明以从Cookie中保留一些值的最佳方法是什么?我可能误解了索赔的目的。提前感谢您的帮助
您可以通过以下操作获得相同的结果(context。标识是之前的标识):
OnValidateIdentity = context => SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
validateInterval: TimeSpan.FromSeconds(30),
regenerateIdentityCallback:
(manager, user) =>
user.GenerateUserIdentityAsync(manager, context.Identity),
getUserIdCallback: (ci) => Guid.Parse(ci.GetUserId())).Invoke(context)
我放弃并创建了自己的SecurityStampValidator
,它与原始的完全相同,但将当前的claimsIdentity传递给regenerateIdentityCallback作为参数。我对这个解决方案一点也不满意,但它有效。
OnValidateIdentity = MySecurityStampValidator.OnValidateIdentity<ApplicationUserManager, DtbsUser, Guid>(
validateInterval: TimeSpan.FromSeconds(10),
regenerateIdentityCallback: (manager, user, previousIdentity) => user.GenerateUserIdentityAsync(manager, previousIdentity),
getUserIdCallback: user => Guid.Parse(user.GetUserId()))