Kullanıcı adı olarak e-posta adresine izin vermek için Microsoft.AspNet.Identity'yi yapılandırın


121

Yeni bir uygulama oluşturma sürecindeyim ve EF6-rc1, Microsoft.AspNet.Identity.Core 1.0.0-rc1, Microsoft.AspNet.Identity.EntityFramework 1.0.0-rc1, Microsoft.AspNet.Identity kullanarak başladım. .Owin 1.0.0-rc1, vb ve dün RTM sürümleriyle birlikte, bu akşam NuGet aracılığıyla bunları RTM'ye güncelledim.

Şimdiye kadar yaptığım işteki birkaç kod değişikliğinin yanı sıra, uygulama için yerel bir kullanıcı hesabı oluşturmaya çalışana kadar her şey yolunda gidiyor gibiydi.

Sürüm adayıyla harika çalışan kullanıcı adı formatı olan e-posta adresleri üzerinde çalışıyordum, ancak şimdi bir kullanıcı adı için bir e-posta adresine sahip bir kullanıcı oluştururken aşağıdaki doğrulama hatasını veriyor:

Kullanıcı adı xxxxx@xxxx.com geçersiz, sadece harf veya rakam içerebilir.

Son bir saatini bunun için yapılandırma seçenekleriyle ilgili bir çözüm veya dokümantasyon arayarak geçirdim, ancak boşuna.

Kullanıcı adları için e-posta adreslerine izin verecek şekilde yapılandırmamın bir yolu var mı?


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

Yanıtlar:


164

Buna, UserManager'da kendi UserValidator'ınızı takarak veya sadece varsayılan uygulamada kapatarak izin verebilirsiniz:

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

3
Özel bir UserValidator oluşturmaya nasıl devam edersiniz?
teh0wner

2
UserManager.UserValidator = new UserValidator <TUser> (UserManager) {AllowOnlyAlphanumericUserNames = false} kodun tam olarak neresine (hangi dosya / yöntemde) (varsayılan bir mvc5 uygulamasında) koymalıyım? Teşekkürler.
PussInBoots

29
AccountController'ınızda, public AccountController(UserManager<ApplicationUser> userManager)UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
yapıcıya

1
@graycrow Asp.net üyeliğinin nasıl çalıştığını ve kullanımının kolay olduğunu söyleyip duruyorum. Bunun için VS'den erişilebilen yapılandırma web sitesini kullanmaktan keyif aldım ..
The Muffin Man

@graycrow Asp.net kimliğinin mevcut durumu göz önüne alındığında SqlMembership Provider günlerini özlüyorum. Daha geniş bir perspektif için bkz: asp net kimliği üzerine
brockallen

16

Bunun C # sürümü (App_Code \ IdentityModels.cs içinde)

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

9

Benim durumumda, VS 2013 C #, MVC 5.2.2'de ASP.NET Identity 2.0 kullanarak çalışan çözüm, App_Start \ IdentityConfig.cs içindeki ApplicationUserManager yapıcısını şu şekilde güncellemekti:

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

5

Aynı sorunu yaşadım, UserName'in kişinin gerçek adı olmasını sağlamak için kodu değiştirmeye çalıştığımda sistem bana aynı hata mesajını gösteriyor "ABC DEF kullanıcı adı geçersiz, sadece harf veya rakam içerebilir ." İzin verilen KullanıcıAdı Karakterlerine boşluk karakterini (benim durumumda) ekleyerek sorunu çözdüm.

Asp.Net Core 2.2 ve VS2017 kullanıyorum

Bu benim kodum

Startup.cs adresine gidin ve "// kullanıcı ayarları" altındaki satırı düzenleyin veya ekleyin:

        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 formlarını kullanıyorsanız ve bunu gerçekleştirmeye çalışıyorsanız, IdentityModels.vb / cs dosyanızı açın ve Public Class UserManager altında şu şekilde görünmesini sağlayın:

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 ve üstündeki kişiler için, UserManager'daki bu doğrulayıcılar salt okunurdur. Kullanıcı adı olarak e-posta adreslerine varsayılan olarak izin verilir, ancak kullanıcı adlarınızdaki karakterlerin daha fazla özelleştirilmesine ihtiyacınız varsa, bunu Startup.cs'de şu şekilde yapabilirsiniz:

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

    // ... etc
}

(Eski nedenlerden dolayı "/" ye ihtiyacım vardı.)


1

Kendi ApplicationUserManager: UserManager sınıfımı kodladığımdan beri (belki de MVC değil Razor Pages kullanıyorum), işte başka bir çözüm: CofigureServices () içindeki Startup.cs'de Kimlik Seçeneklerini yapılandırabilirsiniz, örneğin:

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

Microsoft docs'ta bu konu hakkında daha fazla bilgi: https://docs.microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2


0

IdentityConfig.cs'yi bulamazsanız, AccountController kurucunuzu bu kodla değiştirin.

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

0

Benim durumumda, kimlik doğrulamayla çalışan ve kullanıcı adları içinde "-" kullanmama izin vermeyen bir depo sınıfım vardı .. Düzeltme burada kurucunun içindeydi:

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

0

Ben de buna sıkışıp kaldım çünkü bu günlerde çoğu zaman kullanıcı adları E-postalardan oluşuyor, yine de ayrı bir E-posta alanının nedenini anlayabiliyorum. Bunlar tamamen benim düşüncelerim / deneyimlerim, çünkü Microsoft'un bu konuda söylediklerini de bulamadım.

Unutmayın, Asp Identity yalnızca birini tanımlamak içindir, tanımlanacak bir E-postanız olması gerekmez, ancak bir kimliğin bir parçasını oluşturduğu için saklamamıza izin verir. Visual Studio'da yeni bir web projesi oluşturduğunuzda, kimlik doğrulama seçenekleri için bir seçenek sunulur.

MVC gibi boş olmayan bir proje türü seçerseniz ve kimlik doğrulamasını "Bireysel hesaplar" olarak ayarlarsanız, bu durumda size kullanıcı yönetimi için temel temeller verilir. Bunlardan biri, App_Start \ IdentityConfig.cs içinde buna benzer bir alt sınıf içerir:

 // 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
}

Bunun bize söylediği şey, Microsoft'un bizi daha karmaşık kullanıcı adlarını depolamaya niyetli olduğudur (bkz. AllowOnlyAlphaNumericUserNames = false), bu yüzden gerçekten karışık sinyaller aldık.

Bunun varsayılan bir web projesinden üretilmesi gerçeği, bize Microsoft'tan (ve temiz bir yol) kullanıcı adı alanı için E-postalar girmemizi sağlamak için iyi bir gösterge / yön sağlar. Temiz çünkü statik oluşturma yöntemi, uygulama Microsoft.OWIN bağlamıyla önyüklenirken App_Start \ Startup.Auth.cs içinde kullanılır.

Bu yaklaşımın tek olumsuz tarafı, E-postayı iki kez depolamanızdır .... Bu iyi değil!



0

Hesap denetleyicinizde bir tür IOC kullanıyorsanız (Yapı Haritası kullanıyorum) , Usermanager'a geçildiğinde yukarıda Hao Kung tarafından belirtilen düzeltmeyi uygulamanız gerekir : (mecburdum). IOC kurulumunda bunu yapmanın bir yolu olabilir, ancak nasıl yapılacağını bilmiyorum.

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

0

Ben de aynı problemle karşılaştım. ama nihayet kurucuya değil yöntemime aşağıdaki kısmı ekleyerek sorunu çözdüm.

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

                    };         

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.