Настройте Microsoft.AspNet.Identity, чтобы разрешить адрес электронной почты в качестве имени пользователя

121

Я в процессе создания нового приложения и начал использовать EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity .Owin 1.0.0-rc1 и т. Д., И с выпусками RTM вчера, я обновил их через NuGet сегодня вечером до RTM.

За исключением пары изменений кода в работе, которую я проделал, все, казалось, шло хорошо, пока я не попытался создать локальную учетную запись пользователя для приложения.

Я работал над адресами электронной почты, являющимися форматом имени пользователя, который с кандидатом на выпуск отлично работал, но теперь при создании пользователя с адресом электронной почты для имени пользователя возникает следующая ошибка проверки:

Имя пользователя xxxxx@xxxx.com недействительно, может содержать только буквы или цифры.

Я потратил последний час или около того на поиск решения или документации по параметрам конфигурации для него, но безрезультатно.

Есть ли способ настроить его, чтобы разрешить адреса электронной почты для имен пользователей?

LiamGu
источник
1
((UserValidator<ApplicationUser>) UserManager.UserValidator).AllowOnlyAlphanumericUserNames = false;
Arvis
возможный дубликат имени пользователя ASP.Net на электронную почту
ozz

Ответы:

164

Вы можете разрешить это, подключив свой собственный UserValidator к UserManager или просто отключив его в реализации по умолчанию:

UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }
Хао Кунг
источник
3
Как бы вы поступили с созданием пользовательского UserValidator?
teh0wner
2
Где именно в коде (в каком файле / методе) (в приложении mvc5 по умолчанию) я должен поместить UserManager.UserValidator = new UserValidator <TUser> (UserManager) {AllowOnlyAlphanumericUserNames = false}? Спасибо.
PussInBoots
29
В AccountController в public AccountController(UserManager<ApplicationUser> userManager)конструкторе добавьтеUserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
LiamGu
1
@graycrow Я продолжаю разглагольствовать о том, как членство в Asp.net работало и было простым в использовании. Мне понравилось использовать для этого веб-сайт конфигурации, доступный из VS ..
The Muffin Man
@graycrow Учитывая текущее состояние идентичности asp.net, я тоскую по дням SqlMembership Provider. Для более широкой перспективы см .: Brockallen об идентичности asp net
подписка
16

Версия C # этого (в App_Code \ IdentityModels.cs)

public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
user2554240
источник
9

В моем случае при работе в VS 2013 C #, MVC 5.2.2 с использованием ASP.NET Identity 2.0 решение заключалось в обновлении конструктора ApplicationUserManager внутри App_Start \ IdentityConfig.cs следующим образом:

public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
N1njaB0b
источник
5

У меня была такая же проблема, когда я попытался изменить код, чтобы имя пользователя было настоящим именем человека, а не адресом электронной почты, система показала мне то же сообщение об ошибке «Имя пользователя ABC DEF недействительно, может содержать только буквы или цифры. «. Я решил проблему, добавив пробел (в моем случае в конце) в AllowedUserNameCharacters.

Я использую Asp.Net Core 2.2 и VS2017

Это мой код

Перейдите в Startup.cs и отредактируйте или добавьте строку в разделе «// пользовательские настройки»:

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings.
            options.Password.RequireDigit = true;
            options.Password.RequireLowercase = true;
            options.Password.RequireNonAlphanumeric = true;
            options.Password.RequireUppercase = true;
            options.Password.RequiredLength = 6;
            options.Password.RequiredUniqueChars = 1;

            // Lockout settings.
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.AllowedForNewUsers = true;


            // User settings.
            options.User.AllowedUserNameCharacters =
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
            options.User.RequireUniqueEmail = false;
        });

        services.ConfigureApplicationCookie(options =>
jcarrillo
источник
4

Если вы используете веб-формы ASP.Net и пытаетесь этого добиться, просто откройте файл IdentityModels.vb / cs и в UserManager Public Class сделайте так:

Public Class UserManager
Inherits UserManager(Of ApplicationUser)

Public Sub New()
    MyBase.New(New UserStore(Of ApplicationUser)(New ApplicationDbContext()))
    Users = store
    UserValidator = New UserValidator(Of ApplicationUser)(Me) With {.AllowOnlyAlphanumericUserNames = False}
End Sub

Public Property Users() As IUserStore(Of ApplicationUser)
    Get
        Return m_Users
    End Get
    Private Set(value As IUserStore(Of ApplicationUser))
        m_Users = value
    End Set
End Property
Private m_Users As IUserStore(Of ApplicationUser)

End Class
TyrolMedia
источник
4

Для пользователей AspNet.Identity.Core 2.1 и выше эти валидаторы в UserManager доступны только для чтения. Адреса электронной почты в качестве имен пользователей разрешены по умолчанию, но если вам нужна дополнительная настройка символов в именах пользователей, вы можете сделать это в Startup.cs следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>(options => {
        options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/";
    });

    // ... etc
}

(Мне нужен был '/' по устаревшим причинам.)

bsigma1
источник
1

Поскольку кодирование моего собственного класса ApplicationUserManager: UserManager не сработало для меня (возможно, я использую Razor Pages, а не MVC), вот еще одно решение: в Startup.cs в CofigureServices () вы можете настроить параметры идентификации, например:

services.Configure<IdentityOptions>(options =>
{
  options.User.AllowedUserNameCharacters = 
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@";
  options.User.RequireUniqueEmail = true;
});

Подробнее по этой теме в документации Microsoft: https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2

Джимми
источник
0

Если вы не можете найти IdentityConfig.cs, замените конструктор AccountController этим кодом.

public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
  {
      AllowOnlyAlphanumericUserNames = false  
  };
}
Сухаил Мумтаз Аван
источник
0

В моем случае у меня был класс репозитория, работающий с аутентификацией, который не позволял мне использовать "-" внутри имен пользователей. Исправление было внутри конструктора здесь:

//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
    _ctx = new AuthContext();
    _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
    _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}
Ник Ковальский
источник
0

Я также застрял в этом, потому что в наши дни в большинстве случаев имена пользователей представляют собой электронные письма, хотя я могу понять причину отдельного поля электронной почты. Это чисто мои мысли / опыт, поскольку я также не мог найти мнения Microsoft по этому поводу.

Помните, что Asp Identity предназначена исключительно для того, чтобы идентифицировать кого-то, вам не нужно иметь электронную почту для идентификации, но они позволяют нам хранить ее, потому что она является частью личности. Когда вы создаете новый веб-проект в Visual Studio, вам предоставляется возможность выбора параметров аутентификации.

Если вы выберете непустой тип проекта, такой как MVC, и установите для аутентификации значение «Индивидуальные учетные записи», то вам будут предоставлены базовые основы для управления пользователями. Один из них включает в себя подобный подкласс в App_Start \ IdentityConfig.cs:

 // Configure the application user manager used in this application. UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
        // Configure validation logic for usernames
        manager.UserValidator = new UserValidator<ApplicationUser>(manager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
    }
    //N.B rest of code removed
}

Это говорит нам о том, что Microsoft намеревается хранить более сложные имена пользователей (см. AllowOnlyAlphaNumericUserNames = false), поэтому на самом деле у нас смешанные сигналы.

Тот факт, что это сгенерировано из веб-проекта по умолчанию, дает нам хорошее указание / направление от Microsoft (и чистый способ), позволяющий нам вводить электронную почту в поле имени пользователя. Это чисто, потому что статический метод создания используется в App_Start \ Startup.Auth.cs при загрузке приложения с контекстом Microsoft.OWIN.

Единственным недостатком этого подхода является то, что вы в конечном итоге сохраняете электронную почту дважды ... Что нехорошо!

Nabster
источник
0

Как вы, вероятно, узнали (и этого следовало ожидать), ASP.NET Identity 2.0.0, выпущенный в марте 2014 года, добавляет эту функциональность в структуру.

Объявление: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

Полный пример и руководство, включая подтверждение учетной записи: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity

Винсент Селс
источник
0

Если вы используете какой-либо IOC (я использую StructureMap) в контроллере вашей учетной записи, вам нужно будет применить исправление, упомянутое выше Хао Кунгом, когда Usermanager передается: (мне пришлось). Возможно, есть способ сделать это в настройке IOC, но я не знаю, как это сделать.

public AccountController(ApplicationUserManager userManager)
    {
        _userManager = userManager;
        _userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
davaus
источник
0

Я столкнулся с той же проблемой. но, наконец, я решил проблему, добавив в свой метод нижеследующую часть, а не конструктор.

public void MyMethod(){

     UserManager<ApplicationUser> manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));


                    // Configure validation logic for usernames  
                    manager.UserValidator = new UserValidator<ApplicationUser>(manager)
                    {
                        AllowOnlyAlphanumericUserNames = false,
                        RequireUniqueEmail = true

                    };         

}
сахит вальпита
источник