6

Estoy intentando activar el inicio de sesión tanto en ActiveDirectory como en formularios estándar, pero una cosa me está deteniendo. No puedo obtener el nombre del usuario de Windows actual. Lo más cercano que tengo es var i = WindowsIdentity.GetCurrent();, pero eso me da el nombre del usuario del grupo de aplicaciones de IIS. Tengo Autenticación anónima, Autenticación de formularios y Autenticación de Windows habilitada en IIS. Puedo cargar usuarios desde AD así que supongo que mi web.config está configurado correctamente.Nombre de usuario actual de ActiveDirectory en ASP.NET

Editar: Este es mi web.config (utilizando un proveedor de la fachada):

<membership defaultProvider="HybridMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="HybridMembershipProvider" type="MyApp.Data.HybridMembershipProvider" AspNetProviderName="AspNetSqlMembershipProvider" ActiveDirectoryProviderName="ADMembershipProvider" /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyAppConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
     <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" enableSearchMethods="true" attributeMapEmail="mail"/> 
     </providers> 
    </membership> 

Edición 2: Aquí está mi configuración de seguridad de IIS.

IIS Security setup

Respuesta

4

Si activa la suplantación de ASP.Net en IIS, puede obtener el nombre de usuario como usted quería. Esto solo funcionará si los datos están en el proveedor de membresía de formularios/AD , y ellos no son anónimos

Además, la mezcla basada en Formms y la autenticación basada en Windows/AD es factible pero no recomendada. Consulte this si necesita hacerlo.

EDITAR: Creo que no he entendido bien lo que quería de un alto nivel pasando por alto de lo que sucede con la solución antes mencionada de manera aquí:

Si desactiva la autenticación anónima, y ​​encienda Asp.Net suplantación , IIS hará un Desafío 401 cada vez que alguien visite el sitio.
Si todo está en el mismo dominio, el navegador web enviará sus credenciales a IIS, IIS las validará contra su Directorio Activo, y luego AD le dará a IIS una Identidad para trabajar.

Cuando tiene suplantación Asp.Net activada, IIS vinculará esa identidad con la secuencia/solicitud actual. Así que después de la autenticación ocurre, puede simplemente tomar el nombre de usuario de la identidad de hebra actual, y luego consultar Active Directory como:

using System.Threading; 
using System.DirectoryServices; 
using System.DirectoryServices.AccountManagement; 

...... 

PrincipalContext pc = null; 
UserPrincipal principal = null; 

try 
{ 
    var username = Thread.CurrentPrincipal.Identity.Name; 
    pc = new PrincipalContext(ContextType.Domain, "active.directory.domain.com"); 
    principal = UserPrincipal.FindByIdentity(pc, username); 

    var firstName = principal.GivenName ?? string.Empty 
    var lastName = principal.Surname ?? string.Empty 
    return string.Format("Hello {0} {1}!", firstName, lastName); 
} 
catch ... 
finally 
{ 
    if (principal != null) principal.Dispose(); 
    if (pc != null) pc.Dispose(); 
} 
+0

¿Podría explicarnos sus dos primeros puntos un poco más, por favor? ¿Qué quiere decir "si esa información está en el proveedor de membresía de formularios/AD"? Son usuarios y puedo consultar AD por nombre de usuario. "De lo contrario, tendrá que consultar AD para obtener su nombre." -Puedo hacer esto si tengo su nombre, pero ¿cómo lo haría para obtener su nombre? – Echilon

+0

Respuesta editada para usted, vuelva a leer –

+0

El problema que tengo es que 'Thread.CurrentPrincipal.Identity.Name ' está vacío, no puedo obtener el nombre de usuario. – Echilon

-1

que le daría una oportunidad con:

var i = Environment.CurrentUser;

y se puede utilizar también mi clase: http://pastebin.com/xnYfVsLX

+0

no creo que la voluntad trabajo para aplicaciones web, lo cual supongo que es porque mencionó formularios auth – Eonasdan

1

Las aplicaciones .Net que he escrito en el que He utilizado la autenticación de Windows. Todavía puedo usar User.Identity.Name para obtener el nombre de usuario de AD. Esto generalmente incluye el DC por supuesto, y devuelve el nombre de la cuenta SAM de los usuarios. No estaba tratando de implementar ambos al mismo tiempo, pero User.Identity.Name funciona de manera segura

0

Este es un segmento de código que utilicé en mi aplicación ASP.NET MVC no hace mucho tiempo, me ayudó, No sé si le ayudará sin embargo, usted es libre de visitar aunque

private static void CheckIfUserExists(string p) 
    { 
     try 
     { 
       var user = (from x in Data.EntityDB.UserInfoes where x.SAMAccountName == p select x).FirstOrDefault(); 
       DirectoryEntry entry = new DirectoryEntry(Properties.Settings.Default.LDAPPath); //this is the connection to your active directory 
       DirectorySearcher search = new DirectorySearcher(entry); 
       search.PropertiesToLoad.Add("*"); 
       search.Filter = "(&(sAMAccountName=" + p + ")(objectCategory=person))"; 
       SearchResult searchResult = search.FindOne(); 
      //If the user under the alias is not found, Add a new user. Else, update his current data 
      if (user == null) 
      { 
       XXXXXXX.Models.UserInfo newUserEntry = new Models.UserInfo 
       { 
        SAMAccountName = p, 
        First_Name = searchResult.Properties.Contains("givenName") ? searchResult.Properties["givenName"][0].ToString() : string.Empty, 
        Last_Name = searchResult.Properties.Contains("sn") ? searchResult.Properties["sn"][0].ToString() : string.Empty, 
        Title = searchResult.Properties.Contains("title") ? searchResult.Properties["title"][0].ToString() : string.Empty, 
        Office = searchResult.Properties.Contains("l") ? searchResult.Properties["l"][0].ToString() : string.Empty, 
        Country = searchResult.Properties.Contains("c") ? searchResult.Properties["c"][0].ToString() : string.Empty, 
        Telephone = searchResult.Properties.Contains("telephoneNumber") ? searchResult.Properties["telephoneNumber"][0].ToString() : string.Empty, 
        Mobile_Phone = searchResult.Properties.Contains("mobile") ? searchResult.Properties["mobile"][0].ToString() : string.Empty, 
        Email_Address = searchResult.Properties.Contains("mail") ? searchResult.Properties["mail"][0].ToString() : string.Empty, 
        Image_Path = string.Format(Properties.Settings.Default.UserPicturePath, p), 
        LastUpdate = DateTime.Now, 
       }; 

actualización

Tome nota que se preguntaba también una base de datos diferente en este extracto, ignorar todas las declaraciones Linq. Las clases DirectoryEntry, DirectorySearcher y SearchResult deben ayudarlo con lo que necesita.

actualización 2 la variable p puede ser reemplazado por el HttpContext.Current.User.Identity Propiedad

actualización 3 Aquí está una lista de nombres LDAP (donde se ve searchResult.Properties.Contains ("") Over here que apunta a diferentes atributos de usuario en el directorio activo

+0

El problema es que 'HttpContext.Cu rrent.User.Identity' está en blanco, e IsAuthenticated es falso, por lo que no tengo nombre de usuario, aunque estoy en una cuenta de AD. – Echilon

+0

Eso es extraño. ¿Ha establecido la etiqueta en su web.config en su conexión LDAP? porque, en caso afirmativo, y puede iniciar sesión, HttpContext.Current.User.La identidad no debe ser nula – Eon

+0

Eon

1

Prueba este si está utilizando la autenticación de formularios con Active Directory:

Context.User.Identity.Name 

// fragmento de código

sub Page_Load(sender as object, e as EventArgs) 
    lblName.Text = "Hello " + Context.User.Identity.Name & "." 
    lblAuthType.Text = "You were authenticated using " & Context.User.Identity.AuthenticationType & "." 
end sub 

Ref:
Active Directory Authentication from ASP .NET
How to authenticate against the Active Directory by using forms authentication and Visual Basic .NET Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

Ref: Puede utilizar la autenticación de Windows con ASP.NET en un número de maneras:

  • autenticación de Windows sin suplantación. Esta es la configuración predeterminada. ASP.NET realiza operaciones y acceso a los recursos mediante el uso de identidad de proceso de la aplicación, que por defecto es la cuenta de servicio de red en Windows Server 2003.

  • autenticación de Windows con suplantación. Con este enfoque, usted suplanta al usuario autenticado y usa esa identidad para realizar operaciones y acceder a los recursos.

  • Autenticación de Windows con suplantación de identidad fija. Con este enfoque, se hace pasar por una cuenta fija de Windows para acceder a los recursos usando una identidad específica. En Windows Server 2003, debe evitar este enfoque de suplantación; en su lugar, use un grupo de aplicaciones personalizado con una identidad de servicio personalizada.

Según la documentación puede obtener el token de Windows del usuario autenticado.

IIdentity WinId= HttpContext.Current.User.Identity; 
WindowsIdentity wi = (WindowsIdentity)WinId; 

Si hay algo mal a continuación, comprobar su aplicación suplantación método de acuerdo con la documentación de MSDN de How To: Use Windows Authentication in ASP.NET 2.0

remitir el artículo de ScottGu Recipe: Enabling Windows Authentication within an Intranet ASP.NET Web application

+0

NB: no se aplica cuando la autenticación de formularios está en uso. Lo he usado con ASP.NET MVC, y System.Web.HttpContext.Current.User será un objeto System.Web.Security.FormsIdentity. –

Cuestiones relacionadas