20

WebSecurity.Loginシンプルメンバーシップでは、ユーザー名とパスワードを使用します。ユーザー名だけでなくユーザー名または電子メールを使用してユーザーをログインさせるにはどうすればよいですか?、ユーザーが電子メールまたはユーザー名を自由に入力してログインできるようにします。

4

4 に答える 4

27

から継承して、このようにメソッドを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>

それはあなたを正しい方向に導くはずです。

于 2012-09-20T19:05:43.633 に答える
18

WebSecurity は内部で呼び出すだけFormsAuthenticationです。あなたはこれを行うことができます:

if (WebSecurity.UserExists(username)) 
{
     FormsAuthentication.SetAuthCookie(username, false);
}

なぜこの機能が必要なのか不思議です。(FYI: これが必要な理由は、ユーザーがエクスプレス チェックアウト (ショッピング カート) フローで PayPal で認証された場合、リスクが非常に低いと考えているため、同じユーザーとして自分のサイトに自動ログインできるようにするためです。適切な人ではありません)。

役に立つかもしれません: FormsAuthentication と WebSecurity の違い

于 2013-02-21T11:13:40.530 に答える
2

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);
}
于 2013-10-07T08:07:20.117 に答える
0

ユーザーの識別に電子メールを使用しないでください。推測するのは非常に簡単なことであり、今日ではツールを使用して推測することができます。ユーザー名が使用されるのはそのためです。

そうは言っても、本当に必要な場合は、ユーザー名/電子メール + パスワードが配置されているテーブルの ID を使用して、最初にそれをユーザー名に一致させ、それが失敗した場合は電子メールに一致させることができます。両方が失敗すると、ログインは失敗します。

ここに何も投稿していないので、以下をチェックコードに使用しても問題はありません。必要なものを確認するために変更することはできません。

WebSecurity.GetUserId(email);

MVC に関する次の質問については、最初に ASP フォーラムを確認してから、こちらを試してください。ただの意見

于 2012-09-23T13:04:34.387 に答える