ASP.net 身份 SecurityStampValidator OnValidateIdentity 重新生成身份参数
ASP.net Identity SecurityStampValidator OnValidateIdentity regenerateIdentity parameter
谁能解释为什么 ApplicationUser
class 创建以下辅助函数?
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 文件中,作为 SecurityStampValidator.OnValidateEntity
的 regenerateIdentity
回调参数功能:
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => id.GetUserId<int>())
正如您从助手中看到的那样,它只是转身并调用 manager.CreatedIdentityAsync
。他们使用辅助方法 "polluted" ApplicationUser
class 而不是按如下方式设置 OnValidateEntity
是有原因的吗?
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie),
getUserIdCallback: (id) => id.GetUserId<int>())
*为清晰和简单起见进行了编辑
通过将身份生成方法抽象到用户中 class,我们可以进行扩展。
想象这样一个场景,您的应用程序有几种不同的用户类型,每种类型都可以实现自己的重新生成逻辑,而无需单独的身份验证类型。取IdentityUser baseclass的ApplicationUser subclass中的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;
}
}
我们现在可以将我们的声明分成不同的用户 classes,而无需修改 OWIN 身份验证管道,或者只需通过子classing 基础 IdentityUser 即可为每种类型创建一个新的 CookieAuthenticationProvider。
tldr;
它将身份重新生成的责任推给正在重新生成的用户 class。类似于工厂方法模式。
谁能解释为什么 ApplicationUser
class 创建以下辅助函数?
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 文件中,作为 SecurityStampValidator.OnValidateEntity
的 regenerateIdentity
回调参数功能:
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => id.GetUserId<int>())
正如您从助手中看到的那样,它只是转身并调用 manager.CreatedIdentityAsync
。他们使用辅助方法 "polluted" ApplicationUser
class 而不是按如下方式设置 OnValidateEntity
是有原因的吗?
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User, int>(
validateInterval: TimeSpan.FromSeconds(15),
regenerateIdentityCallback: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie),
getUserIdCallback: (id) => id.GetUserId<int>())
*为清晰和简单起见进行了编辑
通过将身份生成方法抽象到用户中 class,我们可以进行扩展。
想象这样一个场景,您的应用程序有几种不同的用户类型,每种类型都可以实现自己的重新生成逻辑,而无需单独的身份验证类型。取IdentityUser baseclass的ApplicationUser subclass中的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;
}
}
我们现在可以将我们的声明分成不同的用户 classes,而无需修改 OWIN 身份验证管道,或者只需通过子classing 基础 IdentityUser 即可为每种类型创建一个新的 CookieAuthenticationProvider。
tldr;
它将身份重新生成的责任推给正在重新生成的用户 class。类似于工厂方法模式。