谁能解释为什么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>())

最佳答案

*为清晰和简单而编辑

通过将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;

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

10-07 21:28