ASP.NET MVCのデフォルトのログインページを変更して、電子メールアドレスではなくユーザー名でログインするにはどうすればよいですか?

user4905335

私は私の調査を検討します、そしてうまくいけばあなたたちは私が次に何をすべきかについての考えを理解することができます。

ログインに関連するM、V、Cは次のようになります。

public class LoginViewModel
{
    [Required]
    [Display(Name = "Email")]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

そして

        @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group" style="margin-bottom: 40px;">
                <div class="col-md-10">
                    <div class="checkbox">
                        @Html.CheckBoxFor(m => m.RememberMe)
                        @Html.LabelFor(m => m.RememberMe)
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-10">
                    <input type="submit" value="Log in" class="btn btn-default" style="padding-left: 40px; padding-right: 40px;" />
                </div>
            </div>

        }

そして

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

私がやろうとしているのは、単にメールアドレスではなくユーザー名でログインすることです。ユーザー名に関連するMVCテンプレートのソースコードには何も見つかりませんがAspNetUsers、テンプレートテーブルを調べたところ、実際にUserNameという列があることがわかりました秘訣は、MVCテンプレートの他の場所で副作用を発生させることなく、上記のソースコードを変更して必要な処理を実行することです。

Mをに変更しました

public class LoginViewModel
{

    [Required]
    [Display(Name = "UserName")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

とVから

        @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
        {
            @Html.AntiForgeryToken()
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group">
                @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
                <div class="col-md-10">
                    @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
                    @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="form-group" style="margin-bottom: 40px;">
                <div class="col-md-10">
                    <div class="checkbox">
                        @Html.CheckBoxFor(m => m.RememberMe)
                        @Html.LabelFor(m => m.RememberMe)
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-10">
                    <input type="submit" value="Log in" class="btn btn-default" style="padding-left: 40px; padding-right: 40px;" />
                </div>
            </div>

        }

Cのものの変更は私が立ち往生しているものです。私は変えるようなことをすることができることを知っています

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

var email = pingDatabaseAndGetEmailFromUsername(model.UserName);
var result = await SignInManager.PasswordSignInAsync(email, model.Password, model.RememberMe, shouldLockout: false);

しかし、もっと良い方法が必要ですよね?

また、LoginViewModelMVCテンプレート内の他のコードがそれを使用し、Emailフィールドがあることを期待している可能性があるため、変更によって他のものを台無しにした可能性があります。

それで、私は実際にここで何をすべきですか?最も簡単な変更が必要です。

変更する必要がある場合PasswordSignInAsync、実装はどこにありますか?見つかりません。

jmoerdyk

デフォルトのテンプレート実装では、ユーザー名としてメールアドレスが使用されます。model.Emailそのため、PasswordSignInAsync関数に値が送信さます。あなたは、別のユーザー・アカウント作成と仮定EmailしてUserNameの値を、それがする方法で符号を変えるような単純なようでなければなりません。

var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

繰り返しますが、これは、ユーザーアカウントが個別の値で作成されていることを前提UserNameとしていEmailます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ