首页 文章

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

提问于
浏览
1

这是我的开发环境:

  • 内联网网站

  • Active Directory身份验证/授权

  • Asp Net Core

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

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

等等....

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

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

通过使用旧的Web服务已经实现了从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 回答

  • 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 .

相关问题