2009-09-09 9 views
25

도메인 UserId 및 Password를 사용하여 사용자를 인증 할 수 있지만 기본 ASP.Net MVC 응용 프로그램은 사용자가 userId 및 암호를 등록한 다음 로그인 할 수있게합니다. 내가 할 수 있을까?ASP.Net MVC의 LDAP 인증

나는 사용자가 등록을 원하지 않는다. 그러나 그는 Windows 도메인 userId 및 암호를 입력하고 도메인 서버가 인증 할 수 있어야합니다.

내가 본 솔루션 (예 : here on Mike's Blog)은 사용자가 자신의 UserId 또는 암호를 입력 할 필요가 없습니다.

양식을 로그온하고 Windows 도메인에 대해 사용자를 인증하도록 ASP.Net MVC 응용 프로그램을 어떻게 얻을 수 있습니까?

가능한 경우 샘플을 사용하십시오.

답변

18

이것은 웹 양식 인증에서 수행하는 방법이므로 MVC에 맞게 조정해야 할 수도 있습니다. asp.net 멤버십 및 역할 엔진을 사용하십시오. Active Directory 멤버 자격 공급자를 사용하도록 공급자를 설정하고 인증을 위해 폼을 사용합니다.

<authentication mode="Forms"> 
    <forms name=".ADAuthCookie" 
     timeout="10"      
     loginUrl="Login.aspx" 
     defaultUrl="Default.aspx">    
    </forms> 

또는 같은 ....

공급자 설정이 같은 것을 볼 것이다 :

<membership defaultProvider="DomainLoginMembershipProvider"> 
    <providers> 
    <add name="DomainLoginMembershipProvider"   
      type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"   
     connectionStringName="ADConnectionString" 
     connectionProtection="Secure" 
     connectionUsername="domainuser" 
     connectionPassword="pwd" 
     attributeMapUsername="sAMAccountName" 
     enableSearchMethods="false"/> 
    </providers> 
</membership> 

연결 보호, 사용자 이름과 비밀번호가이 액세스 권한이있는 계정됩니다 시스템을 대신하여 AD를 쿼리합니다. 네트워크 보안에 따라 설정이 필요하거나 사용자를 인증하기 위해 AD를 쿼리 할 수 ​​없습니다. 당신이 당신의 환경에 맞게 조회 할 수 있습니다 많은 형태를 취할 수

<connectionStrings> 
    <add name="ADConnectionString" 
     connectionString="LDAP://servername:port#/DC=domainname"/> 
</connectionStrings> 

연결 문자열 :

연결 문자열은 같을 것입니다. 당신이 인증 방법 및 테스트를 실행해야 할 수도 있습니다 로그인 페이지에 대한

...

e.Authenticated = Membership.ValidateUser(username, password); 
    if (e.Authenticated == false)... 
스티븐 Shackow의 책 "전문 ASP.Net 2.0 보안, 회원 및 역할 관리는"좋은 보험에가

AD 회원제 사용 (12 장). MVC 컨텍스트가 아니지만 구성 및 설정이 동일합니다.

+0

참고 : 당신은 추가해야 할 수 있습니다 마스터를 오버라이드 (override)하기 위해서 「」를 「」에 격납합니다. – Keith

+0

안녕하세요, MVC5에서 구현되는 방법에 대한 아이디어가 있습니다. 감사합니다 – Vivekh

+0

MVC는 AD 회원 공급자도 사용할 수 있습니다. 위의 web.config 및 연결 문자열 정보는 동일하거나 근접해야합니다. – klabranche

8

내가 언급 한 블로그 게시물을 오해하고있는 것 같습니다. web.config 파일에 제공된 사용자 ID와 암호는 ActiveDirectoryMembershipProvider가 AD에 연결하기 위해 사용하는 것이지 사용자가 제공하는 것이 아닙니다. 본질적으로 그가 말한 것은 AD 멤버쉽 제공자를위한 SQL 멤버쉽 공급자를 스왑하고 AD로 작동하도록 작성된 코드를 사용하는 것입니다. 그게 바로 당신이해야 할 일입니다. 멤버 자격 코드를 전혀 사용하지 않으려는 경우 관심 도메인의 주요 컨텍스트에서 PrincipalContext.ValidateCredentials 메서드를 사용하여 Login 메서드에 전달 된 자격 증명의 유효성을 검사 할 수 있습니다.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "domain")) { 
    if (context.ValidateCredentials(username, password)) 
    { 
     // log them in 
    } 
    else 
    { 
     // set up error message and rerender view 
    } 
} 
14

덕분에 나에게 올바른 방향을 가리키는 경우,이 내가 내가 사용자의 유효성 검사가 있다면 결정하기 위해 try 블록에서 캐치를 사용하고 있다는 사실이 마음에 들지

 <authentication mode="Forms"> 
       <forms loginUrl="~/Account/LogOn" timeout="10"/> 
     </authentication>     

public bool ValidateUser(string userName, string password) 
     { 
      bool validation; 
      try 
      { 
       LdapConnection ldc = new LdapConnection(new LdapDirectoryIdentifier((string)null, false, false)); 
       NetworkCredential nc = new NetworkCredential(userName, password, "DOMAIN NAME HERE"); 
       ldc.Credential = nc; 
       ldc.AuthType = AuthType.Negotiate; 
       ldc.Bind(nc); // user has authenticated at this point, as the credentials were used to login to the dc. 
       validation = true; 
      } 
      catch (LdapException) 
      { 
       validation = false; 
      } 
      return validation; 
     } 

을하고 결국 무엇인가 성공했지만, 다른 방법을 찾을 수 없었습니다.

+0

올바른 방향으로 당신을 가리켜 주셔서 감사합니다. 당신은 그것을 지정하고 그것들을위한 최소한의 포인트를 주길 원할 것입니다. :) – klabranche

+5

LdapConnection은 using() {} 블록에 있어야 올바로 폐기되었는지 확인합니다. –

0

찾을 수있는 System.Web.Security.ActiveDirectoryMembershipProvider.dll을 찾을 수 없습니다? 또한 내가 memebership &에 내가이

<membership defaultProvider="LdapMembershipProvider"> 
    <providers> 
     <add name="LdapMembership" 
      type="Microsoft.Office.Server.Security.LDAPMembershipProvider, 
      Microsoft.Office.Server, 
      Version=12.0.0.0, Culture=neutral, 
      PublicKeyToken=71E9BCE111E9429C" 
      server="DC" 
      port="389" 
      useSSL="false" 
      userDNAttribute="distinguishedName" 
      userNameAttribute="sAMAccountName" 
      userContainer="CN=Users,DC=userName,DC=local" 
      userObjectClass="person" 
      userFilter="(|(ObjectCategory=group)(ObjectClass=person))" 
      scope="Subtree" 
      otherRequiredUserAttributes="sn,givenname,cn"/> 
    </providers> 
</membership> 
+0

'ActiveDirectoryMembershipProvider'가'System.Web.Security' 또는 이와 유사한 형태로 배치되었습니다. – vittore

0

LdapConnection이 System.DirectoryServices.Protocols 네임 스페이스의 구성원 발견 검색 (당신은 당신의 참조에 System.DirectoryServices.Protocols 라이브러리를 추가해야합니다)