Định cấu hình Microsoft.AspNet.Identity để cho phép địa chỉ email làm tên người dùng


121

Tôi đang trong quá trình tạo một ứng dụng mới và bắt đầu sử dụng 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, v.v. và với các bản RTM ngày hôm qua, tôi đã cập nhật chúng qua NuGet vào tối nay lên RTM.

Ngoài một số thay đổi mã đối với công việc tôi đã làm cho đến nay, tất cả dường như vẫn diễn ra tốt đẹp, cho đến khi tôi cố gắng tạo một tài khoản người dùng cục bộ cho ứng dụng.

Tôi đã làm việc trên địa chỉ e-mail là định dạng tên người dùng với ứng cử viên phát hành đã hoạt động tốt, nhưng bây giờ khi tạo người dùng có địa chỉ email cho tên người dùng, nó xuất hiện lỗi xác thực sau:

Tên người dùng xxxxx@xxxx.com không hợp lệ, chỉ có thể chứa chữ cái hoặc chữ số.

Tôi đã dành khoảng giờ trước để tìm kiếm giải pháp hoặc tài liệu về các tùy chọn cấu hình cho nó, nhưng vô ích.

Có cách nào tôi có thể định cấu hình nó để cho phép địa chỉ e-mail cho tên người dùng không?


1
((UserValidator<ApplicationUser>) UserManager.UserValidator).AllowOnlyAlphanumericUserNames = false;
Arvis

Câu trả lời:


164

Bạn có thể cho phép điều này bằng cách cắm UserValidator của riêng bạn trên UserManager hoặc chỉ cần tắt nó trên triển khai mặc định:

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

3
Bạn sẽ tiếp tục như thế nào về việc tạo một UserValidator tùy chỉnh?
teh0wner

2
Chính xác thì tôi nên đặt UserManager.UserValidator = new UserValidator <TUser> (UserManager) {AllowOnlyAlphanumericUserNames = false} ở đâu trong mã? Cảm ơn.
PussInBoots

29
Trong AccountController của bạn, trong phần public AccountController(UserManager<ApplicationUser> userManager)bổ sung của hàm tạoUserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
LiamGu

1
@graycrow Tôi tiếp tục ca ngợi về cách thành viên Asp.net hoạt động và dễ sử dụng. Tôi rất thích sử dụng website cấu hình truy cập từ VS cho nó ..
Các Muffin Man

@graycrow Với trạng thái hiện tại của danh tính asp.net, tôi mong mỏi những ngày của Nhà cung cấp SqlMembership. Để có một góc nhìn lớn hơn, hãy xem: brockallen về danh tính net asp
subsci 11/02

16

Phiên bản C # của cái này (trong App_Code \ IdentityModels.cs) là

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

9

Trong trường hợp của tôi, chạy trong VS 2013 C #, MVC 5.2.2, sử dụng ASP.NET Identity 2.0, giải pháp là cập nhật phương thức khởi tạo ApplicationUserManager bên trong App_Start \ IdentityConfig.cs như sau:

public ApplicationUserManager(IUserStore<ApplicationUser> store)
        : base(store)
    {
        this.UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
    }

5

Tôi đã gặp vấn đề tương tự, khi tôi cố gắng thay đổi mã để đặt Tên người dùng là tên thật của người đó chứ không phải email hệ thống hiển thị cho tôi cùng một thông báo lỗi "Tên người dùng ABC DEF không hợp lệ, chỉ có thể chứa chữ cái hoặc chữ số . " Tôi đã giải quyết vấn đề khi thêm ký tự khoảng trắng (Trong trường hợp của tôi ở cuối) vào AllowedUserNameCharacters.

Tôi đang sử dụng Asp.Net Core 2.2 và VS2017

Đây là mã của tôi

Truy cập Startup.cs và chỉnh sửa hoặc thêm dòng trong "// cài đặt người dùng":

        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

Nếu bạn đang sử dụng các biểu mẫu web ASP.Net và đang cố gắng thực hiện điều này, chỉ cần mở tệp IdentityModels.vb / cs của bạn và trong Public Class UserManager, có dạng như sau:

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

Đối với những người sử dụng AspNet.Identity.Core 2.1 trở lên, các trình xác thực này trong UserManager là chỉ đọc. Địa chỉ email làm tên người dùng được cho phép theo mặc định nhưng nếu bạn cần tùy chỉnh thêm các ký tự trong tên người dùng của mình, bạn có thể làm như vậy trong Startup.cs như sau:

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

    // ... etc
}

(Tôi cần một '/' vì lý do kế thừa.)


1

Vì mã hóa ApplicationUserManager của riêng tôi: Lớp UserManager không phù hợp với tôi (có thể tôi sử dụng Razor Pages chứ không phải MVC), đây là một giải pháp khác: Trong Startup.cs trong CofigureServices (), bạn có thể định cấu hình Tùy chọn nhận dạng, ví dụ:

services.Configure<IdentityOptions>(options =>
{
  options.User.AllowedUserNameCharacters = 
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@";
  options.User.RequireUniqueEmail = true;
});

Tìm hiểu thêm về chủ đề này trong tài liệu của Microsoft: https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2


0

Nếu bạn không thể tìm thấy IdentityConfig.cs thì hãy thay thế hàm tạo AccountController của bạn bằng mã này.

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

0

Trong trường hợp của tôi, tôi có một lớp kho lưu trữ làm việc với xác thực, điều đó không cho phép tôi sử dụng "-" bên trong tên người dùng .. Cách khắc phục là bên trong hàm tạo ở đây:

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

0

Tôi cũng bị mắc kẹt với điều này vì hầu hết thời gian tên người dùng là E-mail ngày nay, tôi có thể hiểu lý do của một trường E-mail riêng biệt. Đây hoàn toàn là suy nghĩ / kinh nghiệm của tôi vì tôi cũng không thể tìm thấy ý kiến ​​của Microsoft về điều này.

Hãy nhớ rằng, Asp Identity hoàn toàn là để nhận dạng một ai đó, bạn không cần phải có E-mail để được nhận dạng nhưng họ cho phép chúng tôi lưu trữ nó vì nó tạo thành một phần của danh tính. Khi bạn tạo một dự án web mới trong studio trực quan, bạn được cung cấp tùy chọn cho các tùy chọn xác thực.

Nếu bạn chọn loại dự án không trống, chẳng hạn như MVC và đặt xác thực thành "Tài khoản cá nhân" thì bạn sẽ được cung cấp các nền tảng cơ bản để quản lý người dùng. Một trong số đó bao gồm một lớp con trông giống như thế này trong 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
}

Điều này cho chúng ta biết là Microsoft dự định chúng ta lưu trữ những tên người dùng phức tạp hơn (tham khảo AllowOnlyAlphaNumericUserNames = false), vì vậy chúng tôi thực sự có các tín hiệu hỗn hợp.

Thực tế là điều này được tạo ra từ một dự án web mặc định cho chúng tôi một chỉ dẫn / hướng dẫn tốt từ Microsoft (và một cách rõ ràng) để cho phép chúng tôi nhập E-mail cho trường tên người dùng. Nó rõ ràng vì phương thức tạo tĩnh được sử dụng trong App_Start \ Startup.Auth.cs khi khởi động ứng dụng bằng ngữ cảnh Microsoft.OWIN.

Mặt trái duy nhất của phương pháp này là bạn phải lưu trữ E-mail hai lần .... Điều đó không tốt!


0

Như bạn có thể đã phát hiện ra (và được mong đợi), ASP.NET Identity 2.0.0, phát hành tháng 3 năm 2014, bổ sung chức năng này trong khuôn khổ.

Thông báo: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-annotification-rtm-of-asp-net-identity-2-0-0.aspx

Ví dụ và hướng dẫn đầy đủ, bao gồm xác nhận tài khoản: http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity


0

Nếu bạn đang sử dụng IOC thuộc một loại nào đó (tôi đang sử dụng StructureMap) trong trình điều khiển tài khoản của mình, bạn sẽ cần áp dụng bản sửa lỗi do Hao Kung đề cập ở trên khi Usermanager được chuyển vào: (Tôi phải làm như vậy). Có thể có một cách để làm điều đó trong thiết lập IOC, nhưng tôi không biết cách thực hiện.

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

0

Tôi đã phải đối mặt với cùng một vấn đề. nhưng cuối cùng tôi đã giải quyết vấn đề bằng cách thêm phần dưới đây vào phương thức của tôi, không phải hàm tạo.

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

                    };         

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.