通过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中也不存在
我们在Controller Action Methods上使用[Authorize(“ADMIN”)],以及根据场景使用User.IsInRole(“ADMIN”)的各种实例.在那些发生错误并且应用程序爆炸的情况下.
AD基础架构正处于升级/迁移过程中.我不知道那里的所有细节,但我知道有一些域,据说它们之间有信任,基础设施人员已经提到这些信任关系正在运行.
所以我想我想知道两件事:
>这似乎不是我们的代码应该处理的东西.那么域名真的可能出现什么问题?我可以找出信任关系失败的“可信”域名吗?
>解决这个问题的最佳方法是什么?我不喜欢编写辅助方法的想法. Authorize()子类只是为了捕获此异常.
当Windows无法解密web.config文件中“authorization,allow roles”标记下定义的角色时,就会发生这种情况.用于测试注释掉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,您希望启用Forms身份验证和匿名身份验证,其他所有内容都应禁用.使用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