我有一个 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 基础架构正在进行升级/迁移。我不知道那里的所有细节,但我知道有一些域,据说它们之间存在信任,基础设施人员向我暗示这些信任关系已经启动并运行。
所以真的我想我想知道两件事:
这看起来真的不是我们的代码应该处理的事情。那么,域名到底有什么问题呢?我可以找出信任关系失败的“受信任”域吗?
解决此问题的最佳方法是什么?我不喜欢编写辅助方法和
Authorize()
子类只是为了捕获此异常的想法。