Windows 身份验证后获取用户 DirectoryEntry
Get User DirectoryEntry after Windows Authentication
当用户在我的 WebAPI 应用程序中进行 Windows 身份验证时,我使用 UserPrincipal.Current
,我得到的错误是
System.DirectoryServices.AccountManagement.GroupPrincipal cannot be converted to System.DirectoryServices.AccountManagement.UserPrincipal
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
我是not the only one to have this problem.
但我已经正确填充了 ApiController.User
对象。所以我尝试了:
Principal principal = (Principal)User;
principal.GetUnderlyingObject(...
但是不行,因为
IPrincipal cannot be converted to Principal
所以,我必须转换为 Windows 主体,这有效:
WindowsPrincipal winPrincipal = (WindowsPrincipal)User;
然后我必须为该特定用户请求 AD:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
Principal principal = Principal.FindByIdentity(pc, windowsPrincipal.Identity.Name);
principal.GetUnderlyingObject(...
}
在 10 例中的 9 例中这有效,但对于某些用户,主体为空,尽管用户已通过身份验证。 受影响的用户都是某个子域的一部分。我忽略了什么?是否有另一种更可靠的方法来始终获取 Windows 已验证主体的 AD 主体?
您需要将作为核心 .NET 安全接口的 IPrincipal
(和 IIdentity
)接口与 AD 中的 UserPrincipal
分开 - 这些是 NOT 同一件事,没有直接关系。
在 AD 中,您可以随时使用
UserPrincipal current = UserPrincipal.Current;
获取当前用户的AD信息
当用户在我的 WebAPI 应用程序中进行 Windows 身份验证时,我使用 UserPrincipal.Current
,我得到的错误是
System.DirectoryServices.AccountManagement.GroupPrincipal cannot be converted to System.DirectoryServices.AccountManagement.UserPrincipal
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) at System.DirectoryServices.AccountManagement.UserPrincipal.get_Current()
我是not the only one to have this problem.
但我已经正确填充了 ApiController.User
对象。所以我尝试了:
Principal principal = (Principal)User;
principal.GetUnderlyingObject(...
但是不行,因为
IPrincipal cannot be converted to Principal
所以,我必须转换为 Windows 主体,这有效:
WindowsPrincipal winPrincipal = (WindowsPrincipal)User;
然后我必须为该特定用户请求 AD:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
Principal principal = Principal.FindByIdentity(pc, windowsPrincipal.Identity.Name);
principal.GetUnderlyingObject(...
}
在 10 例中的 9 例中这有效,但对于某些用户,主体为空,尽管用户已通过身份验证。 受影响的用户都是某个子域的一部分。我忽略了什么?是否有另一种更可靠的方法来始终获取 Windows 已验证主体的 AD 主体?
您需要将作为核心 .NET 安全接口的 IPrincipal
(和 IIdentity
)接口与 AD 中的 UserPrincipal
分开 - 这些是 NOT 同一件事,没有直接关系。
在 AD 中,您可以随时使用
UserPrincipal current = UserPrincipal.Current;
获取当前用户的AD信息