Visual Studio 2013 Express for Webで新しいアプリケーションを作成し、個別のアカウント認証を使用して、登録ボタンを押すたびに、「ユーザー名」の代わりに「電子メール」を実装し、それがLoginViewModelにあることを確認しますユーザー名の代わりにサインインします。問題なくデフォルトのメールの代わりにユーザー名を使用するようにこれを変更するにはどうすればよいですか?また、文字列型であるデフォルトの「guid」を「id」(整数型)に変換する方法を知りたいです。
受け入れられた回答のリンクされた質問は、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 };
電子メールを一意でないものにするには:
IdentityConfigで以下を設定します
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};
これを見てください thread
スレッドの詳細:
仮定:
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
のいずれかを入力できるため、検証条件に@文字を使用します。実装するフローは次のとおりです。
Email
検証を適用し、そうでない場合はUsername
形式検証を適用します。Email
の場合、最初にUsername
を取得する必要があります。 Username
は一意であると見なされるため、userManager.FindByEmailAsync
方法。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のデフォルト構造に従うことに注意してください。
このようにユーザー名やパスワードを使用することもできます
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);
}