【问题标题】:Why might UserPrincipal.GetAuthorizationGroups() fail for one principal but not another?为什么 UserPrincipal.GetAuthorizationGroups() 可能会因一个主体而失败,而另一个主体却不会?
【发布时间】:2014-11-10 17:41:55
【问题描述】:

我在 ASP.Net MVC 网站中运行以下代码:

  using (var ctx = new PrincipalContext(ContextType.Domain, DOMAIN))
  using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, principal.Identity.Name))
  using (var groups = userPrincipal.GetAuthorizationGroups())

代码使用自定义 RoleProvider,变量“principal”是 HttpContext.Current.User。 DOMAIN 是我的本地域。

当我登录该站点时,此代码运行良好,但如果我以几个测试用户中的任何一个用户身份登录,则会在最后一行引发异常。

While trying to retrieve the authorization groups, an error (5) occurred.

测试用户在域上的权限较少,但是是活动目录中的用户。我尝试使用提供我的用户名和密码的替代构造函数来创建 PrincipalContext,但它对行为没有任何影响。

这既发生在我的开发机器上,也发生在单独的登台服务器上,所以我认为这与本地权限无关。我也看不到它与用户权限的关系,因为我希望 Active Directory 请求作为 IIS 应用程序池用户(模拟已关闭)或者可能是 PrincipalContext 构造函数中指定的用户。

任何关于发生的事情的建议都非常感谢。

【问题讨论】:

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


    【解决方案1】:

    他们是 Active Directory 中的用户是不够的。 IIS 应用程序池用户需要是 Windows 授权访问组的成员才能执行 GetAuthorizationGroups。

    在这里回答:While trying to retrieve the authorization groups, an error (5) occurred

    【讨论】:

    • 谢谢,但我不确定我是否关注 - 你是说可能登录到该站点的每个人都必须是该组的成员吗?我似乎不在该组中,但我可以登录该站点(不过我是域管理员,不确定这是否有帮助)
    • 每个人都必须是该组的成员,除非您实施某种有限的模拟,是的。另外:作为域管理员意味着您可以完全访问所有内容,是的:)
    • 嗯,我已将测试用户添加到 Windows 授权访问,但他们仍然无法登录。我明天再试一次,以防有任何缓存影响。
    • @Dan - 由于您没有使用用户凭据对查找进行身份验证,因此您正在使用工作进程域凭据(如果没有凭据,NETWORK SERVICE 和 IIS APPPOOL 用户使用 DOMAIN\MACHINE$ 用户凭据已使用),因此您必须将计算机的帐户添加到 Windows 授权访问组。至于为什么它适用于某些人而不适用于其他人,这取决于许多因素,例如分配给组的权限以及它们是否对执行查询的用户可见。
    • @Erik 谢谢,这似乎是拼图中缺失的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2020-08-26
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多