43

Estoy desarrollando una aplicación MVC3 que requerirá que un usuario sea autenticado contra un AD. Sé que existe la opción en MVC3 de crear una Aplicación de Intranet que autentique automáticamente a un usuario contra un AD, pero usa la Autenticación de Windows y los inicia automáticamente. Se puede acceder a esta aplicación en estaciones de trabajo 'Abiertas' donde el usuario deberá ingresar su Nombre de usuario y Contraseña de Dominio. Cualquier ejemplo o tutorial en línea sería genial. Un proyecto de ejemplo sería excepcional.ASP.NET MVC - Autentica a los usuarios contra Active Directory, pero requiere que ingresen el nombre de usuario y la contraseña

Respuesta

43

Usted puede utilizar la plantilla de aplicación de Internet estándar con la autenticación de formularios e insertar un ActiveDirectoryMembershipProvider en el web.config:

<connectionStrings> 
    <add name="ADConnectionString" connectionString="LDAP://YOUR_AD_CONN_STRING" /> 
</connectionStrings> 

<system.web> 
    <authentication mode="Forms"> 
     <forms name=".ADAuthCookie" loginUrl="~/Account/LogOn" 
       timeout="15" slidingExpiration="false" protection="All" /> 
    </authentication> 
    <membership defaultProvider="MY_ADMembershipProvider"> 
     <providers> 
      <clear /> 
      <add name="MY_ADMembershipProvider" 
       type="System.Web.Security.ActiveDirectoryMembershipProvider" 
       connectionStringName="ADConnectionString" 
       attributeMapUsername="sAMAccountName" /> 
     </providers> 
    </membership> 
</system.web> 

De esta manera se obtiene la forma de la plantilla de inicio de sesión de aplicaciones de Internet, y se valida contra la AD para usted.

Luego es solo una cuestión de limpieza AccountController para eliminar la contraseña de restablecer/cambiar la contraseña/registrar la funcionalidad que acaba de entrar.

+0

¿Cómo podemos hacer esto para MVC4? –

+0

@JamesHarpe Es lo mismo ... – Rovdjuret

+1

¿Y cómo se puede usar con ASP.NET Core (MVC 6)? –

10

Como se mencionó anteriormente, puede usar el proveedor de membresía definido en el archivo web.config.

El siguiente código está dentro de la aplicación de la 'AccountController' a partir del código de plantilla MVC 3 y ha sido ligeramente modificado para trabajar con ActiveDirectory:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if(ModelState.IsValid) 
     { 
     // Note: ValidateUser() performs the auth check against ActiveDirectory 
     // but make sure to not include the Domain Name in the User Name 
     // and make sure you don't have the option set to use Email Usernames. 
     if(MembershipService.ValidateUser(model.UserName, model.Password)) 
     { 
      // Replace next line with logic to create FormsAuthenticationTicket 
      // to encrypt and return in an Http Auth Cookie or Session Cookie 
      // depending on the 'Remember Me' option. 
      //FormsService.SignIn(model.UserName, model.RememberMe); 

      // Fix this to also check for other combinations/possibilities 
      if (!String.IsNullOrEmpty(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 
      else 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
     } 
     else 
     { 
      ModelState.AddModelError("", "The user name or password provided is incorrect."); 
     } 
    } 

Si se utiliza .NET 3.5 - sigue leyendo para this article la alternativa:

+0

Creo que debería ser Membership.ValidateUser en lugar de MembershipService.ValidateUser – r03

+1

cpoDesign probablemente esté utilizando su propio servicio para validar a un usuario, a saber 'MembershipService'. Dentro de él probablemente use 'MembershipService.ValidateUser'. –

Cuestiones relacionadas