2015-06-10 3 views
0

Существует класс пользователя с полем «Аватар», в котором хранится путь к его профилю. Я хочу показать его в заголовке внутри частичного представления. Поэтому я решил добавить заявку на идентификацию пользователя. Я ставлю эти строки кода внутри моего 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); 
     } 

Но есть проблема: после определенного периода времени (. Приблиз 1 час) это претензии исчезает, и нет аватара показано на рисунке. Я узнал, что asp.net identity framework восстанавливает идентификатор пользователя каждые 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)

Какова цель этого? Где каждый из этих методов был использован? И какой из них следует использовать для добавления пользовательских требований?

ответ

2

Я немного переработал стандартный проект 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); 
    } 
} 
Смежные вопросы