我正在基于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存在。
我希望这在某种程度上是合理的。因此,如果有人可以向正确的方向推动我,我将不胜感激。预先感谢!
答案 0 :(得分:0)
毕竟,我使用了一种映射方法来确定是否允许用户访问数据。如果用户是包含某个部门管理员的某个AD组的成员,并且目标计算机对象位于相应的OU中,则将查询密码并随后显示密码。 ApplicationPoolIdentity
执行实际的AD查询。到目前为止,一切正常。