ADFS第三方声明提供方信任场景下阻止本地AD禁用/过期账号访问应用问询
ADFS拦截本地禁用/过期联合账号访问的配置方案
核心逻辑
在现有Azure AD身份验证完成后、ADFS向依赖方颁发令牌前,增加本地AD账号状态校验环节,无需修改合作方Azure AD配置,所有调整均在你方ADFS侧完成。
前置检查
确认ADFS服务账号对本地Active Directory有只读权限,且本地AD已被配置为ADFS的默认属性存储(该配置为ADFS默认项,无特殊改动无需调整)。
配置步骤
步骤1:修改合作方Azure AD对应的声明提供方信任(Claim Provider Trust)的颁发转换规则
新增两条自定义声明规则:
- 第一条规则:通过联合身份匹配字段查询本地AD的账号状态属性
规则类型选择「使用自定义规则发送声明」,规则语法如下(请将匹配字段、自定义声明类型替换为你方实际使用的配置):// 示例中用UPN作为两边用户的匹配字段,可替换为mail、immutableID等你方实际用的联合匹配属性 c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"] => add( store = "Active Directory", types = ("http://yourdomain.com/claims/accountenabled", "http://yourdomain.com/claims/accountexpires"), query = ";userAccountControl,accountExpires;{0}", param = c.Value ); - 第二条规则:命中禁用/过期条件时直接返回拒绝声明
同样选择自定义规则类型,语法如下:// userAccountControl值匹配代表账号禁用,accountExpires小于当前时间对应的文件时间值代表账号过期 exists([Type == "http://yourdomain.com/claims/accountenabled", Value =~ "^(?i)514|546|66050|66082$"]) || exists([Type == "http://yourdomain.com/claims/accountexpires", Value < "133486656000000000"]) => issue(Type = "http://schemas.microsoft.com/authorization/claims/deny", Value = "DenyInvalidLocalAccount");注:userAccountControl的禁用取值可根据你方AD实际场景补充,accountExpires的时间阈值请替换为你当前时间对应的AD文件时间值,0或9223372036854775807代表账号永不过期。
步骤2:验证依赖方信任的授权规则
默认ADFS的全局授权规则会自动识别http://schemas.microsoft.com/authorization/claims/deny类型的声明,只要存在该声明就会直接返回403拦截用户访问。如果你方的依赖方信任配置了自定义授权规则,只需确保规则中未屏蔽该拒绝声明的校验即可。
生效验证
分别使用本地禁用、本地过期、本地正常的测试账号走联合登录流程,确认前两类账号被拦截,正常账号可正常访问应用即可。
内容的提问来源于stack exchange,提问作者the-burgh
相关产品推荐
相关产品推荐

