添加自定义用户声明的适当位置

时间:2015-06-10 09:10:42

标签: asp.net-mvc asp.net-identity

有一个用户类,其中包含名为“Avatar”的字段,该字段存储其个人资料图片的路径。我想在局部视图内的标题中显示它。所以我决定添加对用户身份的声明。我将这行代码放在IdentityConfig.cs类中:

 public override Task<ClaimsIdentity> CreateUserIdentityAsync(AppUser user)
        {
            if(!System.String.IsNullOrEmpty(user.Avatar))
                user.Claims.Add(new AppUserClaim() { ClaimType = "avatar", ClaimValue = user.Avatar});

            return user.GenerateUserIdentityAsync((AppUserManager)UserManager);
        }

但是有一个问题:经过一段时间(aprox.1小时)后,这个声明消失了,并且没有显示头像。我发现, asp.net identity 框架每30分钟重新生成一次用户身份(默认)。根据这个:

 regenerateIdentityCallback: (manager, user) =>
                            user.GenerateUserIdentityAsync(manager)

它调用用户类的GenerateUserIdentityAsync方法。在这个问题,我不清楚。乍一看,有两种类似的生成用户身份的方法:

  1. AppUser 类中,以usermanager类作为参数 - public async Task<ClaimsIdentity> GenerateUserIdentityAsync(AppUserManager manager)
  2. SignInManager - public override Task<ClaimsIdentity> CreateUserIdentityAsync(AppUser user)
  3. 这是为了什么目的?哪种方法已被使用?我应该使用哪一个来添加自定义用户声明?

1 个答案:

答案 0 :(得分:4)

我已经重构了一个标准的ASP.NET MVC项目,所以我不会重复添加声明的代码。

Startup.Auth.cs:

public void ConfigureAuth(IAppBuilder app, Container container)
{
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        Provider = new CookieAuthenticationProvider
        {
            OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, User>(
                validateInterval: TimeSpan.FromMinutes(30),
                regenerateIdentity: (manager, user) => IdentityHelper.GenerateUserIdentityAsync(user, manager))
        }
    });
}

然后我创建了一个静态帮助器方法来生成标识:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(User user, UserManager<User> manager)
{
    var userIdentity = await manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie).ConfigureAwait(false);

    userIdentity.AddClaim(new Claim("Key", "Value"));

    return userIdentity;
}

现在,您将能够从 SignInManager 中重用此帮助程序。

public class ApplicationSignInManager : SignInManager<User, string>
{
    public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }

    public override Task<ClaimsIdentity> CreateUserIdentityAsync(User user)
    {
        return IdentityHelper.GenerateUserIdentityHelperAsync(user, (ApplicationUserManager)UserManager);
    }
}