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

Как получить полное имя пользователя в приложении .net MVC 3 для интрасети?

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

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

@User.Identity.Name 

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

4b9b3361

Ответ 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>