在 ASP.NET Core MVC webapp 中在经过身份验证的用户的上下文中查询 AD
Querying AD in context of an authenticated user in an ASP.NET Core MVC webapp
我正在开发基于 ASP.NET Core MVC 2.1 的 Web 应用程序。它提供了执行多个 Active Directory 相关操作的能力。其中之一是基于 Web 的 LAPS 客户端。为了与 AD 通信,我使用 Microsoft.Windows.Compatibility
中的 System.DirectoryServices
。
由于 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 密码的访问。我在没有针对 AD 进行身份查询 PrincipalContext.ValidateCredentials()
的情况下实施了 cookie 身份验证,以便对用户进行身份验证。在不再次询问用户登录数据的情况下实现此目标的最佳方法是什么?
有一个 PrincipalContext
构造函数 PrincipalContext(ContextType contextType, string name, string userName, string password)
,但这需要一种方法来存储每个会话的密码。我猜想,将密码存储在会话本身中并不是一个好主意。
此外,我可以将服务器端的数据作为 ApplicationPoolIdentity
或作为专用服务帐户(这将需要对所有计算机对象的相关属性的完全访问权限)进行查询,然后实现一些逻辑来确定是否允许登录用户访问此特定密码。但这会导致不必要的工作,因为所有授权信息都已作为 AD DACL 存在。
我希望这是有道理的。所以如果有人能把我推向正确的方向,我将不胜感激。提前致谢!
毕竟,我采用映射方法来确定是否允许用户访问数据。如果用户是某个包含某个部门管理员的AD组的成员,并且目标计算机对象位于相应的OU中,则将查询密码并随后显示。 ApplicationPoolIdentity
执行实际的 AD 查询。到目前为止工作完美。
我正在开发基于 ASP.NET Core MVC 2.1 的 Web 应用程序。它提供了执行多个 Active Directory 相关操作的能力。其中之一是基于 Web 的 LAPS 客户端。为了与 AD 通信,我使用 Microsoft.Windows.Compatibility
中的 System.DirectoryServices
。
由于 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 密码的访问。我在没有针对 AD 进行身份查询 PrincipalContext.ValidateCredentials()
的情况下实施了 cookie 身份验证,以便对用户进行身份验证。在不再次询问用户登录数据的情况下实现此目标的最佳方法是什么?
有一个 PrincipalContext
构造函数 PrincipalContext(ContextType contextType, string name, string userName, string password)
,但这需要一种方法来存储每个会话的密码。我猜想,将密码存储在会话本身中并不是一个好主意。
此外,我可以将服务器端的数据作为 ApplicationPoolIdentity
或作为专用服务帐户(这将需要对所有计算机对象的相关属性的完全访问权限)进行查询,然后实现一些逻辑来确定是否允许登录用户访问此特定密码。但这会导致不必要的工作,因为所有授权信息都已作为 AD DACL 存在。
我希望这是有道理的。所以如果有人能把我推向正确的方向,我将不胜感激。提前致谢!
毕竟,我采用映射方法来确定是否允许用户访问数据。如果用户是某个包含某个部门管理员的AD组的成员,并且目标计算机对象位于相应的OU中,则将查询密码并随后显示。 ApplicationPoolIdentity
执行实际的 AD 查询。到目前为止工作完美。