6

Tworzę aplikację internetową, do której można uzyskać dostęp na dwa sposoby. Każdy, kto pracuje w tej samej organizacji co ja, może korzystać z naszego aktywnego katalogu, aby uzyskać dostęp do aplikacji.Uwierzytelnianie MVC 4 przy użyciu Active Directory lub bazy danych członkostwa

Wszyscy z zewnątrz powinni dołączyć do aplikacji za pośrednictwem oddzielnej bazy danych członkostwa. Każdy powinien mieć konto w bazie danych członkostwa ze swoimi rolami, więc połączenie reklamowe to tylko bonus, aby ułatwić zachowanie hasła i nazwy użytkownika. Przeszukałem internet, ale nie mogłem znaleźć podobnej sytuacji. To jest mój pierwszy kontakt z reklamą.

Czy ktoś wie o strukturze, której można użyć, lub podpowie mi, w jaki sposób mogę spróbować rozwiązać problem?

W tej chwili zaimplementowałem połączenie członkowskie z System.Web.WebData.SimpleMembershipProvider i działa dobrze.

W późniejszym rozwoju aplikacji potrzebuję również innych połączeń z reklamą, aby sprawdzić niektóre informacje, ale to tylko problem na inny dzień.

Dzięki za pomoc.

Odpowiedz

5

Otwórz swój web.config.

Przede wszystkim trzeba ConnectionString dla ActiveDirectory:

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

Przewiń do tagu <membership>. Upewnij się, że masz defaultProvider atrybut ustawiony dla <membership>, jak:

<membership defaultProvider="SimpleMembershipProvider">

Następnie dodać nowego dostawcę dla członków AD wewnątrz <providers>:

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

To powinno wystarczyć do web.config. Teraz musimy uwierzytelniać użytkowników AD w logowaniu. Przejdź do akcji logowania AccountController. Najpierw próbujemy uwierzytelnić użytkownika za pośrednictwem ActiveDirectory, istnieje przydatna klasa o nazwie PrincipalContext w przestrzeni nazw System.DirectoryServices.AccountManagement. Jeśli to nie używamy domyślnego dostawcę członkostwa:

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

Dla późniejszych wymagań można uzyskać bieżący zalogowany użytkownik z ActiveDirectory UserPrincipal Klasa:

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

nadzieję, że pomoże i nie przegapić byle co.

2

Ten kod da, jeśli użytkownik o podanej nazwy użytkownika i hasła jest ważna

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

Możesz dodać kontroler domeny i BaseDomainName w appSettings web.config jako klucze