私は新しいアプリケーションを作成中です。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に更新しました。
アプリのローカルユーザーアカウントを作成しようとするまで、これまでに行った作業に対するいくつかのコード変更は別として、すべて順調に進んでいるように見えました。
私は、電子メールアドレスがユーザー名形式で作業していたので、リリース候補ではうまく機能しましたが、ユーザー名の電子メールアドレスを持つユーザーを作成すると、次の検証エラーがスローされます。
User name [email protected] is invalid, can only contain letters or digits.
構成オプションに関するソリューションまたはドキュメントの検索に最後の1時間ほど費やしましたが、役に立ちませんでした。
ユーザー名に電子メールアドレスを許可するように構成する方法はありますか?
これを許可するには、UserManagerで独自のUserValidatorをプラグインするか、デフォルトの実装で単にオフにします。
UserManager.UserValidator = new UserValidator<TUser>(UserManager) { AllowOnlyAlphanumericUserNames = false }
これのC#バージョン(App_Code\IdentityModels.cs内)は
public UserManager()
: base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
{
UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false };
}
私の場合、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 };
}
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
AspNet.Identity.Core 2.1以降のユーザーの場合、UserManagerのこれらのバリデーターは読み取り専用です。ユーザー名としてのメールアドレスはデフォルトで許可されていますが、ユーザー名の文字をさらにカスタマイズする必要がある場合は、Startup.csで次のようにカスタマイズできます。
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+/";
});
// ... etc
}
(レガシーの理由で「/」が必要でした。)
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 =>
私自身のApplicationUserManagerのコーディング:UserManagerクラスは機能しなかったので(おそらくMVCではなくRazor Pagesを使用しています)、ここに別のソリューションがあります:
services.Configure<IdentityOptions>(options =>
{
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@";
options.User.RequireUniqueEmail = true;
});
Microsoftドキュメントのこのトピックの詳細: https://docs.Microsoft.com/de-de/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-2.2
私の場合、認証で動作するリポジトリクラスがありましたが、ユーザー名の中で「-」を使用できませんでした。
//-------------------------------------------------------
public AuthRepository()
//-------------------------------------------------------
{
_ctx = new AuthContext();
_userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(_ctx));
_userManager.UserValidator = new UserValidator<IdentityUser>(_userManager)
{
AllowOnlyAlphanumericUserNames = false
};
}
おそらくお気づきでしょうが(予想されるように)、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
また、最近はほとんどのユーザー名が電子メールであるため、これに固執しましたが、別の電子メールフィールドの理由を理解できます。これらは純粋に私の考え/経験であり、これについてマイクロソフトの発言を見つけることもできませんでした。
Asp Identityは純粋に誰かを識別するためのものであり、Eメールを識別する必要はありませんが、IDの一部を形成しているため、保存することができます。 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.OWINコンテキストでアプリケーションをブートストラップするときに、静的作成メソッドがApp_Start\Startup.Auth.cs内で使用されるため、問題ありません。
このアプローチの唯一の欠点は、電子メールを2回保存することです。これは良くありません!
IdentityConfig.csが見つからない場合は、AccountControllerコンストラクターをこのコードに置き換えます。
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager)
{
AllowOnlyAlphanumericUserNames = false
};
}
アカウントコントローラーでIOCを使用している場合(StructureMapを使用している場合)、Usermanagerが渡されるときにHao Kungで上記の修正を適用する必要があります。 : (そうしなければならなかった)。 IOCの設定でそれを行う方法があるかもしれませんが、私はその方法がわかりません。
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
_userManager.UserValidator = new UserValidator<ApplicationUser>(_userManager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
私は同じ問題に直面しました。しかし最後に、コンストラクタではなくメソッドに以下の部分を追加することで問題を解決しました。
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
};
}