Страницы

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

Показаны сообщения с ярлыком asp.net-identity-3. Показать все сообщения
Показаны сообщения с ярлыком asp.net-identity-3. Показать все сообщения

понедельник, 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();

понедельник, 8 июля 2019 г.

Как убрать валидацию имени пользователя ASP.NET MVC CORE?

Пытаюсь изменить пароль пользователя таким способом:
await _userManager.ResetPasswordAsync(user, code, editViewModel.Password);
user - объект ApplicationUser, code - код сброса пароля, сгенерированный функцией _userManager.GeneratePasswordResetTokenAsync, editViewModel.Password - строка, содержащая новый пароль.
При попытке изменить пароль результатом возвращается ошибка User name 'Дмитрий' is invalid, can only contain letters or digits. (Дмитрий - имя пользователя). Как отменить валидацию имени пользователя при изменении пароля?


Ответ

Допустимые символы в имени пользователя задаются в UserOptions.AllowedUserNameCharacters. Вот значение по умолчанию:
///

/// Gets or sets the list of allowed characters in the username used to validate user names. /// /// /// The list of allowed characters in the username used to validate user names. /// public string AllowedUserNameCharacters { get; set; } = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
Судя по коду, проверку можно отключить, сбросив эту строку на пустую или на null
else if (!string.IsNullOrEmpty(manager.Options.User.AllowedUserNameCharacters) && userName.Any(c => !manager.Options.User.AllowedUserNameCharacters.Contains(c))) { errors.Add(Describer.InvalidUserName(userName)); }
Обнулить эту настройку можно в методе ConfigureServices
services.AddIdentity(opts => { opts.User.AllowedUserNameCharacters = null; }

понедельник, 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();