Подтвердить что ты не робот

Встроенный помощник для анализа User.Identity.Name в Domain\Username

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

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

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

4b9b3361

Ответ 1

Это лучше (проще в использовании, без возможности 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();

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

Ответ 2

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

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

Ответ 3

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

var userName = components.Last() 

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

Ответ 4

Я думаю, что нет, потому что я задал себе тот же вопрос на днях: 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;
}

Ответ 5

Вы, ребята, также можете рассмотреть синтаксический ввод строки, например [email protected], или "user @domain".

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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, ".*\\\\", "");
    }
}