Налаштуйте 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 недійсне, може містити лише літери або цифри.

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

Чи можна налаштувати його на дозвіл електронних адрес для імен користувачів?


1
((UserValidator<ApplicationUser>) UserManager.UserValidator).AllowOnlyAlphanumericUserNames = false;
Арвіс

можливий дублікат ASP.Net UserName на електронну пошту
ozz

Відповіді:


164

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

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

3
Як би ви продовжували створювати користувацький UserValidator?
teh0wner

2
Де саме в коді (у якому файлі / методі) (у програмі mvc5 за замовчуванням) слід поставити UserManager.UserValidator = новий 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. Для більш широкої точки зору дивіться: brockallen on asp net
identitet

16

Версія C # цього (в App_Code \ IdentityModels.cs) є

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

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 };
    }

5

У мене була така ж проблема, коли я намагався змінити код для того, щоб зробити UserName справжнє ім’я людини, а не електронний лист, система показує мені те саме повідомлення про помилку "Ім'я користувача 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 =>

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

4

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

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

    // ... etc
}

(Мені потрібні «/» з застарілих причин.)


1

Оскільки кодування мого власного ApplicationUserManager: UserManager для мене не працювало (можливо, bc я використовую сторінки 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.

Пам'ятайте, що Idp Identity - це суто ідентифікація когось, вам не потрібно мати ідентифікатор електронної пошти, але вони дозволяють нам зберігати його, оскільки він є частиною ідентичності. Коли ви створюєте новий веб-проект у візуальній студії, вам надається можливість налаштування автентифікації.

Якщо ви виберете не порожній тип проекту, такий як 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.

Єдиною стороною такого підходу є те, що ви в два рази зберігаєте електронну пошту .... Що не добре!


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
        };

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

                    };         

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.