c# - existing - MVC 4 autenticación con Active Directory o base de datos de membresía
login mvc 4 c# (2)
Abra su web.config.
Antes que nada, necesitarás connectionString para tu ActiveDirectory:
<connectionStrings>
...
<add name="ADConnectionString" connectionString=LDAP://*adserver*/DC=*domain* />
...
</connectionStrings>
Desplázate hasta la etiqueta <membership>
. Asegúrese de tener el atributo defaultProvider establecido para la <membership>
, como:
<membership defaultProvider="SimpleMembershipProvider">
A continuación, agregue un nuevo proveedor para miembros de AD dentro de <providers>
:
<add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" />
Eso debería hacer el truco para web.config. Ahora necesitamos autenticar a los usuarios de AD al iniciar sesión. Vaya a la acción de inicio de sesión de AccountController. Primero tratamos de autenticar al usuario a través de ActiveDirectory, hay una práctica clase llamada PrincipalContext
en el espacio de nombres System.DirectoryServices.AccountManagement
. Si eso falla usamos el proveedor de membresía predeterminado:
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);
}
Para sus requisitos posteriores, puede obtener el usuario actual de ActiveDirectory conectado con la clase UserPrincipal:
using (var context = new PrincipalContext( ContextType.Domain))
{
using (var aduser = UserPrincipal.FindByIdentity( context,IdentityType.SamAccountName, HttpContext.User.Identity.Name))
{
...
}
}
Espero que esto ayude y no me perdí nada.
Estoy construyendo una aplicación web a la que se podría acceder de dos maneras. Todos los que trabajan en la misma organización que yo podemos usar nuestro directorio activo para acceder a la aplicación.
Todo el mundo desde el exterior debe unirse a la aplicación a través de una base de datos de membresía separada. Todos deben tener una cuenta en la base de datos de miembros con sus roles, por lo que la conexión de anuncios es solo una ventaja para que sea más fácil tener en cuenta la contraseña y el nombre de usuario. Busqué en Internet pero no pude encontrar una situación comparable. Esta es la primera vez que trabajo con anuncios.
¿Alguien sabe de un marco que se puede utilizar o darme una pista sobre cómo podría tratar de resolver el problema?
Por el momento, implementé la conexión de membresía con System.Web.WebData.SimpleMembershipProvider
y funciona bien.
En el desarrollo posterior de la aplicación, también necesito otras conexiones al anuncio para verificar cierta información, pero ese es solo un problema para otro día.
Gracias por la ayuda.
Este Código le dará si el usuario con nombre de usuario y contraseña especificados es válido
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;
}
Puede agregar DomainController y BaseDomainName en web.config appSettings como claves