您可以在 Active Directory 联合身份验证服务(AD FS)中使用此规则,当需要获取传入声明类型并执行某项操作,以根据您在规则中指定的值决定是否允许或拒绝用户访问。 使用此规则时,会根据规则中配置的选项之一传递或转换与以下规则逻辑匹配的声明:
规则选项 | 规则逻辑 |
---|---|
允许所有用户 | 如果传入声明类型等于任何声明类型和值等于任何值,则发出值等于 Permit 的声明 |
允许具有此传入声明的用户访问 | 如果传入声明类型等于指定的声明类型和值等于指定的声明值,则发出值等于 Permit 的声明 |
拒绝具有此传入声明的用户访问 | 如果传入声明类型等于指定的声明类型和值等于指定的声明值,则发出值等于 Deny 的声明 |
以下部分提供了声明规则的基本简介,并提供有关何时使用此规则的更多详细信息。
关于声明规则
声明规则表示使用传入声明、向其应用条件 (if x, then y) 并基于条件参数生成传出声明的业务逻辑的实例。 下面的列表概述了在进一步阅读本主题中的内容之前应了解的有关声明规则的重要提示:
在“AD FS 管理”管理单元中,只能使用声明规则模板创建声明规则
声明规则处理以下两种传入声明:直接来自声明提供程序(如 Active Directory 或另一个联合身份验证服务),或来自声明提供程序信任上的接受转换规则的输出。
声明规则由声明颁发引擎按给定规则集内的时间顺序处理。 通过为规则设置优先级,可以进一步优化或筛选由给定规则集内以前的规则生成的声明。
声明规则模板始终要求你指定传入声明类型。 但是,你可以使用单个规则处理声明类型相同的多个声明值。
有关声明规则和声明规则集的更多详细信息,请参阅 声明规则的角色。 有关如何处理规则的详细信息,请参阅 声明引擎的角色。 有关如何处理声明规则集的详细信息,请参阅 声明管道的角色。
允许所有用户
使用“允许所有用户”规则模板时,所有用户都将有权访问信赖方。 但是,可以使用其他授权规则进一步限制访问。 如果一个规则允许用户访问信赖方,而另一条规则拒绝用户访问信赖方,则拒绝结果将替代许可证结果,并且拒绝用户访问。
从联合服务被允许访问信赖方的用户仍然可能被信赖方拒绝提供服务。
允许具有此传入声明的用户访问
当您使用“基于传入声明的允许或拒绝用户”规则模板来创建规则并将条件设置为允许时,可以根据传入声明的类型和值来允许特定用户访问信赖方。 例如,可以使用此规则模板创建一个规则,该规则仅允许那些在组声明中具有“域管理员”值的用户。 如果一个规则允许用户访问信赖方,而另一条规则拒绝用户访问信赖方,则拒绝结果将替代许可证结果,并且拒绝用户访问。
有权从联合身份验证服务访问信赖方的用户可能仍会被信赖方拒绝服务。 如果要允许所有用户访问信赖方,请使用“允许所有用户”规则模板。
拒绝具有此传入声明的用户访问
使用基于传入声明规则模板的“允许”或“拒绝用户”创建规则并设置要拒绝的条件时,可以根据传入声明的类型和值拒绝用户对信赖方的访问权限。 例如,可以使用此规则模板创建一个规则,该规则将拒绝所有在组声明中具有“域用户”值的用户。
如果想要使用拒绝条件,同时允许特定用户访问信赖方,则以后必须显式添加具有允许条件的授权规则,以使这些用户能够访问信赖方。
如果声明颁发引擎处理规则集时拒绝用户访问,则进一步的规则处理会关闭,AD FS 会向用户的请求返回“拒绝访问”错误。
授权用户
在 AD FS 中,授权规则用于颁发允许或拒绝声明,该声明将确定是否允许某个用户或一组用户(具体取决于使用的声明类型)访问给定信赖方中基于 Web 的资源。 只能在信赖方信任上设置授权规则。
授权规则集
存在不同的授权规则集,这取决于您需要配置的允许或拒绝操作类型。 这些规则集包括:
颁发授权规则:这些规则确定用户是否可以接收信赖方的声明,从而访问该信赖方。
委派授权规则:这些规则确定用户是否可以充当信赖方的另一个用户。 当用户充当另一个用户时,有关请求用户的声明仍放置在令牌中。
冒充授权规则:这些规则决定用户是否可以完全冒充另一个用户,以便与信赖方进行交互。 模拟其他用户是一项非常强大的功能,因为依赖方将不知道用户正在被模拟。
有关授权规则过程如何适应声明颁发流程的更多详细信息,请参阅声明颁发引擎在其中的角色。
支持的声明类型
AD FS 定义了两种声明类型,用于确定是允许还是拒绝用户。 这些声明类型统一资源标识符(URI)如下所示:
允许: http://schemas.microsoft.com/authorization/claims/permit
拒绝: http://schemas.microsoft.com/authorization/claims/deny
如何创建此规则
可以使用声明规则语言或使用 AD FS 管理管理单元中的 “允许所有用户”规则模板或“基于传入声明允许或拒绝用户”规则模板创建这两个授权规则。 “允许所有用户”规则模板不提供任何配置选项。 但是,基于传入声明规则模板的“允许”或“拒绝用户”提供以下配置选项:
指定声明规则名称
指定传入声明类型
键入传入声明值
允许具有此传入声明的用户访问
拒绝具有此传入声明的用户访问
有关创建此模板的详细说明,请参阅 AD FS 部署指南中的“创建规则以允许所有用户”或“基于传入声明创建规则以允许或拒绝用户”。
使用声明规则语言
如果仅当声明值与自定义模式匹配时才应发送声明,则必须使用自定义规则。 有关详细信息,请参阅 “何时使用自定义声明规则”。
如何基于多个声明创建授权规则的示例
使用声明规则语言语法授权声明时,还可以根据用户原始声明中存在多个声明发出声明。 仅当用户是组编辑器的成员并使用 Windows 身份验证进行身份验证时,以下规则才会发出授权声明:
[type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod",
value == "urn:federation:authentication:windows" ]
&& [type == "http://schemas.xmlsoap.org/claims/Group ", value == "editors"]
=> issue(type = "http://schemas.xmlsoap.org/claims/authZ", value = "Granted");
如何创建授权规则的示例,这些规则将委托谁可以创建或删除联合服务器代理信任
联合身份验证服务可以使用联合服务器代理来重定向客户端请求之前,必须先在联合身份验证服务和联合服务器代理计算机之间建立信任。 默认情况下,在 AD FS 联合服务器代理配置向导中成功提供以下任一凭据时,将建立代理信任:
联合身份验证服务所用的、由代理提供保护的服务帐户
Active Directory 域帐户,该帐户是联合服务器场中所有联合服务器上本地管理员组的成员
如果要指定哪些用户或用户可以为给定的联合身份验证服务创建代理信任,可以使用以下任一委派方法。 根据 AD FS 产品团队对最安全、最不有问题的委派方法的建议,此方法列表按优先级排列。 根据组织的需求,必须仅使用以下方法之一:
在 Active Directory 中创建域安全组(例如 FSProxyTrustCreators),将此组添加到场中每个联合服务器上的本地 Administrators 组,然后仅添加要将此权限委派给新组的用户帐户。 这是首选方法。
将用户的域帐户添加到场中每台联合服务器上的管理员组中。
如果出于某种原因无法使用上述任一方法,还可以为此创建授权规则。 虽然不建议这样做,因为如果此规则没有正确编写可能会导致并发症,但可以使用自定义授权规则来委托哪些 Active Directory 域用户帐户也可以在关联到指定联合服务的所有联合服务器代理之间创建或删除信任关系。
如果选择方法 3,则可以使用以下规则语法发出授权声明,该声明允许指定用户(在本例中,contoso\frankm)为一个或多个联合服务器代理创建联合身份验证服务的信任。 必须使用 Windows PowerShell 命令 Set-ADFSProperties AddProxyAuthorizationRules 应用此规则。
c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", issuer=~"^AD AUTHORITY$" value == "contoso\frankm" ] => issue(Type = "https://schemas.microsoft.com/authorization/claims/permit", Value = "true") exists([Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value == "S-1-5-32-544", Issuer =~ "^AD AUTHORITY$"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/permit", Value = "true"); c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid", Issuer =~ "^AD AUTHORITY$" ] => issue(store="_ProxyCredentialStore",types=("https://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrustManagerSid({0})", param= c.Value ); c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/proxytrustid", Issuer =~ "^SELF AUTHORITY$" ] => issue(store="_ProxyCredentialStore",types=("https://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrustProvisioned({0})", param=c.Value );
稍后,如果想要删除用户以便用户不再创建代理信任,则可以还原为默认代理信任授权规则,以删除用户为联合身份验证服务创建代理信任的权利。 还必须使用 Windows PowerShell 命令 Set-ADFSProperties AddProxyAuthorizationRules 应用此规则。
exists([Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value == "S-1-5-32-544", Issuer =~ "^AD AUTHORITY$"]) => issue(Type = "https://schemas.microsoft.com/authorization/claims/permit", Value = "true"); c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid", Issuer =~ "^AD AUTHORITY$" ] => issue(store="_ProxyCredentialStore",types=("https://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrustManagerSid({0})", param= c.Value ); c:[Type == "https://schemas.microsoft.com/ws/2008/06/identity/claims/proxytrustid", Issuer =~ "^SELF AUTHORITY$" ] => issue(store="_ProxyCredentialStore",types=("https://schemas.microsoft.com/authorization/claims/permit"),query="isProxyTrustProvisioned({0})", param=c.Value );
有关如何使用声明规则语言的详细信息,请参阅 声明规则语言的角色。