ユーザー名として電子メールアドレスを許可するように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時間かそこらの構成オプションに関する解決策やドキュメントを探すのに費やしましたが、役に立ちませんでした。

ユーザー名に電子メールアドレスを許可するように構成する方法はありますか?


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

回答:


164

これを許可するには、UserManagerに独自のUserValidatorを接続するか、デフォルトの実装でオフにします。

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

3
カスタムのUserValidatorを作成するにはどうしますか?
teh0wner 2013年

2
コード(ファイル/メソッド)のどこ(デフォルトのmvc5アプリ内)にUserManager.UserValidator = new UserValidator <TUser>(UserManager){AllowOnlyAlphanumericUserNames = false}を配置する必要がありますか?ありがとう。
PussInBoots 2013年

29
AccountControllerのpublic AccountController(UserManager<ApplicationUser> userManager)コンストラクターに追加UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };
LiamGu

1
@graycrow私は、Asp.netメンバーシップがどのように機能し、簡単に使用できたかについて怒鳴り続けています。私はそれをVSからアクセス可能な構成のウェブサイトを使用して楽しんだ。..
マフィンマン

@graycrow asp.net IDの現在の状態を考えると、SqlMembershipプロバイダーの時代に憧れています。より大きな見方については、ASPネットIDのbrockallenを
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を使用して、App_Start \ IdentityConfig.cs内のApplicationUserManagerコンストラクターを次のように更新しました。

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 Webフォームを使用していて、これを実現しようとしている場合は、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クラスのコーディングが機能しなかったため(おそらくMVCではなくRazor Pagesを使用しているため)、別の解決策を次に示します。CofigureServices()のStartup.csで、IDオプションを構成できます。たとえば、

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

最近はユーザー名がメールであることがほとんどなので、これにもこだわりましたが、別のメールフィールドの理由は理解できます。私はこれについてのマイクロソフトの発言も見つからなかったので、これらは純粋に私の考え/経験です。

Asp Identityは純粋に誰かを識別するためのものであり、識別するために電子メールを持っている必要はありませんが、IDの一部を形成しているため、Eメールを保存できます。Visual Studioで新しいWebプロジェクトを作成すると、認証オプションのオプションが提供されます。

MVCなどの空でないプロジェクトタイプを選択し、認証を「個人アカウント」に設定すると、ユーザー管理の基本的な基盤が与えられます。その1つには、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を参照)を格納するつもりであることを示しているため、実際にはさまざまな信号が混在しています。

これがデフォルトのWebプロジェクトから生成されたという事実は、ユーザー名フィールドに電子メールを入力できるようにするためのMicrosoftからの適切な指示/指示(およびクリーンな方法)を提供します。Microsoft.OWINコンテキストでアプリケーションをブートストラップするときに、静的なcreateメソッドがApp_Start \ Startup.Auth.cs内で使用されるため、問題はありません。

このアプローチの唯一の欠点は、電子メールを2回保存してしまうことです。


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


0

アカウントコントローラーで何らかのIOC(StructureMapを使用しています)を使用している場合、Usermanagerが渡されたときに、Hao Kungによる上記の修正を適用する必要があります(必要でした)。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.