2010-03-03 5 views
7

반환 사용자 지정 멤버 자격 공급자의 ValidateUser 메서드에서 문자열 메시지를 반환하려면 어떻게해야합니까? 로그인 프로세스가 실패하면 몇 가지 검사 (사용자 승인, 사용자 차단 등)를 수행하고 사용자에게 알기 쉬운 설명을하기 때문에 필요합니다.ASP.NET MVC 2 - 멤버 자격 공급자 - ValidateUser() - 로그인 오류 메시지

하나의 옵션은 예외를 throw하는 것이지만 누군가 이러한 상황을 처리하기위한 적절한 방법이 아니라고 말했습니다.

지금은 bool 반환 유형으로 인해 "로그인 실패"또는 "로그인 성공"이라고 말할 수 있습니다.

내 자체 ValidateUser 메서드를 만들 수 있습니까? 아니면 ASP.NET 멤버십 메커니즘이 내부 작업에서 기본 멤버 함수를 사용합니까?

+1

그것은, 알 무력 암호 공격을 시도하는 사람이 중지에 수행하고 잠재적으로 올바른 암호를 제시하기보다는 기다리는 웹 기반 응용 프로그램에 대한 잠금 아웃을보고 좋은 생각이 아니다 잠긴 계정이므로 액세스 할 수 없습니다. 너를위한 생각. – Lazarus

+0

힌트 나사로를 주셔서 감사합니다. – Cosmo

+2

이것은 MembershipProvider의 부족한 부분입니다. ValidateUser()는 bool 만 반환하고 BAD 옵션을 남깁니다. 1) 추가 정보 (오버 헤드)에 대한 DB 쿼리, 2) 메서드 추가 및 공급자 독립 (독립 깨뜨림) 또는 3) 대역 외 쿠키 작업. MS가 공급자를 업데이트해야합니다. ValidateUser가 최소한 반환되면 CreateUser()가 MembershipCreateStatus 열거 형을 반환하는 것처럼 AuthenticationStatuts를 열거다면 멋질 것입니다. MemberhipCreateStatus enum조차도 제한되어 있으므로 (http://forums.asp.net/t/1521981.aspx) 조금 더보고 싶습니다. – EBarr

답변

2

두 가지 작업이 있습니다.

등, 반환 된 사용자의 속성을 사용자가 등 잠겨 승인되어 있는지 ( GetUser() 포함) 사용자를 검색하고 IsApproved, IsLockedOut에서 찾으십시오. ValidateUser()은 로그인 전용이지만 둘 다 할 수 있습니다.

+0

고마워요 크레이그. 따라서 사용자 (사용자 이름, 암호)의 유효성을 먼저 확인한 다음 해당 레코드가 존재하면 사용자가 잠겨 있거나 승인되었는지 확인한 다음 인증 쿠키를 설정해야합니까? 내가 맞습니까? 두 번째 질문입니다. 사용자 지정 RegUser 개체 (MembershipUser 아님)를 사용하고 있습니다. 내 사용자 지정 특성을 검사하기 위해 GetRegUser와 같은 멤버 자격 공급자에 별도의 메서드를 만들어야합니까? – Cosmo

+0

대체 할 것이 아니라 하위 형식의 'MembershipUser'라고 생각합니다.하지만,하기 전에 note (1) 이미 응용 프로그램 별 데이터를위한 속성이 있습니다. http://msdn.microsoft.com/en-us/library/ system.web.security.membershipuser.comment.aspx 및 (2) 앱 사용자 정보는 회원 사용자보다 IIdentity에 더 적합합니다. 회원 자격 사용자는 실제로 들어올 수 있는지 여부를 말합니다. IIdentity는 당신이 누구인지를 말합니다 * –

+0

아, 그리고 이것은 분명합니다. 그러나 로그인에 실패하면 사용자를 찾아보아야합니다. 성공하면 승인을 받아야하며 잠길 수 없습니다. –

0

사용자가 직접 메커니즘을 만들어야합니다. 이는 기본적으로 발생하지 않으며 기본 제공 멤버 자격 공급자로 수행 할 수 없습니다. 당신은 그 공급자를 감싸고이 방법을 추가하고 그것을 스스로 할 수 있습니다 ... 그것이 옵션입니다. 그러나 로그인 컨트롤을 사용하고 있다면이 기능은 로그인 컨트롤과 함께 작동하지 않습니다.

+0

Brian, 로그인 컨트롤을 사용하지 않았습니다. 아마도 그것이 옵션 일 것입니다. – Cosmo

2

당신은 사용자 지정 공급자에 당신이 원하는 어떤 방법을 구현할 수 있으며, 귀하의 경우는 메이크업 감각을 사용하기 전에 유형 그래서 그냥 캐스팅 회원 가입을 할 수 있습니다.

그러나 단순한 대역 외 정보를 얻기 위해 인터페이스를 중단하면 나중에 당신을 물어 듭니다. 이를 수행하고 공급자 API를 보존하고 향후 옵션을 계속 열 수있는 다른 방법이 있습니다.

과거에는 공급자로부터 소비자에게 대역 외 정보를 전달하기 위해 쿠키를 사용했습니다.

HttpContext.Current는 공급자와 동일하므로 공급자의 쿠키 집합을 소비자가 읽을 수 있습니다.

귀하의 제공자에게 전화 한 후 쿠키를 제거하십시오. 임시 쿠키를 만들면 실수를 최소화 할 수 있지만 컬렉션에서 제거하면됩니다.

다음은 작동하는 예제입니다.

CookieChannelMembershipProvider

using System; 
using System.Web; 
using System.Web.Security; 

namespace CookieChannel 
{ 
    public class CookieChannelMembershipProvider : MembershipProvider 
    { 
     public override bool ValidateUser(string username, string password) 
     { 
      if(username=="asshat") 
      { 
       HttpContext.Current.Request.Cookies.Add(new HttpCookie("__cookiechannel", "user is an asshat. do not let him in.")); 
       return false; 
      } 
      return true; 
     } 

     #region Not implemented 

     public override bool EnablePasswordRetrieval 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool EnablePasswordReset 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool RequiresQuestionAndAnswer 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override string ApplicationName 
     { 
      get { throw new NotImplementedException(); } 
      set { throw new NotImplementedException(); } 
     } 

     public override int MaxInvalidPasswordAttempts 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override int PasswordAttemptWindow 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool RequiresUniqueEmail 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override MembershipPasswordFormat PasswordFormat 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override int MinRequiredPasswordLength 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override int MinRequiredNonAlphanumericCharacters 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override string PasswordStrengthRegularExpression 
     { 
      get { throw new NotImplementedException(); } 
     } 


     public override MembershipUser CreateUser(string username, string password, string email, 
                string passwordQuestion, string passwordAnswer, bool isApproved, 
                object providerUserKey, out MembershipCreateStatus status) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool ChangePasswordQuestionAndAnswer(string username, string password, 
                  string newPasswordQuestion, string newPasswordAnswer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override string GetPassword(string username, string answer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool ChangePassword(string username, string oldPassword, string newPassword) 
     { 
      throw new NotImplementedException(); 
     } 

     public override string ResetPassword(string username, string answer) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void UpdateUser(MembershipUser user) 
     { 
      throw new NotImplementedException(); 
     } 


     public override bool UnlockUser(string userName) 
     { 
      throw new NotImplementedException(); 
     } 

     public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) 
     { 
      throw new NotImplementedException(); 
     } 

     public override MembershipUser GetUser(string username, bool userIsOnline) 
     { 
      throw new NotImplementedException(); 
     } 

     public override string GetUserNameByEmail(string email) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool DeleteUser(string username, bool deleteAllRelatedData) 
     { 
      throw new NotImplementedException(); 
     } 

     public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) 
     { 
      throw new NotImplementedException(); 
     } 

     public override int GetNumberOfUsersOnline() 
     { 
      throw new NotImplementedException(); 
     } 

     public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, 
                   out int totalRecords) 
     { 
      throw new NotImplementedException(); 
     } 

     public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, 
                    out int totalRecords) 
     { 
      throw new NotImplementedException(); 
     } 
     #endregion 
    } 
} 

의 Web.config

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true"/> 
    <authentication mode="Windows" /> 
    <membership defaultProvider="cookieChannelProvider" userIsOnlineTimeWindow="15"> 
     <providers> 
     <add 
      name="cookieChannelProvider" 
      type="CookieChannel.CookieChannelMembershipProvider, CookieChannel" 
      connectionStringName="none" 
      enablePasswordRetrieval="true" 
      enablePasswordReset="true" 
      requiresQuestionAndAnswer="true" 
      /> 
     </providers> 
    </membership> 
    </system.web> 
</configuration> 

기본.영문

<%@ Page Language="C#" %> 
<script runat="server"> 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     ValidateUser("user", "user"); 
    } 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     ValidateUser("asshat", "asshat"); 
    } 

    private void ValidateUser(string username, string password) 
    { 
     bool validated = Membership.ValidateUser(username, password); 
     string message = validated.ToString(); 

     if (Request.Cookies["__cookiechannel"] != null) 
     { 
      message += ":" + Request.Cookies["__cookiechannel"].Value; 
      Request.Cookies.Remove("__cookiechannel"); 
     } 
     Label1.Text = message; 
    } 
</script> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" 
      Text="Validate Valued User" /> 
     <asp:Button ID="Button2" runat="server" onclick="Button2_Click" 
      Text="Validate Asshat User" /> 

    </div> 
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
    </form> 
</body> 
</html> 
관련 문제