Как я могу получить полное имя пользователя в интрасети приложения .net MVC 3? - PullRequest
31 голосов
/ 17 января 2012

У меня есть приложение для внутренней сети MVC 3, которое выполняет проверку подлинности Windows для определенного домена.Я хотел бы отобразить имя текущего пользователя.

в представлении,

@User.Identity.Name 

установлено на DOMAIN\Username, то, что я хочу, это его полное Firstname Lastname

Ответы [ 4 ]

56 голосов
/ 17 января 2012

Вы можете сделать что-то вроде этого:

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.

7 голосов
/ 06 сентября 2013

Другой вариант, не требуя помощника ... Вы можете просто объявить контекст и принципал, прежде чем вам понадобится использовать эти значения, а затем использовать его как стандартный вывод ...

@{ // 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
2 голосов
/ 21 июня 2016

Если у вас много контроллеров, тогда подход @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>
1 голос
/ 21 мая 2015

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