有一个用户类,其中包含名为“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
方法。在这个问题,我不清楚。乍一看,有两种类似的生成用户身份的方法:
usermanager
类作为参数 - public async Task<ClaimsIdentity> GenerateUserIdentityAsync(AppUserManager manager)
public override Task<ClaimsIdentity> CreateUserIdentityAsync(AppUser user)
这是为了什么目的?哪种方法已被使用?我应该使用哪一个来添加自定义用户声明?
答案 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);
}
}