(这个问题类似于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连接。)
(如果有任何区别:请注意我们的网络应用不使用模拟,即我们的网络应用不会以用户身份运行。)
答案 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();
}