ASP Net MVC Core - 当用户浏览任何页面时从 Active Directory 加载用户数据

ASP Net MVC Core - Load User Data From Active Directory when User browses Any Page

这是我的开发环境:

当用户首次进入我们应用程序中的任何页面时,我试图获取存储在 Active Directory 属性中的数据。所有用户权利和权限、employeeid、studentid 等......都存储在 AD 属性 安全组中。有些属性也需要在网站上显示。

假设我的网站有以下网址...

等....

任何用户都可以从其他 Intranet 门户免费访问该网站的某些 areas/urls,我不知道我应该在哪里编写代码来满足该条件。问题是,没有像 http://mysite/Login 或 Authenticate 等应用程序的特定入口点。如果有,我可以在该单个入口点上从 AD 加载所有用户详细信息和权限。

在MVC5时代,我使用了Custom Global Authorize Attribute并将其放在继承自所有其他控制器的BaseController上以加载AD数据。我在第一次点击时将 AD 的数据放入会话中,并使用静态 Class 显示在视图上并在控制器中使用。但是当我对 MVC Core 进行一些研究时,有人说它已经过时了,我应该使用授权策略而不是自定义授权属性。

从 Active Directory 中获取数据已经通过使用我的旧 Web 服务实现了,我们不需要担心 .Net 核心还不支持 AD。

我查看了有关策略的教程,并看到了有关声明和自定义用户管理器的内容。我无法决定应该使用哪一个来将数据从 Active Directory 加载到持续整个用户会话的对象(可能是 Scoped Object DI)。

我是否应该将数据加载到声明属性中 例如...

var claims = new List<Claim>();
claims.Add(new Claim("UserName", "John.Smith", ClaimValueTypes.String, Issuer));
claims.Add(new Claim("RefNo", "02343001", ClaimValueTypes.String, Issuer));
claims.Add(new Claim("Email", "MyEmail@email.com", ClaimValueTypes.String, Issuer));

或者我应该编写自定义的 SignInManager 和 IdentityUser 吗? 例如...

public class ApplicationUser : IdentityUser
{
    public string RefNo { get; set; }
    public string Email { get; set; }
}

有什么地方可以放置我的代码来检查 AD 和加载数据吗? 我应该将数据存储在该声明的对象中而不是使用会话数据吗?

你们能给我点建议吗?如果我有任何遗漏和我的想法行不通,请随时批评。

你说的没有 System.DirectoryServices 是对的(我保证它在积压中)所以有几个地方可以做到这一点。

如果您已经在使用集成身份验证,您将拥有用于组成员身份的 SID,当您调用 IsInRole() 时会解决这些问题,因此您可以使用基于角色的成员身份(而不是基于声明)来解决基本的身份验证问题。

但是,如果您想支持基于表单的机制,那么您应该考虑使用 the cookie middleware, raw,至少为您提供一个简单的登录,调用您的 Web 服务来验证您的登录。您可以在控制器代码中查询您的 API,并编写一个身份 cookie。此 cookie 自动加密和签名,因此无法被篡改。

当您需要角色和属性时,问题就来了。如果您沿着 cookie 路线前进,您可能会想在将身份作为 cookie 写出之前将所有这些作为声明放入身份中。这可能有效,前提是没有太多 - cookie 有最大大小(取决于浏览器,但通常在 4k 以下)。您可以使用分块 cookie,但这里会影响性能。相反,您可以使用引用 cookie,在其中放置对存储实际完全填充身份的另一家商店的引用,无论是会话、redis 还是其他东西。

然后在 the claims transformation middleware 中,您可以提取参考资料,前往您的商店,重新验证身份。

老实说,我会避免尝试将所有这些合并到 ASP.NET Identity 中。这意味着成为应用程序中用户信息的唯一来源,而在您的情况下,情况并非如此。您的唯一来源应该是 AD。

还有一个 Novell's ldap library 到核心的端口,如果您想避免使用 Web 服务方法,它应该很好地代替 DirectoryServices。