有人可以解释为什么ApplicationUser
类会创建以下辅助函数吗?
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<User, int> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
我唯一可以找到它的地方是 Startup.Auth.cs 文件,作为regenerateIdentity
函数的SecurityStampValidator.OnValidateEntity
回调参数:
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => id.GetUserId<int>())
正如你从辅助工具中看到的那样,它只是转身并调用manager.CreatedIdentityAsync
。是否有理由使用辅助方法“污染”ApplicationUser
类,而不是按如下方式设置OnValidateEntity
?
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie),
getUserIdCallback: (id) => id.GetUserId<int>())
答案 0 :(得分:8)
*为了清晰和简洁而编辑
通过将Identity Generation方法抽象到用户类中,我们可以获得可扩展性。
想象一下,您的应用程序具有多种不同的用户类型,每种用户都可以实现自己的再生逻辑,而无需使用单独的身份验证类型。获取IdentityUser基类的ApplicationUser子类中的helper方法。
public class ApplicationUser : IdentityUser
{
public string NickName {get; set; }
public DateTime BirthDay {get; set;}
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
我们现在可以将我们的声明分成不同的用户类,而无需修改OWIN身份验证管道,或者只需通过继承基本IdentityUser为每种类型创建一个新的CookieAuthenticationProvider。
tldr;
它将身份重新生成职责推送到正在重新生成的用户类。类似于工厂方法模式。