Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

Как в Razor-разметке получить дополнительные поля авторизованного пользователя?

@User.Identity.Name по сути выдает логин. А как получить тот же Age к примеру?
public class User : IdentityUser { public int Age{ get; set; } public string FIO { get; set; } public string Addresses { get; set; } }


Ответ

По умолчанию используются только Name.
Класс SignInManager регистрирует пользователей в вашем приложении. Этот класс использует IUserClaimsPrincipalFactory для регистрации claim'ов. Чтобы добавить claim нужно реализовать свой IUserClaimsPrincipalFactory
public class AppClaimsPrincipalFactory : UserClaimsPrincipalFactory { public AppClaimsPrincipalFactory( UserManager userManager , RoleManager roleManager , IOptions optionsAccessor) : base(userManager, roleManager, optionsAccessor) { }
public async override Task CreateAsync(ApplicationUser user) { var principal = await base.CreateAsync(user);
if (user.Age > 0) { ((ClaimsIdentity)principal.Identity).AddClaims(new[] { new Claim("age", user.Age.ToString()) }); }
return principal; } }
Далее регистрируем в классе Startup в методе ConfigureServices после добавления Identity.
public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity() .AddEntityFrameworkStores() .AddDefaultTokenProviders();
services.AddScoped, AppClaimsPrincipalFactory>();
... }
В представлении значение Age можно получить так:
@User.Claims.Where(c => c.Type == "age").Select(c => c.Value).SingleOrDefault();
Для удобства можно создать метод расширения:
public static class IdentityExtensions { public static string GetAge(this IIdentity identity) { var claim = ((ClaimsIdentity)identity).FindFirst("age"); return (claim != null) ? claim.Value : string.Empty; } }
И использовать в представлении так:
@User.Identity.GetAge();

Комментариев нет:

Отправить комментарий