使用itfoxtec-identity-saml2库能否在SAML请求响应中传递自定义属性
SAML集成自定义参数透传及RelayState兼容问题解答
问题1:能否将自定义属性加入Saml2AuthnRequest对象,在返回的Saml2AuthnResponse中获取?
不建议这么做,通用场景下无法实现预期效果
SAML 2.0 协议标准中没有定义AuthnRequest请求透传自定义非标准字段的规则,第三方IdP/SP默认不会将AuthnRequest中携带的非标准字段原样回传到Saml2AuthnResponse中。除非你对接的身份提供商专门做了定制开发,支持将你传入的指定扩展字段返回,否则该方案完全不可用,且不符合SAML协议规范,容易导致请求被拦截。
问题2:RelayState是不是发送和接收自定义动态参数的唯一方式?
RelayState是SAML协议标准规定的唯一专门用于SP透传自身状态参数的字段,其他透传方案均为非标准实现,兼容性更差
针对你遇到的&分隔符导致的RelayState兼容问题,推荐采用以下两种方案解决,无需修改SAML请求结构:
- 方案1:编码RelayState内容,消除特殊字符
不要直接拼接带&的查询字符串作为RelayState,先把所有自定义参数序列化为JSON,再做URL安全的Base64编码,最终生成的RelayState是无特殊字符的字符串,不会触发第三方SP的解析错误。
参考.NET实现代码:
回调时反向解码即可获取原始参数:// 构造自定义参数对象 var relayStateData = new { ReturnUrl = "/dashboard", RedirectionParams = new { Source = "app", Id = "123" } }; // 序列化后做URL安全Base64编码 string relayState = Convert.ToBase64String(System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(relayStateData)) .TrimEnd('=') .Replace('+', '-') .Replace('/', '_');
itfoxtec-identity-saml2库对RelayState的内容没有特殊限制,直接传入编码后的字符串即可正常生成请求,回调时也会原样返回该字段。// 还原Base64编码 string base64Str = relayState.Replace('-', '+').Replace('_', '/'); base64Str += base64Str.Length % 4 switch { 2 => "==", 3 => "=", _ => string.Empty }; // 反序列化得到原始参数 var originalData = System.Text.Json.JsonSerializer.Deserialize<RelayStateData>(Convert.FromBase64String(base64Str)); - 方案2:服务端存储映射,解决长度限制问题
如果对接的SP同时限制了RelayState的长度(多数场景上限为80字符),可以在本地生成唯一的短字符串Key,将自定义参数存在服务端的缓存、数据库中,仅把Key作为RelayState的值传递,回调时用返回的Key到本地查询对应的原始参数即可,该方案完全不存在特殊字符和长度兼容问题。
注意:不要尝试在
Issuer、NameIDPolicy等SAML标准字段中塞入自定义参数,会违反协议规范,大概率被IdP/SP直接拒绝请求。
内容的提问来源于stack exchange,提问作者shrey shah
相关产品推荐
相关产品推荐

