首页 > 解决方案 > 在 ASP.NET Core MVC webapp 中在经过身份验证的用户的上下文中查询 AD

问题描述

我正在开发基于 ASP.NET Core MVC 2.1 的 Web 应用程序。它提供了执行多个 Active Directory 相关操作的能力。其中之一是基于 Web 的 LAPS 客户端。为了与 AD 通信,我使用System.DirectoryServicesfrom Microsoft.Windows.Compatibility

由于 LAPS 将其数据存储在计算机对象 AD 属性 ( ms-Mcs-AdmPwd) 中,因此我需要查询此属性,例如:

using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, targetDomain)) {
    ComputerPrincipal computer = ComputerPrincipal.FindByIdentity(principalContext, IdentityType.Name, computerName);
    string password = (computer.GetUnderlyingObject() as DirectoryEntry).Properties["ms-Mcs-AdmPwd"].Value.ToString();
}

所以我的问题是:我需要在经过身份验证的用户的上下文中执行此操作,因为属性安全权限已经控制了对 LAPS 密码的访问。PrincipalContext.ValidateCredentials()为了验证用户的身份,我实现了 cookie 身份验证,而没有针对 AD 进行身份查询。在不要求用户第二次提供登录数据的情况下实现这一目标的最佳方法是什么?

有一个PrincipalContext构造函数PrincipalContext(ContextType contextType, string name, string userName, string password),但这需要一种方法来存储每个会话的密码。我猜,将密码存储在会话本身是个坏主意。

此外,我可以将服务器端的数据作为ApplicationPoolIdentity或作为专用服务帐户查询(然后需要完全访问所有计算机对象的相关属性),然后实现一些逻辑来确定是否允许登录用户访问此特定密码。但这会导致不必要的工作,因为所有授权信息都已作为 AD DACL 存在。

我希望这在某种程度上是有道理的。因此,如果有人能将我推向正确的方向,我将不胜感激。提前致谢!

标签: c#asp.netdirectoryservicesasp.net-core-2.1

解决方案


毕竟,我采用了映射方法来确定是否允许用户访问数据。如果用户是某个AD组的成员,该组包含某个部门的管理员,并且目标计算机对象位于相应的OU中,则将查询并随后显示密码。ApplicationPoolIdentity执行实际的 AD 查询。到目前为止工作完美。


推荐阅读