OpenId Connect对接Azure AD外部登录时state生成过长问题咨询
方案说明
OpenID Connect 协议完全支持手动生成、校验state参数,不需要依赖框架默认的生成逻辑,你可以通过「短state关联存储上下文」的方案大幅压缩发送到Azure AD的参数长度,解决参数过长被拒绝的问题。
具体改造步骤
- 替换Identity Server端默认的state生成逻辑
默认的state通常会把跳转上下文、用户会话标识、安全校验值等所有信息直接编码到参数中,是长度超标的核心原因,你可以改为如下逻辑:- 使用密码学安全的随机函数生成16~32位的随机字符串作为精简
state值,满足不可预测的安全要求 - 在Identity Server的分布式缓存/持久化存储中,将这个随机字符串作为Key,关联存储原本需要放到state里的所有上下文信息(比如原请求的重定向地址、用户会话标识、CSRF校验值等)
- 发往Azure AD的登录请求中仅携带该随机字符串作为
state参数,长度可控制在40位以内,完全符合Azure AD的参数长度限制
- 使用密码学安全的随机函数生成16~32位的随机字符串作为精简
- 自定义state回调校验逻辑
当Azure AD完成认证回调到Identity Server时:- 从回调请求中提取返回的
state参数值 - 到对应存储中查询该
state关联的上下文信息,查不到记录则直接拒绝当前请求 - 用存储的上下文信息完成后续的校验、跳转回你的应用的逻辑,处理完成后删除存储中对应的Key-Value记录,避免被重复利用
- 从回调请求中提取返回的
注意事项
- 存储的过期时间要和授权请求的有效期保持一致,建议设置为15~30分钟即可,避免无效数据长期占用存储资源
- 如果你的Identity Server是多实例部署,必须使用分布式缓存做存储,不能用本地内存存储,避免回调请求落到其他实例上无法查询到对应state记录
- 精简后的state必须使用密码学安全的随机数生成,不能用递增值、时间戳等可预测的内容,防止出现CSRF安全漏洞
内容的提问来源于stack exchange,提问作者Maki
相关产品推荐
相关产品推荐

