【问题标题】:Does User.IsInRole lookup in Active Directory each time?User.IsInRole 是否每次都在 Active Directory 中查找?
【发布时间】:2018-09-07 13:51:12
【问题描述】:

在我们的 MVC 5 Web 应用程序中,我们使用 User.IsInRole() 函数来评估当前登录用户(使用 Windows 身份验证)是否属于 Active Directory 中相应组的一部分。在我本地,此功能正在快速评估,但在生产中需要一些时间。此函数是否每次都命中 Active Directory 并查看用户是否属于组?

场景:

假设我在数据库中配置了总共 10 个组,并且我想获取用户所属的组列表。所以我正在迭代 10 个组并调用 User.IsInRole("group_name") 并准备预期的组列表。这是否会每次都访问 Active Directory 以检查组中用户的成员资格?

【问题讨论】:

  • 如果您能提供minimal reproducible example,那就太好了。
  • @mjwills - 更新了我的场景,我希望这会有所帮助。谢谢。

标签: c# asp.net-mvc-5 active-directory windows-authentication


【解决方案1】:

我也有同样的问题,我正在为希望将 AD 身份验证添加到其 SW 的供应商进行调查。简短的回答:是和否:-)

长答案:我分析了WindowsPrincipal.IsInRole

它不向 AD(通过 LDAP)查询组成员身份,而是使用 Kerberos 令牌中的组 SID 并检查票证中是否包含组的 SID。因此,它不会命中 AD,但是:

如果您使用 IsInRole(string),它会执行 Name ==> SID 查找(使用 win32 LsaLookupNames2() 调用)。

因此,建议先将组名转换为 SID,然后仅使用 SID:

http://msdn.microsoft.com/en-us/library/wak3kd03(v=vs.110).aspx

出于性能原因,建议将 IsInRole(SecurityIdentifier) 重载作为确定用户角色的首选重载。

我还没有检查这个,但我下次会这样做。

我希望有时间做一个基准测试(使用这种方法检查企业 AD 中的约 40 个组,对象数 > 100K)。 但这可能需要一周左右的时间。

如果您对测试结果感兴趣,请告诉我。

【讨论】:

  • 感谢您提供详细信息。请分享您的测试结果我对那些非常感兴趣......再次感谢:)
  • 好的,我要做一些测试。我下周放假,但我很快就会继续。请继续关注:-)
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多