如何在.net MVC 3 Intranet应用程序中获取用户的全名?

Cha*_* Ma 32 asp.net-mvc-3

我有一个MVC 3内部网应用程序,它执行针对特定域的Windows身份验证.我想呈现当前用户的名字.

在视图中,

@User.Identity.Name 
Run Code Online (Sandbox Code Playgroud)

设置为DOMAIN\Username,我想要的是他们的全部Firstname Lastname

vcs*_*nes 56

你可以这样做:

using (var context = new PrincipalContext(ContextType.Domain))
{
    var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
    var firstName = principal.GivenName;
    var lastName = principal.Surname;
}
Run Code Online (Sandbox Code Playgroud)

您需要添加对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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您从视图而不是控制器中执行此操作,则还需要向web.config添加程序集引用:

<add assembly="System.DirectoryServices.AccountManagement" />
Run Code Online (Sandbox Code Playgroud)

添加下configuration/system.web/assemblies.

  • 弄清楚了,必须将DLL的"复制本地"属性设置为true.:) (5认同)
  • 对于MVC4,web.config在`configuration/system.web/pages/namespaces`中需要`<add namespace ="System.DirectoryServices.AccountManagement"/>`. (4认同)

Sea*_*ddy 7

另一种选择,无需帮助程序......您可以在需要使用这些值之前声明上下文和主体,然后像标准输出一样使用它...

@{ // anywhere before needed in cshtml file or view
    var context = new PrincipalContext(ContextType.Domain);
    var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
}
Run Code Online (Sandbox Code Playgroud)

然后在文档中的任何位置,只需根据需要调用每个变量:

@principal.GivenName // first name
@principal.Surname // last name
Run Code Online (Sandbox Code Playgroud)