web-dev-qa-db-ja.com

ASP.Net UserName to Email

新しいASP.NET Identity(RTM)を使用していて、登録とログインをユーザー名から電子メールに変更するにはどうすればよいのかと思っていました。

ユーザーに自分の電子メールとパスワード(電子メールは外部ログインを使用して取得することもできます)を使用してサインアップしてもらい、上部に表示名/ユーザー名を設定するという考え方です。

IdentityUserを確認したところ、UserNameが存在することがわかりました。これは、変更できないASP.Net Identityにパックされているためです。

カスタムバリデーターを使用して 'UserName'を電子メールとして使用し、ApplicationNameにDisplayNameと呼ばれる追加の属性を設定することもできますが、これは解決策というよりはハックのようなものです。

私の質問が明確であることを望みます。前もって感謝します。

24
teh0wner

本当に電子メールアドレスを使用してログインする場合は、IMHO、提案した「ハック」が最善の方法です。 「適切にやる」と主張するなら、少なくとも

  • データベーススキーマを変更します
  • ユーザー名の一意性を自分で確認します(データベースの制約/インデックスでこれを行うことができますが、エラーに対処してユーザーに報告するための適切な方法を見つける必要があります)。
  • あなたのコードで「User.Identity.UserName」を書くだけの良い代替を見つけてください
  • おそらくさらに

一方、UserNameフィールドを「ハッキング」する場合は、

  • registerViewModelの検証を変更(UserNameプロパティに[EmailAddress]を追加)、おそらく[Display(Name = ...)]をわずかにカスタマイズ.
  • accountControllerで使用されるUserManager.UserValidatorインスタンスが、電子メールアドレスで使用される特殊文字を許可することを確認してください。これを行うには、デフォルト以外のコンストラクタが次のようになっていることを確認します。

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

これが両方のアプローチの長所と短所を比較検討し、最良の解決策を考え出すのに役立つことを願っています。幸運を!

23
rootless

パーティーには少し遅れましたが、私は$ 0.02を投入すると思いました。

UserNameEmailはどちらもIdentityUserの一部であり必須であることは事実ですが、どちらもvirtualとマークされていることに注意してください。 UserNameEmailをメールアドレスにしたい場合は、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]属性でビューモデルプロパティを装飾するようにします。

他の人が述べたように、AllowOnlyAlphanumericUserNamesfalseUserManagerUserValidatorに設定されていることを確認する必要がありますが、私はVS2013の最新のWebテンプレートをそのまま使用します。

9
joelmdev

私は現在、メールに切り替えてアカウントの確認/パスワードを忘れた機能を追加するIdentity 1.1テンプレートのこの機能に取り組んでいます。検討した2つのオプションは、ハッキング(ユーザー名をメールで検証として使用)と追加のメールフィールドを追加することでした。これは、私たちが傾いているユーザー名とは別のものです。

UserManagerに1.1で追加されたいくつかの電子メール固有のAPIが存在する可能性があります。

FindByEmail
SetEmail
GetEmail
6
Hao Kung

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};
    }
}
5
avalla

おそらくお気づきのように(そして予想されるはずでした)、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

3
Vincent Sels

同様の問題に取り組みながら、最も簡単な解決策は、ユーザー名の入力に「メール」というラベルを付け、onCreating中にメンバーシップのメールを手動で設定することです。

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e){
    RegisterUser.Email = RegisterUser.UserName;            
}
1
atjoedonahue

私はこれを機能させます。

まず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>

それで十分です。この方法で、電子メールアドレスではなく、ユーザー名でログインできます。

0
Rogerio Picilli