在我们的MVC 5 Web应用程序中,我们使用User.IsInRole()函数评估当前登录的用户(使用Windows身份验证)是否是Active Directory中各个组的一部分。在我当地,此功能正在快速评估,但在生产中却需要一些时间。此功能是否每次都击中Active Directory并查看用户是否属于组?
假设我在数据库中总共配置了10个组,并且我想获取用户所属的组列表。因此,我要迭代10个组并调用User.IsInRole(“ group_name”)并准备期望的组列表。每次都会访问Active Directory来检查组中用户的成员身份吗?
答案 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个组)。 但这可能需要一周左右的时间。
如果您对测试结果感兴趣,请通知我。