2009-09-09 37 views
25

Chcę być w stanie uwierzytelnić użytkownika za pomocą jego domeny UserId i hasła, ale domyślna aplikacja ASP.Net MVC pozwala użytkownikowi zarejestrować userId i hasło, a następnie zalogować się. mogę to zrobić?Uwierzytelnianie LDAP w ASP.Net MVC

Nie chcę, aby użytkownik mógł się zarejestrować; jednak powinien być w stanie wprowadzić jego identyfikator i identyfikator domeny domeny windows oraz być uwierzytelnionym przez serwer domeny.

Rozwiązania, które widziałem (na przykład here on Mike's Blog), nie wymagają wprowadzania przez użytkownika jego UserId lub hasła.

W jaki sposób mogę uzyskać moją aplikację ASP.Net MVC, aby pokazać formularz logowania i uwierzytelnić użytkownika w domenie Windows?

Proszę wyjaśnić z próbką jeśli to możliwe

Odpowiedz

18

Oto, jak to zrobić w uwierzytelnianiu formularzy aplikacji internetowych, więc może zaistnieć potrzeba dostosowania do MVC. Użyj mechanizmu członkostwa i ról asp.net. Skonfiguruj dostawcę, aby korzystał z dostawcy członkostwa Active Directory, a także użyj formularzy do uwierzytelniania.

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

lub coś podobnego ....

Konfiguracja dostawca będzie wyglądać następująco:

<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> 

Ochrona połączenie, nazwa użytkownika i pwd są dla konta, które ma dostęp zapytać AD w imieniu systemu. W zależności od bezpieczeństwa twojej sieci, może to wymagać konfiguracji lub nie będziesz w stanie wysłać zapytania do AD, aby uwierzytelnić użytkownika.

Twój ciąg połączenia będzie wyglądać następująco:

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

ciąg połączenia może przybierać różne formy, więc może trzeba badać je dla danego środowiska.

Na stronie logowania może trzeba wykonać metodę uwierzytelniania i próby ...

e.Authenticated = Membership.ValidateUser(username, password); 
    if (e.Authenticated == false)... 

książka Stephena Shackow za „Profesjonalny ASP.Net 2.0 bezpieczeństwa, przynależności i zarządzanie rolami” ma dobre pokrycie na przy użyciu członkostwa AD (rozdział 12). Nie jest to w kontekście MVC, ale konfiguracja i konfiguracja byłyby takie same.

+0

Uwaga: Być może trzeba dodać '' wewnątrz '' w celu nadpisania wzorca. – Keith

+0

Hej, masz pojęcie o tym, w jaki sposób zostanie ono zaimplementowane w MVC5. Dzięki – Vivekh

+0

MVC może również korzystać z usługodawcy AD. Powyższe informacje o pliku web.config i ciąg połączenia powinny być identyczne lub bliskie. – klabranche

8

myślę, że jesteś nieporozumienia blogu masz odwołuje. Identyfikator użytkownika i hasło podane w pliku web.config są używane przez ActiveDirectoryMembershipProvider do łączenia się z AD, a nie dostarczane przez użytkownika. Zasadniczo chodzi o to, aby zamienić dostawcę członkostwa SQL na dostawcę członkostwa AD i użyć kodu tak, jak napisano, aby działał z AD. Dokładnie to musisz zrobić. Jeśli nie chcesz w ogóle korzystać z kodu dostawcy członkostwa, możesz użyć metody PrincipalContext.ValidateCredentials w kontekście głównym dla interesującej domeny w celu sprawdzenia poświadczeń przekazanych do metody logowania.

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

dzięki za wskazanie mi właściwy kierunek, to jest to, co skończyło się robi

 <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; 
     } 

nie podoba się fakt, że używam zaczep na bloku spróbować ustalić, czy była walidacja użytkowników udany, ale nie mogłem znaleźć innego sposobu.

+0

Do kogo dziękujesz za skierowanie cię we właściwym kierunku? Możesz to określić i dać im przynajmniej punkt za to. :) – klabranche

+5

LdapConnection powinien znajdować się w bloku using() {}, aby upewnić się, że jest prawidłowo umieszczony –

0

Nie mogłem znaleźć System.Web.Security.ActiveDirectoryMembershipProvider.dll, gdzie można znaleźć? również wyszukiwać w memebership & Znalazłem

<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' umieszczony w' System.Web.Security' lub coś w tym stylu – vittore

0

LdapConnection jest członkiem System.DirectoryServices.Protocols nazw (a trzeba dodać bibliotekę System.DirectoryServices.Protocols do referencji)

Powiązane problemy