新しいASP.NET Identity(RTM)を使用していて、登録とログインをユーザー名から電子メールに変更するにはどうすればよいのかと思っていました。
ユーザーに自分の電子メールとパスワード(電子メールは外部ログインを使用して取得することもできます)を使用してサインアップしてもらい、上部に表示名/ユーザー名を設定するという考え方です。
IdentityUserを確認したところ、UserNameが存在することがわかりました。これは、変更できないASP.Net Identityにパックされているためです。
カスタムバリデーターを使用して 'UserName'を電子メールとして使用し、ApplicationNameにDisplayNameと呼ばれる追加の属性を設定することもできますが、これは解決策というよりはハックのようなものです。
私の質問が明確であることを望みます。前もって感謝します。
本当に電子メールアドレスを使用してログインする場合は、IMHO、提案した「ハック」が最善の方法です。 「適切にやる」と主張するなら、少なくとも
一方、UserNameフィールドを「ハッキング」する場合は、
accountControllerで使用されるUserManager.UserValidatorインスタンスが、電子メールアドレスで使用される特殊文字を許可することを確認してください。これを行うには、デフォルト以外のコンストラクタが次のようになっていることを確認します。
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
var userValidator = UserManager.UserValidator as UserValidator<ApplicationUser>;
userValidator.AllowOnlyAlphanumericUserNames = false;
}
これが両方のアプローチの長所と短所を比較検討し、最良の解決策を考え出すのに役立つことを願っています。幸運を!
パーティーには少し遅れましたが、私は$ 0.02を投入すると思いました。
UserName
とEmail
はどちらもIdentityUser
の一部であり必須であることは事実ですが、どちらもvirtual
とマークされていることに注意してください。 UserName
とEmail
をメールアドレスにしたい場合は、ApplicationUserモデルに次のようなロジックをカプセル化させます。
public class ApplicationUser : IdentityUser
{
private string _userNameEmailBackingField;
public override string UserName
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
public override string Email
{
get { return _userNameEmailBackingField; }
set { _userNameEmailBackingField = value; }
}
//The rest of your ApplicationUser logic
}
次に、ビューモデルで単一のプロパティのみを公開し、それをApplicationUser
インスタンスにマッピングして、[Required]
および[EmailAddress]
属性でビューモデルプロパティを装飾するようにします。
他の人が述べたように、AllowOnlyAlphanumericUserNames
のfalse
のUserManager
がUserValidator
に設定されていることを確認する必要がありますが、私はVS2013の最新のWebテンプレートをそのまま使用します。
私は現在、メールに切り替えてアカウントの確認/パスワードを忘れた機能を追加するIdentity 1.1テンプレートのこの機能に取り組んでいます。検討した2つのオプションは、ハッキング(ユーザー名をメールで検証として使用)と追加のメールフィールドを追加することでした。これは、私たちが傾いているユーザー名とは別のものです。
UserManagerに1.1で追加されたいくつかの電子メール固有のAPIが存在する可能性があります。
FindByEmail
SetEmail
GetEmail
UserManagerオブジェクトのUserValidatorプロパティを変更します。
public class UserManager : UserManager<User>
{
public IUserStore<User> Users { get; private set; }
public UserManager(IUserStore<User> store) : base(store)
{
Users = store;
UserValidator = new UserValidator<User>(this) {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
同様の問題に取り組みながら、最も簡単な解決策は、ユーザー名の入力に「メール」というラベルを付け、onCreating中にメンバーシップのメールを手動で設定することです。
protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
RegisterUser.Email = RegisterUser.UserName;
}
私はこれを機能させます。
まずaccountViewModelsに移動し、UserNameのプロパティを追加します
Public Class RegisterViewModel
<Required>
<Display(Name:="User Name")>
Public Property UserName As String
<Required>
<EmailAddress>
<Display(Name:="Email")>
Public Property Email As String
ユーザー名プロパティを追加して登録ビューを変更した後
<div class="form-group">
@Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Email, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
</div>
</div>
これが完了したら、ログインビューも変更します
@Html.ValidationSummary(True, "", New With {.class = "text-danger"})
<div class="form-group">
@Html.Label("User Name", New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.Email, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Email, "", New With {.class = "text-danger"})
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Password, "", New With {.class = "text-danger"})
</div>
</div>
それで十分です。この方法で、電子メールアドレスではなく、ユーザー名でログインできます。