ASP.net Identity SecurityStampValidator OnValidateIdentity regenerateIdentity参数

时间:2015-03-09 16:43:44

标签: c# asp.net asp.net-mvc asp.net-identity owin

有人可以解释为什么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>())

1 个答案:

答案 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;

它将身份重新生成职责推送到正在重新生成的用户类。类似于工厂方法模式。