Konfigurasikan Microsoft.AspNet.Identity untuk mengizinkan alamat email sebagai nama pengguna


121

Saya sedang dalam proses membuat aplikasi baru dan mulai menggunakan 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, dll. Dan dengan rilis RTM kemarin, saya memperbaruinya melalui NuGet malam ini ke RTM.

Terlepas dari beberapa perubahan kode pada pekerjaan yang telah saya lakukan sejauh ini, semua tampaknya berjalan dengan baik, sampai saya mencoba membuat akun pengguna lokal untuk aplikasi tersebut.

Saya telah mengerjakan alamat email menjadi format nama pengguna yang dengan kandidat rilis berfungsi dengan baik, tetapi sekarang ketika membuat pengguna dengan alamat email untuk nama pengguna, itu memunculkan kesalahan validasi berikut:

Nama pengguna xxxxx@xxxx.com tidak valid, hanya boleh berisi huruf atau angka.

Saya telah menghabiskan satu jam terakhir mencari solusi atau dokumentasi tentang opsi konfigurasi untuk itu, tetapi tidak berhasil.

Adakah cara saya dapat mengkonfigurasinya untuk mengizinkan alamat email untuk nama pengguna?


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

kemungkinan duplikat ASP.Net UserName ke Email
ozz

Jawaban:


164

Anda dapat mengizinkan ini dengan memasukkan UserValidator Anda sendiri di UserManager, atau hanya dengan mematikannya pada implementasi default:

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

3
Bagaimana Anda melanjutkan tentang membuat UserValidator kustom?
teh0wner

2
Di mana tepatnya dalam kode (di mana file / metode) (dalam aplikasi mvc5 default) saya harus meletakkan UserManager.UserValidator = new UserValidator <TUser> (UserManager) {AllowOnlyAlphanumericUserNames = false}? Terima kasih.
PussInBoots

29
Di AccountController Anda, di public AccountController(UserManager<ApplicationUser> userManager)add konstruktorUserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
LiamGu

1
@graycrow Saya terus mengomel tentang cara kerja keanggotaan Asp.net dan mudah digunakan. Saya menikmati menggunakan situs web konfigurasi yang dapat diakses dari VS untuk itu ..
The Muffin Man

@graycrow Mengingat keadaan identitas asp.net saat ini, saya merindukan hari-hari SqlMembership Provider. Untuk perspektif yang lebih besar lihat: brockallen on asp net identity
subsci

16

Versi C # ini (di App_Code \ IdentityModels.cs) adalah

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

9

Dalam kasus saya, berjalan di VS 2013 C #, MVC 5.2.2, menggunakan ASP.NET Identity 2.0, solusinya adalah memperbarui konstruktor ApplicationUserManager di dalam App_Start \ IdentityConfig.cs seperti:

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

5

Saya memiliki masalah yang sama, ketika saya mencoba mengubah kode untuk membuat UserName adalah nama asli orang tersebut dan bukan email sistem tunjukkan pesan kesalahan yang sama "Nama pengguna ABC DEF tidak valid, hanya dapat berisi huruf atau angka . " Saya memecahkan masalah menambahkan karakter spasi (Dalam kasus saya di akhir) ke AllowedUserNameCharacters.

Saya menggunakan Asp.Net Core 2.2 dan VS2017

Ini kode saya

Buka Startup.cs dan edit atau tambahkan baris di bawah "// pengaturan pengguna":

        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

Jika Anda menggunakan formulir web ASP.Net dan mencoba untuk melakukannya, cukup buka file IdentityModels.vb / cs Anda dan di bawah Public Class UserManager, lihat seperti ini:

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

Untuk pengguna AspNet.Identity.Core 2.1 dan yang lebih baru, validator di UserManager ini hanya dapat dibaca. Alamat email sebagai nama pengguna diperbolehkan secara default, tetapi jika Anda membutuhkan penyesuaian lebih lanjut dari karakter dalam nama pengguna Anda, Anda dapat melakukannya di Startup.cs seperti ini:

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

    // ... etc
}

(Saya membutuhkan '/' untuk alasan warisan.)


1

Karena mengkodekan ApplicationUserManager saya sendiri: kelas UserManager tidak berfungsi untuk saya (mungkin karena saya menggunakan Razor Pages, bukan MVC), inilah solusi lain: Di Startup.cs di CofigureServices () Anda dapat mengonfigurasi Opsi Identitas, misalnya:

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

Selengkapnya tentang topik ini di Microsoft Docs: https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2


0

Jika Anda tidak dapat menemukan IdentityConfig.cs, ganti konstruktor AccountController Anda dengan kode ini.

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

0

Dalam kasus saya, saya memiliki kelas repositori yang bekerja dengan otentikasi, yang tidak mengizinkan saya menggunakan "-" di dalam nama pengguna .. Perbaikannya ada di dalam konstruktor di sini:

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

0

Saya juga terjebak dengan ini karena sebagian besar waktu nama pengguna adalah E-mail akhir-akhir ini, saya dapat memahami alasan bidang E-mail terpisah. Ini murni pemikiran / pengalaman saya karena saya juga tidak dapat menemukan pendapat Microsoft tentang hal ini.

Ingat, Asp Identity murni untuk mengidentifikasi seseorang, Anda tidak perlu memiliki E-mail untuk diidentifikasi, tetapi mereka mengizinkan kami untuk menyimpannya karena itu merupakan bagian dari identitas. Saat Anda membuat proyek web baru di studio visual, Anda diberi opsi untuk opsi otentikasi.

Jika Anda memilih jenis proyek yang tidak kosong seperti MVC dan menyetel otentikasi ke "Akun perorangan", Anda akan diberikan dasar-dasar dasar untuk manajemen pengguna. Salah satunya termasuk sub kelas yang terlihat seperti ini dalam 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
}

Hal ini memberitahu kita bahwa Microsoft bermaksud kita untuk menyimpan nama pengguna yang lebih kompleks (lihat AllowOnlyAlphaNumericUserNames = false), jadi sebenarnya kita memiliki sinyal campuran.

Fakta bahwa ini dihasilkan dari proyek web default memberi kita indikasi / arahan yang baik dari Microsoft (dan cara yang bersih) untuk memungkinkan kita memasukkan email untuk bidang nama pengguna. Ini bersih karena metode pembuatan statis digunakan dalam App_Start \ Startup.Auth.cs saat melakukan bootstrap aplikasi dengan konteks Microsoft.OWIN.

Satu-satunya kelemahan dari pendekatan ini adalah Anda akhirnya menyimpan E-mail dua kali .... Yang tidak baik!



0

Jika Anda menggunakan IOC (saya menggunakan StructureMap) di pengontrol akun Anda, Anda perlu menerapkan perbaikan yang disebutkan di atas oleh Hao Kung ketika Usermanager diteruskan: (Saya harus). Mungkin ada cara untuk melakukannya di penyiapan IOC, tetapi saya tidak tahu caranya.

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

0

Saya menghadapi masalah yang sama. tetapi akhirnya saya menyelesaikan masalah dengan menambahkan bagian bawah ke metode saya, bukan konstruktor.

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

                    };         

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.