6

Ich erstelle eine Webanwendung, die auf zwei Arten aufgerufen werden kann. Jeder, der in derselben Organisation arbeitet wie ich, kann über unser Active Directory auf die Anwendung zugreifen.MVC 4-Authentifizierung mit Active Directory oder Mitgliedschaftsdatenbank

Jeder von außen sollte die Anwendung über eine separate Mitgliederdatenbank verbinden. Jeder sollte über ein Konto in der Mitgliederdatenbank mit seinen Rollen verfügen. Daher ist die Anzeigenverbindung nur ein Bonus, um das Passwort und den Nutzernamen leichter merken zu können. Ich suchte im Internet, konnte aber keine vergleichbare Situation finden. Das ist das erste Mal, dass ich mit einer Anzeige arbeite.

Kennt jemand ein Framework, das verwendet werden kann oder geben Sie mir einen Hinweis darauf, wie ich versuchen könnte, das Problem zu lösen?

Im Moment habe ich die Mitgliedschaft Verbindung mit System.Web.WebData.SimpleMembershipProvider implementiert und es funktioniert gut.

In der späteren Entwicklung der Anwendung brauche ich auch einige andere Verbindungen zur Anzeige, um einige Informationen zu überprüfen, aber das ist nur ein Problem für einen anderen Tag.

Danke für die Hilfe.

Antwort

5

Öffnen Sie Ihre web.config.

Zunächst einmal werden Sie connection für Ihre ActiveDirectory- benötigen:

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

Blättern Sie zum <membership>-Tag. Stellen Sie sicher, default Attribut für die <membership>, wie haben:

<membership defaultProvider="SimpleMembershipProvider">

Dann fügen Sie neue Anbieter für AD-Mitglieder innerhalb <providers>:

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

, die den Trick für web.config tun sollten. Jetzt müssen wir AD-Benutzer beim Anmelden authentifizieren. Gehen Sie zu Ihrer AccountController-Login-Aktion. Zuerst versuchen wir, Benutzer über ActiveDirectory zu authentifizieren, es gibt eine handliche Klasse namens PrincipalContext in System.DirectoryServices.AccountManagement Namensraum. Wenn das fehlschlägt verwenden wir den Standardmitgliedschaftsanbieter:

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

Für Ihre spätere Anforderungen können Sie die aktuelle in ActiveDirectory- Benutzer mit Userprincipal Klasse protokolliert werden:

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

hoffe, das hilft und ich habe nicht verpassen etwas.

2

Dieser Kodex wird Sie geben, wenn der Benutzer mit dem angegebenen Benutzernamen und Passwort

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

gültig Sie können

Domain und BaseDomainName in web.config appSettings als Schlüssel hinzufügen