129

我正在创建一个新应用程序并开始使用 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 无效,只能包含字母或数字。

我花了最后一个小时左右的时间来寻找有关它的配置选项的解决方案或文档,但无济于事。

有没有办法可以配置它以允许用户名的电子邮件地址?

4

13 回答 13

170

您可以通过在 UserManager 上插入您自己的 UserValidator 来允许这样做,或者只是在默认实现中将其关闭:

UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }
于 2013-10-19T00:08:50.400 回答
16

这个(在 App_Code\IdentityModels.cs 中)的 C# 版本是

public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
        UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
于 2014-03-14T13:33:19.720 回答
9

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

public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }
于 2015-05-07T17:41:33.193 回答
9

我遇到了同样的问题,当我尝试更改代码以使 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 =>
于 2019-06-09T01:07:26.597 回答
6

对于 AspNet.Identity.Core 2.1 及更高版本的用户,UserManager 中的这些验证器是只读的。默认情况下允许将电子邮件地址作为用户名,但如果您需要进一步自定义用户名中的字符,您可以在 Startup.cs 中这样做:

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

    // ... etc
}

(出于遗留原因,我需要一个“/”。)

于 2018-12-19T00:52:39.937 回答
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
于 2014-01-05T17:28:11.277 回答
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

于 2019-05-10T13:07:07.673 回答
0

您可能已经发现(并且意料之中),2014 年 3 月发布的 ASP.NET Identity 2.0.0 在框架中添加了此功能。

公告: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

于 2014-06-17T07:58:33.863 回答
0

如果您在您的帐户控制器中使用某种 IOC(我正在使用 StructureMap),则需要在传入 Usermanager 时应用Hao Kung上面提到的修复:(我必须这样做)。在 IOC 设置中可能有办法做到这一点,但我不知道如何。

public AccountController(ApplicationUserManager userManager)
    {
        _userManager = userManager;
        _userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true
        };
于 2018-11-15T01:21:25.790 回答
0

如果您找不到 IdentityConfig.cs,则使用此代码替换您的 AccountController 构造函数。

public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) 
  {
      AllowOnlyAlphanumericUserNames = false  
  };
}
于 2016-07-15T12:08:21.960 回答
0

在我的情况下,我有一个使用身份验证的存储库类,它不允许我在用户名中使用“-”。修复在这里的构造函数中:

//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
    _ctx = new AuthContext();
    _userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
    _userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
    {
        AllowOnlyAlphanumericUserNames = false
    };
}
于 2017-08-29T17:47:11.163 回答
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
}

这告诉我们的是,微软打算让我们存储更复杂的用户名(请参阅 AllowOnlyAlphaNumericUserNames = false),所以我们确实有混合信号。

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

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

于 2017-10-03T09:30:49.803 回答
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

                    };         

}
于 2019-03-06T10:37:47.597 回答