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

Я создаю новое приложение и начинаю использовать 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.

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

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

User name [email protected] is invalid, can only contain letters or digits.

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

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

Ответ 1

Это можно сделать, подключив свой UserValidator к UserManager или просто отключив его по умолчанию:

UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }

Ответ 2

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

public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }

Ответ 3

В моем случае, работая в VS 2013 С#, 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 };
    }

Ответ 4

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

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

Ответ 5

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddIdentity<ApplicationUser, IdentityRole>(options => {
        options.User.AllowedUserNameCharacters = "ab[email protected]+/";
    });

    // ... etc
}

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

Ответ 6

Как вы, вероятно, узнали (и ожидалось), 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

Ответ 7

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

public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
  {
      AllowOnlyAlphanumericUserNames = false  
  };
}

Ответ 8

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

//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
    _ctx = new AuthContext();
    _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
    _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}

Ответ 9

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

Помните, что Asp Identity - это только для того, чтобы идентифицировать кого-то, вам не нужно идентифицировать E-mail, но они позволяют нам хранить его, потому что он является частью идентификатора. Когда вы создаете новый веб-проект в 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 (и чистый путь), чтобы мы могли вводить E-mail для поля имени пользователя. Он чист, потому что статический метод создания используется в App_Start\Startup.Auth.cs при загрузке приложения в контексте Microsoft.OWIN.

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

Ответ 10

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

public AccountController(ApplicationUserManager userManager)
    {
        _userManager = userManager;
        _userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };

Ответ 11

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

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

                    };         

}

Ответ 12

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

services.Configure<IdentityOptions>(options =>
{
  options.User.AllowedUserNameCharacters = 
  "[email protected]";
  options.User.RequireUniqueEmail = true;
});

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

Ответ 13

У меня была такая же проблема, когда я пытался изменить код, чтобы имя пользователя было настоящим именем пользователя, а не адресом электронной почты, система выдает мне то же сообщение об ошибке "Имя пользователя 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 =
                "ab[email protected]+ ";
            options.User.RequireUniqueEmail = false;
        });

        services.ConfigureApplicationCookie(options =>