使用WindowsIdentity.GetCurrent()枚举组返回旧的组集

时间:2011-02-01 22:33:37

标签: asp.net active-directory credentials

我有一个用户,当我尝试使用其中任何一个来枚举她的群组时 用户计算机上的System.Security.Principal.WindowsIdentity.GetCurrent().Groups 或IIS服务器上的System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups,我会得到他们旧组的列表,而不是他们的新组。

我已经检查了他们进行身份验证的DC,并且ASP.NET页面正在SharePoint实例中运行,因此LogonUserIdentity最喜欢从Kerberos票证中提供。

我应该直接从AD中查找组而不是依赖于WindowsIdentity或LogonUserIdentity吗?

1 个答案:

答案 0 :(得分:5)

如果您使用WindowsIdentityLogonUserIdentity,它将从存储在Kerberos票证授予票证(TGT)中的授权数据中检索组信息。

它功能强大且非常实用,因为一旦您通过身份验证并获得Kerberos TGT,就无需再次查询Active Directory以获取所有组信息。实际上,群组枚举非常昂贵且复杂。因此,首选Kerberos票证方法,并在访问任何Windows资源时使用此方法。

但是,这也意味着在您将用户帐户添加到群组后,WindowsIdentityLogonUserIdentity方法将无法了解新添加的群组。您必须清除Kerberos票证并再次获取它。您可以注销然后登录,也可以锁定屏幕并输入密码来解锁屏幕。

如果由于某些原因,您仍希望自己进行组枚举,我建议您在.NET 3.5中使用UserPrincipal.GetAuthorizationGroups。它返回用户所属的所有安全组。