配置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;
阿维斯

Answers:


164

您可以通过在UserManager上插入自己的UserValidator或通过在默认实现中将其关闭来允许此操作:

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

3
您将如何继续创建自定义UserValidator?
teh0wner 2013年

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访问的网站配置为它..
松饼人

@graycrow鉴于asp.net身份的当前状态,我渴望SqlMembership Provider的日子。从更大的角度来看: aspnet身份上的
brockallen

16

其C#版本(在App_Code \ IdentityModels.cs中)为

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

9

以我为例,使用ASP.NET Identity 2.0在VS 2013 C#,MVC 5.2.2中运行,解决方案是更新App_Start \ IdentityConfig.cs中的ApplicationUserManager构造函数,如下所示:

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 Web表单并尝试完成此操作,只需打开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类对我不起作用(也许是因为我使用Razor Pages,而不是MVC),所以这是另一种解决方案:在CofigureServices()中的Startup.cs中,您可以配置身份选项,例如:

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

我也一直坚持这一点,因为这些天大多数时候用户名都是电子邮件,但是我可以理解单独的电子邮件字段的原因。这些纯粹是我的想法/经验,因为我也找不到微软对此的发言权。

请记住,Asp Identity纯粹是为了识别某人,您不必识别电子邮件,但由于它构成身份的一部分,因此我们可以存储它。在Visual Studio中创建新的Web项目时,将为您提供身份验证选项。

如果选择非空项目类型(例如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),因此确实存在混合信号。

这是从默认的Web项目中生成的事实,它为我们提供了一个很好的指示/指示(来自Microsoft)(并且是一种简洁的方法),使我们能够为用户名字段输入电子邮件。这很干净,因为在使用Microsoft.OWIN上下文引导应用程序时,在App_Start \ Startup.Auth.cs中使用了静态创建方法。

这种方法的唯一缺点是,您最终将电子邮件存储了两次……。这不好!



0

如果您在帐户控制器中使用某种IOC(我正在使用StructureMap),则在传入Usermanager时,您将需要应用Hao Kung所述的修复程序:(我必须这样做)。在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

                    };         

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.