每次User.IsInRole是否在Active Directory中查找?

时间:2018-09-07 13:51:13

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

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

场景:

假设我在数据库中总共配置了10个组,并且我想获取用户所属的组列表。因此,我要迭代10个组并调用User.IsInRole(“ group_name”)并准备期望的组列表。每次都会访问Active Directory来检查组中用户的成员身份吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我正在为一个想要向其SW添加AD身份验证的供应商进行调查。简短的答案:是和否:-)

答案很长:我已经分析了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中具有100K个对象的〜40个组)。 但这可能需要一周左右的时间。

如果您对测试结果感兴趣,请通知我。