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

Asp.net core ASP Net MVC Core-当用户浏览任何页面时从Active Directory加载用户数据,asp.net-core,asp.net-core-mvc,claims-based-identity,Asp.net Core,Asp.net Core Mvc,Claims Based Identity,以下是我的开发环境: 内联网网站 Active Directory身份验证/授权 Asp网络核心 当用户首先进入应用程序中的任何页面时,我试图获取存储在Active Directory属性中的数据。所有用户权限、员工ID、学生ID等。。。。存储在AD属性和安全组中。一些属性也需要显示在网站上 假设我的网站有以下网址 等等 任何用户都可以从其他Intranet门户免费访问网站的某些区域/URL,我不知道应该在哪里编写代码来满足这些标准。问题是,应用程序没有特定的入口点,比如身份验证

以下是我的开发环境:

  • 内联网网站
  • Active Directory身份验证/授权
  • Asp网络核心
当用户首先进入应用程序中的任何页面时,我试图获取存储在Active Directory属性中的数据。所有用户权限、员工ID、学生ID等。。。。存储在AD属性安全组中。一些属性也需要显示在网站上

假设我的网站有以下网址

等等

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

在MVC5时代,我使用了自定义全局授权属性,并将其放在BaseController上,以从所有其他控制器继承该属性来加载该AD数据。我在第一次点击时将广告的数据放入会话中,并使用静态类在视图上显示和在控制器中使用。但是当我在MVC内核中做一些研究时,有人说它已经过时了,我应该使用授权策略而不是自定义授权属性

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

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

我应该将数据加载到索赔属性上吗 例如

有没有地方我可以把我的代码检查广告和加载数据? 我应该将数据存储在声明的对象中,而不是使用会话数据吗


你们能给我一些建议吗?如果我遗漏了任何东西,并且我的想法不起作用,请随意批评。

你说的没错,没有System.DirectoryServices(我保证,它在积压工作中),所以有几个地方可以这样做

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

然而,如果您想支持基于表单的机制,那么您应该考虑使用调用web服务来验证您的登录,至少可以为您提供一个简单的登录。您可以在控制器代码中查询API,并编写标识cookie。此cookie会自动加密和签名,因此不能被篡改

当您需要角色和属性时,问题就会出现。如果您沿着cookie路线前进,您可能会在将标识作为cookie写出之前,将所有这些作为声明放在标识中。如果数量不太多,这可能会起作用——cookies的最大大小(取决于浏览器,但通常小于4k)。您可以使用分块cookie,但这会影响性能。相反,您可以使用一个引用cookie,在其中输入对另一个存储了实际完全填充的标识的存储的引用,可以是会话、redis或其他

然后,你可以把参考资料拿出来,去你的商店,并重新水化身份

老实说,我不会尝试将所有这些合并到ASP.NET标识中。这意味着它是应用程序中用户信息的唯一来源,而在您的情况下,这是不正确的。你的唯一来源应该是广告


还有一个到核心的端口,如果您想避免使用web服务方法,它应该很好地支持DirectoryServices。

谢谢,我想我会继续使用我已经在所有其他项目中使用的web服务方法。我已经看了你关于Auths的两个视频,我正试图通过创建RequirementHandler和Policy并将其放在BaseController上来做同样的事情。因此,每当用户点击我网站上的任何区域时,就会加载来自广告的信息。声明转换中间件是我不知道的事情。我也会对它做一些研究。在策略中这样做很好,只需缓存一段时间以提高性能。新的AD ASPNetCore库一周前发布。(). 我想和你核实一下,这只用于Windows身份验证,对吗?它与从AD获取数据无关,反之亦然。谢谢。那不是正式的包裹。我不知道是谁写的。是的,看起来它只是为ntlm写的
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));
public class ApplicationUser : IdentityUser
{
    public string RefNo { get; set; }
    public string Email { get; set; }
}