WindowsTokenRoleProvider灾难性失败

时间:2009-10-15 18:32:31

标签: c# asp.net security asp.net-2.0

我尝试使用WindowsTokenRoleProvider保护ASP.NET应用程序时遇到了真的令人沮丧的错误。对于特定用户,我看到抛出以下ProviderException:

API failed due to error 'Catastrophic failure

正如我所说,这似乎只发生在特定用户身上,我似乎能够很好地访问该网站,因此有几位同事。我们与失败用户之间的唯一区别是,他们是托管网站的框架上的管理员。

从GetRolesForUser调用。从MSDN documentation开始,它表明这可能是由于以下原因:

  1. 当前正在执行的用户 没有经过身份验证 WindowsIdentity附加到 Page.User。对于非HTTP 场景,当前正在执行 用户没有经过身份验证 WindowsIdentity附加到 Thread.CurrentPrincipal中。
  2. 用户名与名称不匹配 当前的WindowsIdentity。
  3. 检索时发生故障 用户的Windows组 信息。
  4. 我怀疑问题可能与第3点有关,因为我已经设法在Visual Studio 2008中使用.NET Framework调试功能来调试代码,而且似乎调用失败:

    UnsafeNativeMethods.GetGroupsForUser
    

    我无法理解的是为什么!如果调用在Framework库中失败,那么我不能完全确定如何解决该问题。

    我会收到任何关于此的帮助或建议,因为我不知道从哪里开始,我正在认真考虑使用角色提供程序代替其他一些不太优雅的方法。

1 个答案:

答案 0 :(得分:0)

好的,经过Microsoft ADC的一些非常有用的输入后,我设法解决了这个问题。

对UnsafeNativeMethods.GetGroupsForUser的调用应返回特定用户有权访问的所有 AD组的列表(这是递归的,因此也将包括父组等)。在域之间迁移AD配置文件时,似乎有时,用户最终会得到一个指向没有与之关联的名称的组的错误SID。因为调用尝试获取特定配置文件的所有SID名称,所以当它到达空条目时会失败,导致上面的(相当无用的)“灾难性故障”错误。

作为参考,该组在whoami命令行工具的转储中显示如下(其他组,SID和域名被屏蔽):

DOMAIN\   Deleted account   S-1-2-34-123456789-123456789-123456789-12345   Mandatory group, Enabled by default, Enabled group

如您所见,域名存在,但组不存在。解决方案是让域管理员从用户的个人资料中删除该条目。

我真的希望这个可以帮助其他人解决这个问题,因为它让我完全 flummoxed!