Как получить полное имя пользователя в приложении .net MVC 3 для интрасети?
У меня есть приложение интрасети MVC 3, которое выполняет проверку подлинности Windows для определенного домена. Я хотел бы отобразить текущее имя пользователя.
в представлении
@User.Identity.Name
установлен в DOMAIN\Username
, то, что я хочу, это их полный Firstname Lastname
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
using (var context = new PrincipalContext(ContextType.Domain))
{
var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
var firstName = principal.GivenName;
var lastName = principal.Surname;
}
Вам нужно добавить ссылку на сборку System.DirectoryServices.AccountManagement
.
Вы можете добавить помощник Razor следующим образом:
@helper AccountName()
{
using (var context = new PrincipalContext(ContextType.Domain))
{
var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
@principal.GivenName @principal.Surname
}
}
Если вы хотите сделать это из представления, а не из контроллера, вам нужно добавить ссылку на сборку в ваш web.config:
<add assembly="System.DirectoryServices.AccountManagement" />
Добавьте это под configuration/system.web/assemblies
.
Ответ 2
Другой вариант, не требующий помощника... Вы могли бы просто объявить контекст и принцип, прежде чем вам нужно будет использовать эти значения, а затем использовать его как стандартный вывод...
@{ // anywhere before needed in cshtml file or view
var context = new PrincipalContext(ContextType.Domain);
var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
}
Затем в любом месте документа просто вызовите каждую переменную по мере необходимости:
@principal.GivenName // first name
@principal.Surname // last name
Ответ 3
Если вы обновили до Identity 2 и используете заявки, то такая информация будет требованием. Попробуйте создать метод расширения:
public static string GetFullName(this IIdentity id)
{
var claimsIdentity = id as ClaimsIdentity;
return claimsIdentity == null
? id.Name
: string.Format("{0} {1}",
claimsIdentity.FindFirst(ClaimTypes.GivenName).Value,
claimsIdentity.FindFirst(ClaimTypes.Surname).Value);
}
Затем вы можете использовать его в представлении следующим образом:
@Html.ActionLink("Hello " + User.Identity.GetFullName() + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "Manage" })
Ответ 4
Если у вас много контроллеров, то использование подхода @vcsjones может быть болезненным.
Поэтому я бы предложил создать метод расширения для TIdentity.
public static string GetFullName(this IIdentity id)
{
if (id == null) return null;
using (var context = new PrincipalContext(ContextType.Domain))
{
var userPrincipal = UserPrincipal.FindByIdentity(context, id.Name);
return userPrincipal != null ? $"{userPrincipal.GivenName} {userPrincipal.Surname}" : null;
}
}
И затем вы можете использовать его в своем представлении:
<p>Hello, @User.Identity.GetFullName()!</p>