2008-12-01 21 views
34

En una página aspx obtengo el nombre de usuario de Windows con la función Request.LogonUserIdentity.Name. Esta función devuelve una cadena en el formato "dominio \ usuario".Cómo obtener un nombre de usuario sin dominio

¿Existe alguna función para obtener solo el nombre de usuario, sin recurrir a IndexOf y Substring, así?

public static string StripDomain(string username) 
{ 
    int pos = username.IndexOf('\\'); 
    return pos != -1 ? username.Substring(pos + 1) : username; 
} 

Respuesta

29

No lo creo así. Tengo el nombre de usuario utilizando estos métodos para antes

System.Security.Principal.IPrincipal user = System.Web.HttpContext.Current.User; 
System.Security.Principal.IIdentity identity = user.Identity; 
return identity.Name.Substring(identity.Name.IndexOf(@"\") + 1); 

o

Request.LogonUserIdentity.Name.Substring(Request.LogonUserIdentity.Name.LastIndexOf(@"\") + 1); 
+0

Request.LogonUserIdentity.Name funciona bien para que un formulario de inicio de sesión obtenga el nombre de usuario del usuario registrado en el dominio al crear un formulario de inicio de sesión que usa LDAP. El resto requiere la ventana de autenticación de Windows, creo. – RandomUs1r

5

Si está utilizando .NET 3.5 Siempre se puede crear un método de extensión a la clase WindowsIdentity que hace este trabajo para usted.

public static string NameWithoutDomain(this WindowsIdentity identity) 
{ 
    string[] parts = identity.Name.Split(new char[] { '\\' }); 

    //highly recommend checking parts array for validity here 
    //prior to dereferencing 

    return parts[1]; 
} 

de esa manera todo lo que tiene que hacer en cualquier lugar de su código de referencia es:

Request.LogonUserIdentity.NameWithoutDomain();

1
static class IdentityHelpers 
{ 
    public static string ShortName(this WindowsIdentity Identity) 
    { 
     if (null != Identity) 
     { 
      return Identity.Name.Split(new char[] {'\\'})[1]; 
     } 
     return string.Empty; 
    } 
} 

Si se incluye este código, se puede entonces simplemente hacer algo como:

WindowsIdentity a = WindowsIdentity.GetCurrent(); 
Console.WriteLine(a.ShortName); 

Obviamente, en un entorno web, usted no escribir en la consola - sólo un ejemplo ...

11

Obtener piezas [1] no es un enfoque seguro. Preferiría utilizar LINQ. Última():

WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); 
if (windowsIdentity == null) 
    throw new InvalidOperationException("WindowsIdentity is null"); 
string nameWithoutDomain = windowsIdentity.Name.Split('\\').Last(); 
+1

Este enfoque daría el resultado incorrecto, aunque si 'Nombre' no contiene una barra invertida por alguna razón (por ejemplo, ¿Grupo de trabajo?) –

46

Si está utilizando la Autenticación de Windows. Esto se puede lograr simplemente llamando al System.Environment.UserName que le dará solo el nombre de usuario. Si solo desea el nombre de dominio puede usar System.Environment.UserDomainName

+0

Bueno. No sabía esto ... – doekman

+0

@Robin V., ¿sabes lo que sucede si usas 'runas' y cosas por el estilo ?, supongo que las variables System.Environment solo reflejan el usuario conectado, no la identidad que ejecuta el proceso .NET (podría no ser idéntico) – Sebastian

+1

mi aplicación se ejecuta como yo y esto me devuelve "iis pool". Bastante seguro que la pregunta dice aspx, creo que esto funcionaría en winforms sin embargo. – RandomUs1r

Cuestiones relacionadas