c# - 在 ASP.NET Core MVC webapp 中在经过身份验证的用户的上下文中查询 AD
问题描述
我正在开发基于 ASP.NET Core MVC 2.1 的 Web 应用程序。它提供了执行多个 Active Directory 相关操作的能力。其中之一是基于 Web 的 LAPS 客户端。为了与 AD 通信,我使用System.DirectoryServices
from 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 存在。
我希望这在某种程度上是有道理的。因此,如果有人能将我推向正确的方向,我将不胜感激。提前致谢!
解决方案
毕竟,我采用了映射方法来确定是否允许用户访问数据。如果用户是某个AD组的成员,该组包含某个部门的管理员,并且目标计算机对象位于相应的OU中,则将查询并随后显示密码。ApplicationPoolIdentity
执行实际的 AD 查询。到目前为止工作完美。
推荐阅读
- ios - Swift - 如何将 UILabel 上的文本垂直居中?
- c# - 为什么在将 Microsoft OneDrive 示例与 UWP 应用程序一起使用时出现 AADSTS50011 错误
- windows - 按文件名的一部分将文本文件排序到文件夹中
- c# - 配置管理器 Dll 的 Redistributable
- math - 根据已知的旋转角度计算其他角度
- sql - 范围 laravel 空结果
- sql - 虽然日期小于或等于 Redshift 加入
- sql - 在 SQL 查询中执行 MINUS 时忽略列
- r - 连续变量作为随机效应?(R中的lme函数)
- c - 在 C (Linux) 中在不忙于等待的情况下向线程添加优先级