Встроенный помощник для анализа User.Identity.Name в домен \ имя пользователя - PullRequest
45 голосов
/ 08 декабря 2008

Есть ли встроенная утилита или помощник для разбора HttpContext.Current.User.Identity.Name, например domain\user раздельно получить доменное имя, если существует и пользователь?

Или есть другой класс для этого?

Я понимаю, что звонить String.Split("\") очень просто, но просто интересно

Ответы [ 8 ]

68 голосов
/ 08 декабря 2008

Это лучше ( проще в использовании, без возможности NullReferenceExcpetion и соответствует правилам кодирования MS о равной обработке пустой и пустой строки ):

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

Использование:

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

Для этого требуется компилятор C # 3.0 (или новее) и не требуется 3.0 .Net для работы после компиляции.

13 голосов
/ 09 июня 2011

System.Environment.UserDomainName дает вам только доменное имя

Аналогично, System.Environment.UserName дает вам только имя пользователя

7 голосов
/ 27 февраля 2013
var components = User.Identity.Name.Split('\\');

var userName = components.Last() 

var domainName = components.Reverse().Skip(1).FirstOrDefault()
4 голосов
/ 02 февраля 2010

Вы, ребята, можете также рассмотреть синтаксический анализ строкового ввода, например, "user@company.com" или "user @ domain".

Вот что я сейчас делаю:
Если строка содержит '\', то разбить строку на '\' и извлечь имя пользователя и домен
Иначе, если строка содержит «@», то разбить строку на «@» и извлечь имя пользователя и домен
Иначе обрабатывать строку как имя пользователя без домена

Я все еще ищу лучшее решение в случае, когда входная строка не в легко предсказуемом формате, то есть "домен \ пользователь @ домен". Я думаю, что RegEx ...

Обновление: я исправлен. Мой ответ немного вне контекста, он относится к общему случаю парсинга имени пользователя и доменов из пользовательского ввода, как в приглашении пользователя войти / войти в систему. Надеюсь, это еще кому-нибудь поможет.

4 голосов
/ 08 декабря 2008

Я тоже думаю, что нет, потому что я задал себе тот же вопрос на днях: D

Вы можете попробовать:

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;
}
1 голос
/ 03 апреля 2014

Хотя это и не встроенный .NET, всегда можно P / Invoke CredUIParseUserName . Вот пример , как использовать его в .NET.

PS: Кажется, он не обрабатывает "точку", как в ". \ Username".

1 голос
/ 08 декабря 2008

Я так не думаю, потому что System.Security.Principal.WindowsIdentity не содержит таких членов.

0 голосов
/ 01 августа 2013

Похоже, проблема решена с помощью регулярных выражений:

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, ".*\\\\", "");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...