加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

active-directory – User.IsInRole(“fake group”)导致“主域

发布时间:2020-12-14 04:14:16 所属栏目:Windows 来源:网络整理
导读:我有一个MVC 3应用程序,使用 Windows身份验证和声明使用WIF 4.5. 通过AD组中的成员资格(当前)控制对应用程序的访问: deny users="?" /allow roles="domainsomegroup" /deny users="*" / 除AD组外,我们还需要添加自定义角色. (此应用程序正在从Forms转换为W
我有一个MVC 3应用程序,使用 Windows身份验证和声明使用WIF 4.5.

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

<deny users="?" />
<allow roles="domainsomegroup" />
<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()子类只是为了捕获此异常.

请转到inetmgr,站点,默认网站,站点名称,iis组,双击身份验证,禁用匿名身份验证,然后重置应用程序池.

当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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读