6

Sto creando un'applicazione Web a cui è possibile accedere in due modi. Tutti coloro che lavorano nella stessa organizzazione di cui sono in possesso possono utilizzare la nostra directory attiva per accedere all'applicazione.Autenticazione MVC 4 con database Active Directory o Membership

Tutti gli utenti esterni devono partecipare all'applicazione tramite un database di appartenenza separato. Tutti dovrebbero avere un account nel database dei membri con i suoi ruoli, quindi la connessione pubblicitaria è solo un bonus per rendere più facile tenere a mente la password e il nome utente. Ho cercato su Internet ma non sono riuscito a trovare una situazione simile. Questa è la prima volta che lavoro con la pubblicità.

Qualcuno sa di un framework che può essere utilizzato o mi dà un suggerimento su come potrei provare a risolvere il problema?

Al momento ho implementato la connessione di appartenenza con System.Web.WebData.SimpleMembershipProvider e funziona perfettamente.

Nello sviluppo successivo dell'applicazione ho bisogno anche di altre connessioni all'annuncio per controllare alcune informazioni ma questo è solo un problema per un altro giorno.

Grazie per l'aiuto.

risposta

5

Apri il tuo web.config.

Prima di tutto è necessario ConnectionString per la vostra ActiveDirectory:

<connectionStrings> 
    ... 
    <add name="ADConnectionString" connectionString=LDAP://*adserver*/DC=*domain* /> 
    ... 
    </connectionStrings> 

Scorrere verso il basso al tag <membership>. Assicurarsi di avere defaultProvider attributo impostato per il <membership>, come:

<membership defaultProvider="SimpleMembershipProvider">

Quindi aggiungere nuovo fornitore per i membri AD all'interno <providers>:

<add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" /> 

Questo dovrebbe fare il trucco per web.config. Ora è necessario autorizzare gli utenti AD all'accesso. Passare all'azione di accesso AccountController. Per prima cosa proviamo ad autenticare l'utente tramite ActiveDirectory, c'è una classe utile chiamata PrincipalContext nello spazio dei nomi System.DirectoryServices.AccountManagement. Se fallisce usiamo il provider di appartenenze predefinito:

 public ActionResult Login(LoginModel model, string returnUrl) 
     { 
      try 
      { 
       // try to auth user via AD 
       using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
       { 
        if (pc.ValidateCredentials(model.UserName, model.Password)) 
        { 
         FormsAuthentication.SetAuthCookie(model.UserName, false); 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       // try the default membership auth if active directory fails 

       if (Membership.ValidateUser(model.UserName, model.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, false); 

        if (Url.IsLocalUrl(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "Login failed"); 
       } 
      } 
      catch 
      { 
      } 
      GetErrorsFromModelState(); 
      return View(model); 
     } 

Per le tue esigenze successive è possibile ottenere la corrente utente connesso ActiveDirectory con classe UserPrincipal:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
    using (var aduser = UserPrincipal.FindByIdentity(context,IdentityType.SamAccountName, HttpContext.User.Identity.Name)) 
    { 
     ... 
    } 
} 

Spero che questo aiuti e non mi manca nulla.

2

Questo codice vi darà se l'utente con il nome utente e la password specificata è valida

public bool ValidateUser(string userName, string password) 
    { 
     bool authenticated = false; 
     string dePath = string.Empty; 
     dePath += DomainController; 
     if (!string.IsNullOrEmpty(BaseDomainName)) 
     { 
      dePath += "/" + BaseDomainName; 
     } 
     try 
     { 
      DirectoryEntry entry = new DirectoryEntry(dePath, userName, password); 
      object nativeObject = entry.NativeObject; 
      authenticated = true; 
     } 
     catch 
     { 
      return false; 
     } 
     return authenticated; 
    } 

È possibile aggiungere DomainController e BaseDomainName in appSettings web.config come chiavi