WebSecurity.Login
in simplemembershipユーザー名とパスワードを取得し、ユーザー名だけでなくユーザー名または電子メールを使用してユーザーをログインさせるにはどうすればよいですか?.
SimpleMembershipProvider
から継承して、このようにValidateUser
メソッドをオーバーライドするだけです。
public class ExtendedSimpleMembershipProvider : SimpleMembershipProvider
{
public override bool ValidateUser(string login, string password)
{
// check to see if the login passed is an email address
if (IsValidEmail(login))
{
string actualUsername = base.GetUserNameByEmail(login);
return base.ValidateUser(actualUsername, password);
}
else
{
return base.ValidateUser(login, password);
}
}
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
}
これは1つの方法にすぎません。独自のMembershipProvider
を作成することもできますが、ValidateUser
メソッドのみを変更する必要がある場合は、これでうまくいくはずです。
次の構成をweb.configに追加して、プロバイダーをセットアップします。
<membership defaultProvider="ExtendedSimpleMembershipProvider">
<providers>
<clear/>
<add name="ExtendedSimpleMembershipProvider"
type="MyProject.Web.SimpleMembershipProvider, MyProject.Web"/>
</providers>
</membership>
これで正しい方向に進むはずです。
WebSecurityは内部でFormsAuthentication
を呼び出すだけです。あなたはこれを行うことができます:
if (WebSecurity.UserExists(username))
{
FormsAuthentication.SetAuthCookie(username, false);
}
この機能が必要な理由に興味があります。 (参考:これが必要な理由は、エクスプレスチェックアウト(ショッピングカート)フローでユーザーがPaypalで認証されている場合、同じユーザーとして自分のサイトに自動ログインできるようにすることです。適切な人物ではありません)。
役に立つかもしれません: FormsAuthenticationとWebSecurityの違い
あなたはUserProfilesテーブルから特定のメールでユーザーをプルすることができます
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
var login = false;
if (ModelState.IsValid)
{
if (!model.UserName.Contains("@"))
{
if (WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
login = true;
}
else
{
var targetUser = db.UserProfiles.Where(u => u.Email == model.UserName).FirstOrDefault();
if (targetUser != null && WebSecurity.Login(targetUser.UserName, model.Password, persistCookie: model.RememberMe))
login = true;
}
}
if (login)
return Redirect(returnUrl);
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
ユーザーの識別に電子メールを使用しないでください。推測するのは非常に簡単です。今日では、ツールを使用して推測することができます。そのため、ユーザー名が使用されますが、それは何でもかまいません。
そうは言っても、本当にしたい場合-ユーザー名/メール+パスワードが配置されているテーブルのIDを使用して、最初にユーザー名と照合し、失敗した場合はメールと照合できます。両方が失敗すると、ログインは失敗します。
ここに何も投稿しなかったので、これをチェックコードに使用しても問題はありません。必要なものを確認するために変更することはできません。
WebSecurity.GetUserId(email);
MVCに関する次の質問については、ASPフォーラムを最初に確認してから、ここで試してください。単なる意見です。