2008-12-08 9 views
46

¿Hay alguna utilidad incorporada o ayuda para analizar HttpContext.Current.User.Identity.Name, p. Ej. domain\user para obtener el nombre de dominio por separado si existe y el usuario?Ayudante incorporado para analizar User.Identity.Name en Domain Username

¿O hay alguna otra clase para hacerlo?

entiendo que es muy fácil llamar String.Split("\") pero sólo interesante

+1

Son las preguntas simples que siempre olvidamos preguntarnos. Esperamos con interés cualquier respuesta útil a esta pregunta. –

Respuesta

68

Esto es mejor (más fácil de usar, no hay oportunidad de NullReferenceExcpetion y se ajusta MS directrices sobre el tratamiento de cadena vacía y nula igualmente) de codificación:

public static class Extensions 
{ 
    public static string GetDomain(this IIdentity identity) 
    { 
     string s = identity.Name; 
     int stop = s.IndexOf("\\"); 
     return (stop > -1) ? s.Substring(0, stop) : string.Empty; 
    } 

    public static string GetLogin(this IIdentity identity) 
    { 
     string s = identity.Name; 
     int stop = s.IndexOf("\\"); 
     return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : string.Empty; 
    } 
} 

Uso:

IIdentity id = HttpContext.Current.User.Identity; 
id.GetLogin(); 
id.GetDomain(); 

Esto requiere el compilador C# 3.0 (o posterior) y no requiere 3.0 .Net para trabajar después de la compilación.

+7

Su declaración de devolución en 'GetLogin' se puede simplificar a' return s.Substring (stop + 1); ' –

+0

¿Qué pasa si el nombre de usuario tiene múltiples barras diagonales inversas? ¿Qué ocurre si el usuario desea usar el formato UPN de [email protected]? Terminé usando la función Win32 CredUIParseUserName. Consulte http://www.pinvoke.net/default.aspx/credui.creduiparseusername –

1

Yo no lo creo, porque System.Security.Principal.WindowsIdentity no contiene tales miembros.

4

creo que no también, porque me hice la misma pregunta el otro día: D

que puede probar:

public static string GetDomain(string s) 
{ 
    int stop = s.IndexOf("\\"); 
    return (stop > -1) ? s.Substring(0, stop + 1) : null; 
} 

public static string GetLogin(string s) 
{ 
    int stop = s.IndexOf("\\"); 
    return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null; 
} 
3

Ustedes también pueden considerar analizar una entrada de cadena como "[email protected]", o "usuario @ dominio".

Esto es lo que estoy haciendo actualmente:
Si cadena contiene '\' cadena a continuación, dividida en '\' y el extracto de nombre de usuario y dominio
Else Si cadena contiene '@' cadena a continuación, dividida en '@' y extraer nombre de usuario y dominio
cadena Else tratar como nombre de usuario sin un dominio

todavía estoy a la caza de una mejor solución en el caso en el que la cadena de entrada no está en un formato fácil de predecir, es decir, "de dominio de dominio \ usuario @ ". Estoy pensando en RegEx ...

Actualización: Estoy corregido. Mi respuesta es un poco fuera de contexto, se refiere al caso general de análisis de nombre de usuario y dominios fuera de la entrada del usuario, como en el inicio de sesión de usuario/inicio de sesión. Espero que todavía ayude a alguien.

+0

Necesita una solución elegante para esto. Estoy de acuerdo. Una respuesta a la parte domain \ user es esta: http://stackoverflow.com/a/185716/481656 – DoomerDGR8

13

System.Environment.UserDomainName le da el nombre de dominio única

Del mismo modo, System.Environment.UserName le da el nombre de usuario única

+2

> System.Environment.UserDomainName' le proporciona el nombre de dominio solo >> Del mismo modo, 'System.Environment.UserName 'le da el nombre de usuario solamente Esto no funcionará en ASP.NET –

+0

Creo que funciona si usa authentication = Windows and impersonation = true. Consulte - http://stackoverflow.com/questions/8841816/system-web-httpcontext-current-user-identity-name-vs-system-environment-username – FMFF

+0

Pero no funciona en .Net Core ... –

5
var components = User.Identity.Name.Split('\\'); 

var userName = components.Last() 

var domainName = components.Reverse().Skip(1).FirstOrDefault() 
0

parece un problema de hecho para ser resueltos por las expresiones regulares:

public static class UserExtensions 
{ 
    public static string GetDomain(this IIdentity identity) 
    { 
     Regex.Match(identity.Name, ".*\\\\").ToString() 
    } 

    public static string GetLogin(this IIdentity identity) 
    { 
     return Regex.Replace(identity.Name, ".*\\\\", ""); 
    } 
} 
+0

¿No está usando regex una exageración aquí cuando en su lugar se puede usar la manipulación simple de cadenas? – abatishchev

+3

Suena como: Tengo un problema. Usemos regex. Ahora tengo dos problemas :) – abatishchev

+0

Una expresión regular resuelve el problema en una línea simple. No son la herramienta adecuada para cada trabajo, pero creo que en este caso la solución de expresiones regulares es más elegante. –

1

Aunque no es un .NET incorporado, siempre se puede P/invocar a CredUIParseUserName. Here es un ejemplo de cómo usarlo en .NET.

PD: Parece que no maneja el "punto", como en ". \ Username".