2012-09-13 3 views

答えて

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> 

あなたは正しい方向に進むはずです。

0

ユーザー識別に電子メールを使用しないでください。それは推測するのは非常に簡単なことであり、今日、人々はそれらを推測するツールを使用することができました。それがusernameが使われている理由です。それは何でもかまいません。

あなたが本当に欲しいのであれば、ユーザー名/電子メール+パスワードがあるテーブルのIDを使用し、最初にユーザー名と照合し、それが電子メールに一致しない場合は、両方とも失敗すると、ログインは失敗します。

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

MVCに関する次の質問については、まずASPフォーラムをチェックしてからここで試してください。ちょうど意見

+2

を指定したメールをユーザに引き出すことができますとにかく簡単に推測することができます。デビッドジョーンズがいたとします。彼は、david.jones、jonesd、djonesを使うかもしれない。しかし、彼らはすべて馬鹿げて推測できるので、それはあまり差がないとは思わない。 – rashleighp

18

WebSecurityちょうどフードの下でFormsAuthenticationを呼び出します。あなたはこの機能を必要とする理由

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

興味: あなたはこれを行うことができます。 (FYI:これを必要とする理由は、ユーザーがExpress Checkout(ショッピングカート)のフローでPayPalで認証した場合、そのユーザーが自分のサイトに自動的にログインできるようにするということです。正しい人ではない)。

は有用であり得る:Difference between FormsAuthentication and WebSecurity

+0

私は質問を誤解し、あなたがパスワードなしで*を意味していると思っていた* - これが答えです –

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); 
} 
関連する問題