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信息