简介
ASP.Net的session会话状态为InProc时,如果未真正使用过session,在重定向返回后,sessionID会重新分配
背景介绍
SSO,Single Sign On,即单点登录。用户在某SP(Service Provider,服务提供商,如简书)的登录页面选择使用IdP(Identity Provider,身份提供商)的第三方登录功能,快捷登录SP,用户可以使用IdP登录多种SP,而不需要在SP处单独注册的协议和功能。(具体协议内容请自行检索)
问题的发现
ASP.Net测试网站开发过程中使用之前开发的C#版本单点登录SDK的登录功能,向IdP发送的请求中加入了sessionID,在收到IdP的回复后,SP对本地的存储的sessionID和IdP回复中返还的sessionID进行对比,以避免重放攻击。
但对比时发现sessionID永远无法匹配,进行debug发现,SP在请求中加入的sessionID在收到IdP的回复后发生了改变。
问题的关键
搜索并结合代码发现,在SP发送请求时,SP并未真正使用session(向session中存取值),仅仅是获取了sessionID,而ASP.Net的机制为未真正使用session的情况下,发生重定向后返回,会为本次会话重新分配sessionID,因此才导致sessionID不一致。
问题的解决
在初次获取sessionID的情况时,即向其中存入一个任意值,用于表示session已经被使用,防止重新分配sessionID。
补充
以上的解决方案并不完美,希望可以通过配置实现规避sessionID的重新分配,但未搜索到,如果有读者看到,希望回复中分享一下。
网友评论