web-dev-qa-db-fra.com

Assistant intégré pour analyser User.Identity.Name dans Domain\Username

Existe-t-il un utilitaire ou une aide intégrée pour analyser HttpContext.Current.User.Identity.Name, par exemple. domain\user pour obtenir séparément le nom de domaine s'il existe et l'utilisateur?

Ou y a-t-il une autre classe pour le faire?

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

45
abatishchev

C’est mieux ( plus facile à utiliser, aucune possibilité de NullReferenceExcpetion et conforme aux directives de codage de MS sur le traitement égal des chaînes vides et nulles ):

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

Usage:

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.

68
Aen Sidhe

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

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

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

var userName = components.Last() 

var domainName = components.Reverse().Skip(1).FirstOrDefault()
7
Gruff Bunny

Vous pourriez également envisager d'analyser une entrée de chaîne telle que "[email protected]" ou "utilisateur @ domaine".

C'est ce que je suis en train de faire:
Si la chaîne contient '\', diviser la chaîne en '\' et extraire le nom d'utilisateur et le domaine
Sinon Si la chaîne contient '@', divisez la chaîne en '@' et extrayez le nom d'utilisateur et le domaine.
Sinon traiter la chaîne comme un nom d'utilisateur sans domaine

Je cherche toujours une meilleure solution dans le cas où la chaîne d'entrée n'est pas dans un format facilement prédit, c'est-à-dire "domaine\utilisateur @ domaine". Je pense RegEx ...

Mise à jour: je suis corrigé. Ma réponse est un peu hors contexte, elle fait référence au cas général de l'analyse du nom d'utilisateur et des domaines hors de la saisie de l'utilisateur, comme dans l'invite de connexion/de connexion de l'utilisateur. J'espère que ça aide toujours quelqu'un.

4
Omar

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

Tu peux 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;
}
4
inspite

Je ne le pense pas, car System.Security.Principal.WindowsIdentity ne contient pas de tels membres.

1
Aen Sidhe

Bien que non intégré à .NET, vous pouvez toujours utiliser P/Invoke dans CredUIParseUserName . Voici un exemple d'utilisation en .NET.

PS: Il ne semble pas gérer le "point", comme dans ".\Nom d'utilisateur".

1
Mihai

Cela ressemble à un problème conçu pour être résolu 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
Adam Cooper