Настроить Microsoft.сеть САШ.Удостоверение, позволяющее использовать адрес электронной почты в качестве имени пользователя

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

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

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

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

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

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

8 ответов


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

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

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

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

в моем случае работает в 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 };
    }

Если вы используете ASP.Net webforms и пытаются это сделать, просто откройте свои 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

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

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

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

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

Я также застрял с этим, потому что большую часть времени имена пользователей-это электронные письма в эти дни, я могу понять рассуждения отдельного поля электронной почты. Это чисто мои мысли / опыт, поскольку я также не мог найти мнение 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 (и чистый способ), чтобы мы могли вводить электронные письма для поля имени пользователя. Это чисто, потому что статический метод create используется в App_Start\Startup.Автор.cs при загрузке приложения с помощью Microsoft.OWIN в контексте.

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


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