我有一个用户,当我尝试使用其中任何一个来枚举她的群组时
用户计算机上的System.Security.Principal.WindowsIdentity.GetCurrent().Groups
或IIS服务器上的System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups
,我会得到他们旧组的列表,而不是他们的新组。
我已经检查了他们进行身份验证的DC,并且ASP.NET页面正在SharePoint实例中运行,因此LogonUserIdentity最喜欢从Kerberos票证中提供。
我应该直接从AD中查找组而不是依赖于WindowsIdentity或LogonUserIdentity吗?
答案 0 :(得分:5)
如果您使用WindowsIdentity
或LogonUserIdentity
,它将从存储在Kerberos票证授予票证(TGT)中的授权数据中检索组信息。
它功能强大且非常实用,因为一旦您通过身份验证并获得Kerberos TGT,就无需再次查询Active Directory以获取所有组信息。实际上,群组枚举非常昂贵且复杂。因此,首选Kerberos票证方法,并在访问任何Windows资源时使用此方法。
但是,这也意味着在您将用户帐户添加到群组后,WindowsIdentity
或LogonUserIdentity
方法将无法了解新添加的群组。您必须清除Kerberos票证并再次获取它。您可以注销然后登录,也可以锁定屏幕并输入密码来解锁屏幕。
如果由于某些原因,您仍希望自己进行组枚举,我建议您在.NET 3.5中使用UserPrincipal.GetAuthorizationGroups。它返回用户所属的所有安全组。