我有2个Web应用程序,一个是IIS中承载的ASP.NET MVC 5 + WIF,另一个是基于WCF和自托管的Web服务。它们都属于同一个域(因此没有安全问题可以更改cookie格式)并且引用相同的STS(在相同的安全领域中),因此理论上如果一个用户已经过身份验证,他应该能够访问其中的其他实体没有身份验证的安全领域。 但是,这两个网站使用不同的会话令牌格式。对于ASP.NET MVC 5项目,它使用WIF实现的标准安全会话令牌并序列化为cookie;对于WCF Web服务,它使用自己的令牌/ cookie格式。
然后我们遇到了问题。
当用户从ASP.NET MVC网站导航到WCF Web服务时,因为WCF Web服务无法识别WIF会话令牌(FedAuth和FedAuth1),所以它将用户重定向到STS并再次登录,这不是最大的问题,最大的问题是,在使用登录后,将原始SAML2令牌回送到WCF Web服务,WCF Web服务创建自己的格式令牌并尝试设置客户端cookie,它实际上不起作用,我想也许已经有了头部中的FedAuth和FedAuth1 cookie如此标头无法容纳更多令牌(4K限制?)?经过一段时间的考虑,我想到了几种解决方案:
统一令牌格式。我需要子类SecurityTokenHandler(可能还需要子类CookieHandler),使用与WCF服务使用相同的令牌格式,因此当跳转到WCF Web服务时,它可以识别会话令牌。这需要深入研究FAM和SAM。
强制重新登录。我可以在导航到WCF Web服务之前清除FedAuth和FedAuth1 cookie,用户需要再次登录是可以接受的,这是一个短期修复,但是如何捕获此导航事件并清除cookie ?我认为我能做的唯一方法是在更改window.location.href之前,使用jQuery.cookie来清除cookie,我不确定它是否是正确的方法,这是我的第一个问题。
在ASP.NET和WCF之间添加cookie转换层,在ASP.NET网站中使用WIF会话令牌,当跳转到WCF Web服务时,更改令牌格式。但是对于这个解决方案,我不知道如何捕获跳转动作以及如何获得原始SAML2令牌?可能是我可以将它保存在WSFederationAuthenticationModule_SecurityTokenReceived事件处理程序中吗?但是如何处理来自多用户和多会话的多令牌?
还有其他更好的建议吗?