如何在.NET Web应用程序中为经过身份验证的用户获取UPN,而无需查询Active Directory

时间:2012-06-08 09:22:25

标签: .net active-directory upn

(这个问题类似于Get UPN or email for logged in user in a .NET web application,但并不完全相同。)

在使用Windows身份验证的.NET(C#)Web应用程序中,我想找到已登录用户的UPN。

我知道如何通过查询Active Directory来执行此操作:从HttpContext.Current.User.Identity as WindowsIdentity获取'DOMAINNAME \ userName';在ldap://RootDSE下查找DOMAINNAME并找到其dnsRoot;在(&(objectCategory=person)(objectClass=user)(sAMAccountName=...userName...))下查询ldap://...dnsRoot...;获取此条目的userPrincipalName属性。 (更多细节在答案https://stackoverflow.com/a/513668/223837)。

我的问题:如果没有调用Active Directory,是否可以找到UPN ?鉴于微软专注于在任何地方使用UPN,UPN是否已经存储在用户向Web服务器进行身份验证时创建的令牌中的某个位置?

(支持观察:如果我在Windows 7上运行whoami /upn,则Wireshark不会显示任何Active Directory连接。)

(如果有任何区别:请注意我们的网络应用不使用模拟,即我们的网络应用不会以用户身份运行。)

2 个答案:

答案 0 :(得分:4)

尝试System.DirectoryServices.AccountManagement.UserPrincipal.Current,其属性为UserPrincipalName。当然,这需要应用程序在Windows身份验证下运行。

编辑嗯,看起来这个API仍然执行目录查找。

答案 1 :(得分:3)

使用System.DirectoryServices.AccountManagement.UserPrincipal.Current时,我遇到了Active Directory查询问题,因此我采用了NameUserPrincipal格式的GetUserNameEx

此函数获取有关当前用户的信息,因此如果您尚未模拟,则需要您进行模拟。在C#中,可以通过导入函数来完成:

public enum EXTENDED_NAME_FORMAT
{
    NameUnknown = 0,
    NameFullyQualifiedDN = 1,
    NameSamCompatible = 2,
    NameDisplay = 3,
    NameUniqueId = 6,
    NameCanonical = 7,
    NameUserPrincipal = 8,
    NameCanonicalEx = 9,
    NameServicePrincipal = 10,
    NameDnsDomain = 12
}

[DllImport("secur32.dll", CharSet = CharSet.Auto)]
public static extern int GetUserNameEx(int nameFormat, StringBuilder userName, ref int userNameSize);

然后这样称呼它:

string upn = null;
StringBuilder userName = new StringBuilder(1024);
int userNameSize = userName.Capacity;
if (GetUserNameEx((int)EXTENDED_NAME_FORMAT.NameUserPrincipal, userName, ref userNameSize) != 0)
{
    upn = userName.ToString();
}