Страницы

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

понедельник, 23 декабря 2019 г.

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

#c_sharp #aspnet_core #razor #aspnet_identity_2 #aspnet_identity_3


@User.Identity.Name по сути выдает логин. А как получить тот же Age к примеру?

public class User : IdentityUser
{
    public int Age{ get; set; }
    public string FIO { get; set; }
    public string Addresses { get; set; }
}

    


Ответы

Ответ 1



По умолчанию используются только 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();

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

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