能否让ADFS在用户名密码认证阶段同时校验用户角色?
实现ADFS认证时的角色校验(针对OpenIdConnect场景)
好问题!你提到的需求完全可以在ADFS里实现——虽然严格来说角色校验属于授权范畴,但ADFS的灵活规则机制允许我们把这一步整合到认证流程中,完美匹配你区分站点A、B的场景。结合你用OpenIdConnect、用户信息存在LDAP的情况,具体实现步骤如下:
第一步:让ADFS从LDAP获取用户角色声明
首先得确保ADFS能从你的LDAP(比如Active Directory)中提取用户的角色/组信息,转化为认证令牌里的声明。操作步骤:
- 打开ADFS管理控制台,找到Claims Provider Trusts,右键默认的Active Directory信任,选择Edit Claim Rules。
- 点击Add Rule,选择
Send LDAP Attributes as Claims模板,点击下一步。 - 设置规则名称(比如“Extract User Roles”),选择LDAP属性存储为你的Active Directory。
- 在LDAP属性列选择
Token-Groups - Unqualified Names(或者Member Of,取决于你想用组名还是组DN),然后在传出声明类型列选择Role(或者标准声明类型http://schemas.microsoft.com/ws/2008/06/identity/claims/role)。 - 完成规则创建,这样ADFS在认证时就会把用户所属的组作为
role声明加入令牌。
第二步:为不同站点配置差异化的授权规则
ADFS的Relying Party Trusts(对应你的站点A和B)支持独立配置授权规则,这就是实现你场景的核心:
针对站点A(仅Admin角色可登录)
- 在ADFS管理控制台的Relying Party Trusts中,找到站点A的信任条目,右键选择Edit Claim Rules。
- 切换到Issuance Authorization Rules标签页,点击Add Rule。
- 选择
Permit or Deny Users Based on an Incoming Claim模板,点击下一步。 - 规则名称设为“Permit Only Admin Role”,然后选择Permit access only if the incoming claim matches a specific value。
- 传入声明类型选择
Role,声明值填写你的Admin组名称(比如AdminGroup,要和第一步提取的组名一致)。 - 完成规则创建。现在当用户尝试登录站点A时,ADFS会先检查用户的
role声明是否包含指定的Admin组,不满足的话直接拒绝认证请求,用户无法进入登录后的流程。
针对站点B(任意用户可登录)
- 同样进入站点B的Issuance Authorization Rules标签页。
- 添加一个规则,选择
Permit All Users模板(或者直接保留默认的允许所有已认证用户的规则)。 - 这样只要用户通过了用户名密码的LDAP校验,ADFS就会发行令牌,允许用户登录站点B。
关键说明
- 这种方式相当于把授权逻辑前置到ADFS的认证环节,不符合角色要求的用户连认证都无法通过,完全符合你描述的场景。
- 如果你后续需要调整角色权限,只需要在ADFS里修改对应Relying Party的授权规则即可,不需要改动应用代码。
- 测试时可以用ADFS的
Claims X-Ray工具(或者在应用里打印令牌内容),确认role声明是否正确提取,以及授权规则是否生效。
内容的提问来源于stack exchange,提问作者Saurabh Chauhan
相关产品推荐
相关产品推荐

