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

时间:2016-09-27 21:47:37

标签: asp.net-core asp.net-core-mvc claims-based-identity

这是我的开发环境:

  • 内联网网站
  • Active Directory身份验证/授权
  • Asp Net Core

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

让我们说我的网站有以下网址......

等...

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

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

使用旧的网络服务已经实现了从Active Directory获取数据,我们不必担心.Net核心还不支持AD。

我查看了有关Policy的教程,并了解了有关声明和自定义用户管理器的内容。我无法决定将哪一个用于将数据从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并加载数据吗? 我应该将数据存储在该Claimed Object中而不是使用Session Data吗?

你们能告诉我吗?如果我错过了什么,请随意批评我的想法不起作用。

1 个答案:

答案 0 :(得分:2)

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

如果您已经在使用集成身份验证,则您拥有组成员身份的SID,这些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。