2009-12-11 4 views
1

도와주세요!Login.aspx 및 AD 오류 잡기 인증 응답 값

저는 .NET 웹 응용 프로그램 개발에 익숙하지 않습니다. 아래 링크의 코드를 사용하여 Microsoft Live Single Sing On의 기본 로그인 페이지를 만들었습니다.

http://support.microsoft.com/default.aspx/kb/326340

은 내가 SSO 설정에서 IIS에서 (/ 인증 양식 LiveSSO 승) 통합 인증을 해제 함께 ​​두 가지를 결합 할 수 있었다. 사용자가 AD로 성공적으로 인증하면 예상대로 작동합니다. "오류 인증 사용자 : 나는 데

문제는 사용자도 실패한가 인증 할 경우에만 반환됩니다. 로그온 실패 : 알 수없는 사용자 이름 또는 잘못된 암호 ". 이 메시지는 사용자가 다음에 로그온 할 때 암호를 변경하도록 설정되어있을 때도 나타납니다. 내가 그것을하고 싶은 실패한 이유를 정확하게의 에러 코드를 읽는 것입니다 그래서 할 수있는 설정 암호 재설정 페이지 (오류 인 경우 etc.etc "사용자 플래그가 PSWD을 변경하는 설정"예.)

로 리디렉션

위의 페이지에서 LdapAuthentication.vb의 VB 코드를 볼 수 있습니다.이 코드는 계정을 인증하거나 로그인이 실패 할 경우 오류 메시지를 반환하는 트릭입니다.

"오류 인증 사용자"를 반환하는 부분. "(. 오류 인증 사용자"& ex.Message)

  • 종료하십시오 : 로그온 실패. 알 수없는 사용자 이름 또는 잘못된 암호는
  • 새로운 예외를 던져 예외로

    1. 캐치 전이 서브 루틴에 의해 처리됩니다 "

    사용자 메시지 AD 플래그를 기반으로 일반 메시지 대신 특정 코드를 반환 할 수있는 방법을 사용자 지정하려고했습니다.

    아무도 실마리가 없습니까? 어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다!

  • 답변

    0

    나는 당신이 이미 광고가 사용되는 기술을 제공 던질 것입니다 것을 가장 상세한 오류를보고있다 확신 해요. 로그인이 실패

    는 AD 의도적 정확한 이유에 관해서는 조금 모호합니다. 이렇게하면 해커가 로그인 자격 증명의 어느 부분에서 옳고 그른지를 알 수 없으므로 이전 실패에서 수집 한 정보를 기반으로 다음 시도를 조정할 수 없습니다.

    는 당신이하고자하는 일을하려면 응용 프로그램에 대한 서비스 계정 설정을 사용하여 AD에 연결하는 다른 코드가 필요합니다. 이 코드는 사용자가 제공 한 자격 증명을 가져와 해당 사용자에 대한 관련 디렉토리 항목을 찾은 다음 계정 재설정 플래그 등에 대한 정보를 읽어야합니다. 이 작업이, 모든 것이 OK입니다 일단

    , 당신은 다음 실제 로그인 코드를 제어를 전달하고 사용자의 로그인을 시도 할 것입니다. 모든 것이 정상적이지 않으면 사용자를 자신의 자격 증명으로 로그인하지 않고 리디렉션합니다.

    [업데이트] 여기

    는이 같은 일에 대해 갈 "수"방법의 빠른 코드 예제입니다,

    Public Function DoesUserHaveToChangePassword(ByVal userName As String) As Boolean 
    
        Dim ctx As var = New PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain) 
        Dim up As var = UserPrincipal.FindByIdentity(ctx, userName) 
        Return (Not up.LastPasswordSet.HasValue AndAlso Not up.PasswordNeverExpires) 
        'returns true if last password set has no value and the password never expires option is not set. 
    
    End Function 
    

    VB 선택의 나의 모국어가 아닌 그렇게이 내가 C#에서 조롱 한 빠른 예제에서 테스트되지 않은 변환입니다. 이것이 정확하게 그대로 작동한다는 보장은 없습니다.

    사용하려면 System.DirectoryServices.AccountManagement 네임 스페이스를 가져와야합니다.

    이 예제에 표시된 PrincipalContext 생성자는 매우 기본적인 버전이며 웹 응용 프로그램 자체에서 액티브 디렉토리에 필요한 액세스 권한이있는 서비스 계정을 사용하는 경우에만 작동합니다. 그렇지 않은 경우에는 생성자의 오버로드를 살펴보고 PrincipalContext를 작성하는 데 사용 된 도메인 사용자 및 비밀번호 자격 증명을 제공 할 수있는 인스턴스를 사용하십시오.

    여기서 중요한 점은 로그인을 시도하려는 사용자 계정의 LastPasswordSet 값과 PasswordNeverExpires 값을 AD에서 확인하는 것입니다. 이 두 가지가 모두 설정되지 않은 경우 사용자의 계정에 로그인하기 전에 암호를 변경해야합니다.

    그래서 사용자 인증을 시도하기 전에이 함수를 호출하면됩니다. 함수가 true를 반환하면 사용자는 암호를 변경할 때까지 로그인 할 수 없으므로 사용자를 암호 변경 페이지로 리디렉션해야합니다.

    +0

    안녕 스티븐, 답장을 보내 주셔서 감사합니다. 불행히도 그러한 코드를 작성하는 경험이 없습니다. 논리적으로 말이 되네요. 당신이하는 말을 이해하지만 코딩을 어디서 시작해야할지 알 것입니다. 웹에 사용할 수있는 것이 있습니까? 아니면 위의 링크에 제공된 코드에 추가 하시겠습니까? – Vince

    +0

    나는 여기서해야 할 일을 "해야한다"는 기능을 신속하게 목격했다. 그래도 코드를 테스트하지는 않았으므로 약속은하지 않습니다. –

    +0

    굉장! 스티븐 고마워. 나는 VB.net에서 그것을 시도 할 것이고 당신에게 알려 줄 것이다. 그러나 C# 코드가 있다면 나는 C#으로 코딩 된 동일한 페이지를 가지고 있기 때문에 그것을보고 싶어 할 것이다. – Vince

    0

    스티븐,

    마침내 작동하도록했습니다! 고맙습니다! 고맙습니다!

    sub Login_Click(sender as object,e as EventArgs) 
        Dim adPath As String = "LDAP://DC=xzone,DC=com" 'Path to your LDAP directory server 
        Dim adAuth As LdapAuthentication = New LdapAuthentication(adPath) 
        'Dim adUserPwd As DoesUserHaveToChangePassword = New DoesUserHaveToChangePassword(txtUsername.Text) 
        Try 
         If (True = adAuth.DoesUserHaveToChangePassword(txtUsername.Text)) Then 
          Response.Redirect("http://passwordresetpage") 
    
         ElseIf (True = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) Then 
          Dim groups As String = adAuth.GetGroups() 
    

    I :이처럼 포함해야

    Public Function DoesUserHaveToChangePassword(ByVal userName As String) As Boolean 
    
         Dim ctx As PrincipalContext = New PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain) 
         Dim up = UserPrincipal.FindByIdentity(ctx, userName) 
         Return (Not up.LastPasswordSet.HasValue) 
         'returns true if last password set has no value. 
    
        End Function 
    

    을 그런 다음 Login.aspx 페이지 :

    나는 다음과 같이 할 수있는 VB 코드에 몇 가지 변경했습니다 Google 정책에 일반 사용자가 "만료하지 않음"을 허용하지 않아 비밀번호 만료 확인이 삭제되었습니다.

    IIS의 응용 프로그램에서 익명 로그인이 설정되어 있지만 AD 계정 설정이 실행되고 있습니다. 내 테스트에서 도메인 관리자 권한을 가진 계정을 사용했기 때문에 일반 계정을 사용하려고합니다. 보안 팀이 그걸 좋아하지 않을거야 ..

    +0

    우수! 관대 한 느낌이 든다면 평판을 얻을 수 있도록 내 대답을 받아 들일 수 있습니다 :) –