24

私は新しい ASP.NET Identity (RTM) を使用していますが、登録とログインを UserName から Email に変更するにはどうすればよいか考えていました。

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

私は IdentityUser を見てきましたが、UserName がそこにあることがわかりますが、それは変更できない ASP.Net Identity にパックされているためです。

カスタムバリデーターを使用して「UserName」を電子メールとして使用し、ApplicationUser に DisplayName という追加の属性を追加できることはわかっていますが、これは解決策というよりもハックです。

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

4

7 に答える 7

23

本当に電子メールアドレスを使用してログインしたい場合は、私見ですが、あなたが提案した「ハック」が最善の方法です。なぜなら、「ちゃんとやる」と言い張るなら、少なくとも

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

一方、 UserName フィールドを「ハック」することにした場合は、次のことを行う必要があります。

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

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

これが、両方のアプローチの長所と短所を比較検討し、最適なソリューションを考え出すのに役立つことを願っています. 幸運を!

于 2013-10-21T12:21:24.337 に答える
10

パーティーには少し遅れましたが、0.02 ドルを投入しようと思いました。

UserNameEmailが両方とも の一部であり、したがって必須であることは事実ですIdentityUserが、どちらも としてマークされていることに注意してくださいvirtualUserNameメールアドレスになりたい場合は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ていることを確認する必要がありますが、VS2013 の最新の Web テンプレートを使用してすぐに使用できます。UserManagerUserValidator

于 2014-12-02T18:57:44.873 に答える
6

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

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

FindByEmail
SetEmail
GetEmail
于 2013-10-21T21:36:05.427 に答える
3

お気づきかもしれませんが (そして当然のことでした)、2014 年 3 月にリリースされた ASP.NET Identity 2.0.0 では、フレームワークにこの機能が追加されています。

お知らせ: http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announce-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

于 2014-06-17T07:58:09.243 に答える
0

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

最初に 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>

必要なのはそれだけです。このようにして、メールアドレスではなく UserName でログインできます。

于 2015-04-10T17:22:23.077 に答える