web-dev-qa-db-ja.com

Asp.net mvc5のIDにメールではなくユーザー名を使用します

Visual Studio 2013 Express for Webで新しいアプリケーションを作成し、個別のアカウント認証を使用して、登録ボタンを押すたびに、「ユーザー名」の代わりに「電子メール」を実装し、それがLoginViewModelにあることを確認しますユーザー名の代わりにサインインします。問題なくデフォルトのメールの代わりにユーザー名を使用するようにこれを変更するにはどうすればよいですか?また、文字列型であるデフォルトの「guid」を「id」(整数型)に変換する方法を知りたいです。

34
ibnhamza

受け入れられた回答のリンクされた質問は、UserNameの代わりにEmailを使用する方法を説明しています。OPは、MVCプロジェクトのIdentity 2.0で探していたEメールの代わりにUserNameを望んでいました。

他の誰かがGoogle検索からここに来た場合、実際にこれを行うのは非常に簡単です。登録投稿アクションを見ると、UserNameを電子メールアドレスに設定しているだけです。そう.........

UserNameをRegisterViewModelに追加し、それを登録ビューに追加します。

<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", @placeholder = "Username or email" })
        </div>
</div>

AccountControllerの登録投稿アクションで、UserNameをViewModelのUserNameに設定し、EメールをViewModelのメールに設定します。

var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
42
Hoody

電子メールを一意でないものにするには:

IdentityConfigで以下を設定します

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = false                
            };
22
sasi kumar

これを見てください thread

スレッドの詳細:

仮定:

  1. ユーザー名はユーザーごとに一意です。ユーザーが入力するか、登録時にアプリケーションが生成します。
  2. ユーザー名に@記号は使用できません。

EmailAddress注釈を削除し、デフォルトのLoginViewModelで表示テキストを定義します。

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

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

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

ユーザーはUsernameまたはEmailのいずれかを入力できるため、検証条件に@文字を使用します。実装するフローは次のとおりです。

  1. 文字列に@が存在する場合は、Email検証を適用し、そうでない場合はUsername形式検証を適用します。
  2. 有効なEmailの場合、最初にUsernameを取得する必要があります。 Usernameは一意であると見なされるため、userManager.FindByEmailAsync 方法。
  3. Username検証にSignInを使用します。

    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
       ViewData["ReturnUrl"] = returnUrl;
       if (model.Email.IndexOf('@') > -1)
       {
           //Validate email format
           string emailRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                              @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
           Regex re = new Regex(emailRegex);
           if (!re.IsMatch(model.Email))
           {
               ModelState.AddModelError("Email", "Email is not valid");
           }
       }
       else
       {
           //validate Username format
           string emailRegex = @"^[a-zA-Z0-9]*$";
           Regex re = new Regex(emailRegex);
           if (!re.IsMatch(model.Email))
           {
               ModelState.AddModelError("Email", "Username is not valid");
           }
       }
    
       if (ModelState.IsValid)
       {
           var userName = model.Email;
           if (userName.IndexOf('@') > -1)
           {
               var user =  await _userManager.FindByEmailAsync(model.Email);
               if (user == null)
               {
                   ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                   return View(model);
               }
               else
               {
                    userName = user.UserName;
               }
            }
            var result = await _signInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, lockoutOnFailure: false);
    

ビューで変更する特別な必要はありません。アプリケーションを実行し、電子メールまたはユーザー名でログインをテストします。

:このチュートリアルはMVC .Net Identityのデフォルト構造に従うことに注意してください。

0
Faraz Ahmed

このようにユーザー名やパスワードを使用することもできます

var user = await _userManager.Users
       .FirstOrDefaultAsync(u => u.UserName == username || u.Email == username);

if (user != null){
var result = await _signInManager
            .PasswordSignInAsync(user.Email, password, false, false);
}
0
Bellash