2009-09-09 29 views
25

Desidero essere in grado di autenticare un utente utilizzando il proprio dominio UserId e Password, ma l'applicazione ASP.Net MVC predefinita consente all'utente di registrare un ID utente e una password e quindi accedere. Come posso farlo?Autenticazione LDAP in ASP.Net MVC

Non voglio che l'utente sia in grado di registrarsi; tuttavia, dovrebbe essere in grado di immettere il suo dominio Windows ID utente e password ed essere autenticato dal server di dominio.

Le soluzioni che ho visto (ad esempio here on Mike's Blog) non richiedono all'utente di immettere il suo UserId o la password.

Come posso ottenere la mia applicazione ASP.Net MVC per mostrare un modulo di accesso e autenticare l'utente contro il dominio di Windows?

Si prega di spiegare con un campione, se possibile,

risposta

18

Ecco come farlo nell'autenticazione dei moduli di app Web in modo che potrebbe essere necessario un adattamento per MVC. Utilizza il motore di appartenenza e ruoli di asp.net. Impostare il provider per utilizzare il provider di appartenenza di Active Directory E ANCHE utilizzare i moduli per l'autenticazione.

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

o qualcosa di simile ....

Il setup provider sarà simile a questa:

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

La protezione di connessione, il nome utente e pwd sono per l'account che ha accesso per interrogare AD per conto del sistema. A seconda della sicurezza della tua rete, potrebbe essere necessario configurare o non sarà possibile interrogare AD per autenticare l'utente.

la stringa di connessione sarà simile:

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

La stringa di connessione può assumere molte forme in modo da avere per la ricerca che per l'ambiente.

Per la pagina di login potrebbe essere necessario eseguire il metodo di autenticazione e di prova ...

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

libro di Stephen Shackow "Professional ASP.Net 2.0 Security, l'appartenenza, e Role Management" ha una buona copertura su usando l'abbonamento AD (capitolo 12). Non è nel contesto di MVC ma la configurazione e l'installazione sarebbero uguali.

+0

Nota: Potrebbe essere necessario aggiungere a '' entro '' per sovrascrivere il master. – Keith

+0

Ehi, hai qualche idea su come sarà implementato in MVC5. Grazie – Vivekh

+0

MVC può anche utilizzare il provider di abbonamento AD. Le informazioni di cui sopra web.config e stringa di connessione dovrebbero essere identiche o vicine. – klabranche

8

Penso che si sta equivoco il post sul blog si fa riferimento. L'ID utente e la password forniti nel file web.config sono quelli utilizzati da ActiveDirectoryMembershipProvider per connettersi ad AD, non quelli forniti dall'utente. In sostanza, quello che sta dicendo è di scambiare il provider di appartenenze SQL per un provider di appartenenze AD e utilizzare il codice come scritto per farlo funzionare con AD. Questo è esattamente quello che devi fare. Se non si desidera utilizzare il codice del provider di appartenenza, è possibile utilizzare il metodo PrincipalContext.ValidateCredentials in un contesto principale per il dominio di interesse per convalidare le credenziali passate nel metodo di accesso.

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

grazie per avermi giusta direzione, questo è quello che ho finito per fare

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

Non mi piace il fatto che sto usando il fermo sul blocco try per determinare se la convalida degli utenti era successo, ma non ho potuto trovare un altro modo per aggirarlo.

+0

Chi stai ringraziando per averti indirizzato nella giusta direzione? Potresti specificarlo e dargli almeno un punto per farlo. :) – klabranche

+5

LdapConnection deve trovarsi in un blocco using() {} per assicurarsi che sia disposto correttamente –

0

Impossibile trovare System.Web.Security.ActiveDirectoryMembershipProvider.dll dove si trova? anche io la ricerca al sistema memebership & ho trovato questo

<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' inserito in' System.Web.Security' o qualcosa del genere – vittore

0

LdapConnection è membro di System.DirectoryServices.Protocols spazio dei nomi (e si deve aggiungere biblioteca System.DirectoryServices.Protocols ai tuoi riferimenti)

Problemi correlati