2012-09-13 1 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})(\]?)$"); 
    } 

} 

이것은 하나의 접근 방법입니다. 자신 만의 MembershipProvider을 작성할 수 있지만 ValidateUser 메소드 만 변경해야하는 경우이 방법을 사용해야합니다.

다음 구성을 web.config에 추가하여 공급자를 설정하십시오.

<membership defaultProvider="ExtendedSimpleMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="ExtendedSimpleMembershipProvider" 
     type="MyProject.Web.SimpleMembershipProvider, MyProject.Web"/> 
    </providers> 
    </membership> 

올바른 방향으로 가야합니다.

0

사용자 식별을 위해 전자 메일을 사용하지 마십시오. 짐작할 수있는 것은 매우 쉽습니다. 오늘날 사람들은 도구를 사용하여 짐작할 수 있습니다. 이것이 사용자 이름이 사용 된 이유입니다.

실제로 그렇게하고 싶다면 username/email + password가있는 테이블의 ID를 사용하고 사용자 이름과 먼저 일치시키고 이메일과 일치하지 않는 경우. 둘 다 실패하면 로그인이 실패합니다.

여기에 아무것도 게시하지 않았으므로 수정 코드를 사용하여 문제가 발생하지 않아야합니다. 필요한 항목을 확인하기 위해 수정할 수 없습니다.

WebSecurity.GetUserId(email); 

MVC와 관련된 다음 질문은 먼저 ASP 포럼에서 확인하십시오. 그냥 의견

+2

나는 동의 할 거라고는 쉽게 추측 할 수 있지만 일반 사용자는이를 사용하려고하는 것을 어쨌든 짐작하기 쉬운 것. 데이비드 존스가 있다고 해봅시다. 그는 david.jones, jonesd, djones를 사용할 것입니다. 그러나 그들은 모두 우스꽝스럽게 추측 할 수 있습니다. 그래서 나는 그것이 너무 많은 차이를 만들 것이라고 생각하지 않습니다. – rashleighp

18

WebSecurity 그냥 후드 아래 FormsAuthentication 호출합니다. 이 작업을 수행 할 수 :

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

호기심을이 기능이 필요한 이유. (FYI : 나의 추론은 사용자가 Express Checkout (장바구니) 흐름에서 PayPal을 사용하여 인증 한 경우 해당 사용자가 내 사이트에 자동 로그인 할 수있는 위험성이 매우 낮다고 생각하기 때문입니다 올바른 사람이 아님).

유용 할 수 있습니다 : 당신은 그냥 UserProfiles 테이블에서 주어진 이메일로 사용자를 뽑을 수 Difference between FormsAuthentication and WebSecurity

+0

나는 질문을 오해하고 패스워드없이 *를 의미한다고 생각했다. - 이것이 바로 답이다. :) –

2

[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); 
} 
관련 문제