2008-12-08 7 views
46

Y a-t-il un utilitaire ou un assistant intégré pour analyser HttpContext.Current.User.Identity.Name, par ex. domain\user pour obtenir séparément le nom de domaine si existe et l'utilisateur?Assistant intégré pour analyser User.Identity.Name dans Domain Username

Ou y a-t-il d'autres classes pour le faire?

Je comprends qu'il est très facile d'appeler String.Split("\") mais juste intéressant

+1

Ce sont les questions simples que nous oublions toujours de nous poser. Nous attendons avec intérêt les réponses utiles à cette question. –

Répondre

68

C'est mieux (plus facile à utiliser, aucune occasion de NullReferenceExcpetion et conforme directives de codage MS sur le traitement de chaîne vide et également null):

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; 
    } 
} 

Utilisation:

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

Cela nécessite un compilateur C# 3.0 (ou plus récent) et ne nécessite pas 3.0 .Net pour fonctionner après la compilation.

+7

Votre déclaration de retour dans 'GetLogin' peut être simplifiée à' return s.Substring (stop + 1); ' –

+0

Que faire si le nom d'utilisateur a plusieurs barres obliques inversées? Que faire si l'utilisateur veut utiliser le format UPN de [email protected]? J'ai fini par utiliser la fonction Win32 CredUIParseUserName. Voir http://www.pinvoke.net/default.aspx/credui.creduiparseusername –

1

Je ne pense pas, parce que System.Security.Principal.WindowsIdentity ne contient pas ces membres.

4

Je pense Pas trop, parce que je me suis posé la même question l'autre jour: D

Vous pouvez essayer:

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

Vous pouvez également envisager d'analyser une entrée de type "[email protected]" ou "user @ domain".

C'est ce que je fais actuellement:
Si la chaîne contient « \ » alors Éclate une chaîne à « \ » et extraire le nom d'utilisateur et le domaine
Else Si la chaîne contient « @ » puis Éclate une chaîne à « @ » et extraire le nom d'utilisateur et le domaine
chaîne de traiter le reste comme nom d'utilisateur sans domaine

Je suis toujours la chasse pour une meilleure solution dans le cas où la chaîne d'entrée est pas dans un format facilement prédit, à savoir « domain \ user @ domain ". Je pense RegEx ...

Mise à jour: Je suis corrigé. Ma réponse est un peu hors contexte, il se réfère au cas général de l'analyse du nom d'utilisateur et des domaines hors de l'entrée de l'utilisateur, comme dans l'invite de connexion utilisateur/ouverture de session. J'espère que ça aide encore quelqu'un.

+0

Besoin d'une solution élégante pour cela. Je suis d'accord. Une réponse à la partie domain \ user est celle-ci: http://stackoverflow.com/a/185716/481656 – DoomerDGR8

13

System.Environment.UserDomainName vous donne le nom de domaine ne

De même, System.Environment.UserName vous donne le nom d'utilisateur ne

+2

> System.Environment.UserDomainName' vous donne le nom de domaine seulement >> De même, 'System.Environment.UserName 'vous donne le nom d'utilisateur seulement Cela ne fonctionnera pas sur ASP.NET –

+0

Je pense que cela fonctionne si vous utilisez authentication = Windows et impersonation = true. Voir - http://stackoverflow.com/questions/8841816/system-web-httpcontext-current-user-identity-name-vs-system-environment-username – FMFF

+0

Mais cela ne fonctionne pas dans .Net Core ... –

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

var userName = components.Last() 

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

On dirait un problème fait à résoudre par des expressions régulières:

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

N'utilise-t-on pas regex ici de manière excessive quand une simple manipulation de chaîne peut être utilisée à la place? – abatishchev

+3

Sons comme: J'ai un problème. Utilisons regex. Maintenant, j'ai deux problèmes :) – abatishchev

+0

Une regex résout le problème en une seule ligne. Ce n'est pas le bon outil pour chaque travail, mais je pense que dans ce cas, la solution regex est plus élégante. –

1

Bien que n'étant pas un. NET intégré, on peut toujours P/Invoke à CredUIParseUserName. Here est un exemple d'utilisation de .NET. PS: Il ne semble pas gérer le "point", comme dans ". \ Nom d'utilisateur".