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
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.
System.Environment.UserDomainName
vous donne le nom de domaine seulement
De même, System.Environment.UserName
vous donne le nom d'utilisateur uniquement
var components = User.Identity.Name.Split('\\');
var userName = components.Last()
var domainName = components.Reverse().Skip(1).FirstOrDefault()
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.
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;
}
Je ne le pense pas, car System.Security.Principal.WindowsIdentity ne contient pas de tels membres.
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".
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, ".*\\\\", "");
}
}