Как получить имя пользователя без домена
На странице aspx я получаю имя пользователя Windows с помощью функции Request.LogonUserIdentity.Name
. Эта функция возвращает строку в формате "domain\user".
Есть ли какая-то функция только для получения имени пользователя, не прибегая к IndexOf
и Substring
, как это?
public static string StripDomain(string username)
{
int pos = username.IndexOf('\\');
return pos != -1 ? username.Substring(pos + 1) : username;
}
Ответы
Ответ 1
Я так не верю. У меня есть имя пользователя, использующее эти методы раньше -
System.Security.Principal.IPrincipal user = System.Web.HttpContext.Current.User;
System.Security.Principal.IIdentity identity = user.Identity;
return identity.Name.Substring(identity.Name.IndexOf(@"\") + 1);
или
Request.LogonUserIdentity.Name.Substring(Request.LogonUserIdentity.Name.LastIndexOf(@"\") + 1);
Ответ 2
Если вы используете проверку подлинности Windows.
Этого просто можно достичь, вызвав System.Environment.UserName
, который даст вам только имя пользователя.
Если вы хотите использовать только имя домена, вы можете использовать System.Environment.UserDomainName
Ответ 3
Получение деталей [1] не является безопасным подходом. Я бы предпочел использовать LINQ.Last():
WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
if (windowsIdentity == null)
throw new InvalidOperationException("WindowsIdentity is null");
string nameWithoutDomain = windowsIdentity.Name.Split('\\').Last();
Ответ 4
Если вы используете .NET 3.5, вы всегда можете создать метод расширения для класса WindowsIdentity, который сделает это для вас.
public static string NameWithoutDomain( this WindowsIdentity identity )
{
string[] parts = identity.Name.Split(new char[] { '\\' });
//highly recommend checking parts array for validity here
//prior to dereferencing
return parts[1];
}
Таким образом, все, что вам нужно сделать в любом месте вашего кода, это ссылка:
Request.LogonUserIdentity.NameWithoutDomain();
Ответ 5
static class IdentityHelpers
{
public static string ShortName(this WindowsIdentity Identity)
{
if (null != Identity)
{
return Identity.Name.Split(new char[] {'\\'})[1];
}
return string.Empty;
}
}
Если вы включите этот код, вы можете просто сделать что-то вроде:
WindowsIdentity a = WindowsIdentity.GetCurrent();
Console.WriteLine(a.ShortName);
Очевидно, что в веб-среде вы не будете писать на консоль - просто пример...
Ответ 6
Я предлагал использовать regexpes, но они были бы излишними.
[System.String.Split] (http://msdn.microsoft.com/en-us/library/b873y76a(VS.80).aspx) выполнить задание.
string[] parts= username.Split( new char[] {'\\'} );
return parts[1];
Ответ 7
Просто случайный способ сделать то же самое:
var usernameWithoutDomain = Path.GetFileName(@"somedomain\someusername")
Это просто безопасно, так как не проверяется @вариант имени пользователя.