这是我的开发环境:
当用户首先进入我们应用程序中的任何页面时,我试图将数据存储在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吗?
你们能告诉我吗?如果我错过了什么,请随意批评我的想法不起作用。
答案 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。