在ASP.NET Core MVC Web应用程序中通过身份验证的用户的上下文中查询AD

时间:2018-09-25 07:15:10

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

我正在基于ASP.NET Core MVC 2.1的Web应用程序上工作。它提供了执行几个与Active Directory相关的操作的能力。其中之一是基于Web的LAPS客户端。为了与AD通信,我使用的是System.DirectoryServices中的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密码的访问。我实现了cookie身份验证,而没有针对AD的身份查询PrincipalContext.ValidateCredentials()来对用户进行身份验证。不用再次询问用户登录数据的最佳方法是什么?

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

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

我希望这在某种程度上是合理的。因此,如果有人可以向正确的方向推动我,我将不胜感激。预先感谢!

1 个答案:

答案 0 :(得分:0)

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