กำหนดค่า 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;
Arvis

อาจซ้ำกันของASP.Net UserName เป็นอีเมล
ozz

คำตอบ:


164

คุณสามารถอนุญาตได้โดยเสียบ UserValidator ของคุณเองบน UserManager หรือเพียงแค่ปิดการใช้งานเริ่มต้น:

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

3
คุณจะสร้าง UserValidator ที่กำหนดเองได้อย่างไร
teh0wner

2
ฉันควรใส่ 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 สำหรับมัน ..
The Muffin Man

@graycrow จากสถานะปัจจุบันของข้อมูลประจำตัวของ asp.net ฉันต้องการเวลาของ SqlMembership Provider สำหรับมุมมองที่กว้าง
subsci

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 และแก้ไขหรือเพิ่มบรรทัดใต้ "// user settings":

        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 ของฉันเองไม่ได้ผลสำหรับฉัน (บางทีฉันใช้ Razor Pages ไม่ใช่ MVC) นี่เป็นวิธีแก้ปัญหาอื่น: ใน Startup.cs ใน CofigureServices () คุณสามารถกำหนดค่า Identity Options ตัวอย่างเช่น:

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

เพิ่มเติมเกี่ยวกับหัวข้อนี้ใน Microsoft docs: 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 ในเรื่องนี้

โปรดจำไว้ว่า 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 (และวิธีที่สะอาด) เพื่อให้เราสามารถป้อนอีเมลสำหรับฟิลด์ชื่อผู้ใช้ มันสะอาดเนื่องจากใช้วิธีการสร้างแบบคงที่ภายใน 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) ในตัวควบคุมบัญชีของคุณคุณจะต้องใช้การแก้ไขที่กล่าวถึงข้างต้นโดยHao Kungเมื่อ 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

                    };         

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.