10

我有一个 MVC 3 应用程序,使用 Windows 身份验证和使用 WIF 4.5 的声明。

通过 AD 组中的成员资格(当前)控制对应用程序的访问:

<deny users="?" />
<allow roles="domain\somegroup" />
<deny users="*" />

除了 AD 组之外,我们还有需要添加的自定义角色。(此应用正在从 Forms 转换为 Windows 身份验证)

为了支持这些自定义角色(直到它们在 AD 中进行管理),我们将它们作为 ClaimTypes.GroupSid 声明添加给用户,以便现有代码利用[Authorize("ADMIN")]User.IsInRole("ADMIN")继续运行:

Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    var identity = ClaimsPrincipal.Current.Identity as WindowsIdentity;
    var roles = userDAL.GetRoles(identity.Name);
    foreach(var role in roles)
    {
        identity.AddClaim(new Claim(ClaimTypes.GroupSid, role));
    }
}

这一切都按预期工作。

除非当前用户不是某个自定义角色(如 ADMIN)的成员,并且该角色在 AD 中也不存在

我们[Authorize("ADMIN")]在控制器操作方法上使用,以及User.IsInRole("ADMIN")在场景中依赖的各种实例。正是在那些发生错误并且应用程序崩溃的情况下。

AD 基础架构正在进行升级/迁移。我不知道那里的所有细节,但我知道有一些域,据说它们之间存在信任,基础设施人员向我暗示这些信任关系已经启动并运行。

所以真的我想我想知道两件事:

  1. 这看起来真的不是我们的代码应该处理的事情。那么,域名到底有什么问题呢?我可以找出信任关系失败的“受信任”域吗?

  2. 解决此问题的最佳方法是什么?我不喜欢编写辅助方法和Authorize()子类只是为了捕获此异常的想法。

4

2 回答 2

2

请进入inetmgr,站点,默认网站,站点名称,iis组,双击认证,禁用匿名认证,然后重置应用池。

当 Windows 无法破译在 web.config 文件中的“授权,允许角色”标签下定义的角色时,就会出现这种情况。用于测试注释掉 web.config 文件中的自定义角色标签。该问题似乎是在混淆表单身份验证和 Windows 身份验证时引起的。魔术发生在 Global.asax 文件 Application_PostAuthenticateRequest 方法中,当使用 Forms 身份验证时,您可以将 User.Identity 转换为 FormsIdentity,然后从 FormsIdentity Ticket 创建自定义身份,然后从自定义身份创建自定义原则,然后您将能够将 CustomPrincipal 附加到当前用户和当前主体,即。

Dim fIdent As FormsIdentity = CType(User.Identity, FormsIdentity)
Dim ci As New CustomIdentity(fIdent.Ticket) 
Dim cp As New CustomPrincipal(ci)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp

对于要启用表单身份验证和匿名身份验证的 IIS,应禁用其他所有内容。使用 Windows 身份验证时,Global.asax 文件 Application_PostAuthenticateRequest 方法可以直接从 User.Identity 创建自定义原则,即。

Dim cp As New CustomPrincipal(User.Identity)
HttpContext.Current.User = cp : Thread.CurrentPrincipal = cp

在这种情况下,IIS 设置应该是 Windows 身份验证并启用 ASP.Net 模拟,并且禁用其他所有设置。

混淆这些身份验证方法会导致“主域和受信任域之间的信任关系失败”错误,因为如果您的 Application_PostAuthenticateRequest 方法由于某种原因没有实现 CustomPrinciple,那么 Windows 将尝试使用内置的 IsInRole 函数来检查针对域角色的角色,而不是使用您的 CustomPrinciple 代码隐藏文件中的自定义 IsInRole。

这是一篇有用的文章和链接:

http://www.codeproject.com/Articles/8819/Authorize-and-authenticate-users-with-AD https://msdn.microsoft.com/en-us/library/ff647405.aspx
https://support。 microsoft.com/en-us/kb/306359

于 2015-04-23T19:49:54.020 回答
0

如果您的受信任域配置不可用,则会发生这种情况,IsInRole 也会在受信任域中搜索组,并且如果受信任域不可用,则会引发信任豁免。

于 2019-11-22T15:01:12.420 回答