我有一个Rails应用程序,我使用Shibboleth SP进行了Shibbolized(最新版本 - 2.4.2)。我在Apache 2.2中使用它。我的IdP是MS AD FS 2.0服务器。
一切似乎运作良好 - 用户访问网站,重定向到AD FS,获得身份验证,然后返回并登录到网站。
问题是,一旦你完成了这项工作,几乎不可能及时以不同的用户身份登录。您可以清除所有Cookie(我在Mac上使用Safari和Chrome进行尝试)并重新启动浏览器,但如果我首先通过身份验证为Alice,然后尝试以Carol身份登录,我仍然会登录到应用程序作为爱丽丝。
清除cookie后,shibd收到的SAML响应中包含正确的身份:
<AttributeStatement>
<Attribute Name="http://schemas.xmlsoap.org/claims/CommonName">
<AttributeValue>Carol</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
<AttributeValue>carol@dev.REDACTED.com</AttributeValue>
</Attribute>
<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn">
<AttributeValue>carol@dev.REDACTED.com</AttributeValue>
</Attribute>
</AttributeStatement>
但是当Shibboleth SP将环境变量传递给我的应用程序时,它会发送错误的凭据:
[DEBUG 05/19 16:30:09] ENV: Shib-Session-ID => _615014991ed1b7dcc43f647ceb1f4944
[DEBUG 05/19 16:30:09] ENV: Shib-Identity-Provider => http://REDACTED/adfs/services/trust
[DEBUG 05/19 16:30:09] ENV: Shib-Authentication-Instant => 2011-05-19T21:17:23.861Z
[DEBUG 05/19 16:30:09] ENV: Shib-Authentication-Method => urn:federation:authentication:windows
[DEBUG 05/19 16:30:09] ENV: Shib-AuthnContext-Class => urn:federation:authentication:windows
[DEBUG 05/19 16:30:09] ENV: Shib-Session-Index => _cadfb4e6-ffb2-45f9-aab5-6bce8c3bc17a
[DEBUG 05/19 16:30:09] ENV: cn => alice
[DEBUG 05/19 16:30:09] ENV: email => alice@dev.REDACTED.com
[DEBUG 05/19 16:30:09] ENV: principal => alice@dev.READACTED.com
尽管已经破解了所有cookie,但Shib-Session-ID将是相同的。不知何故,似乎是在关联两个交互并重新建立现有会话,而不是使用SAML响应中的帐户信息进行新会话。
我已经将我能找到的所有缓存超时值设置为60秒,但是在浏览器关闭的情况下等待2-3分钟并不足以让它进行新的会话。
<StorageService type="Memory" id="mem" cleanupInterval="60"/>
<SessionCache type="StorageService" StorageService="mem" cacheTimeout="60"
inprocTimeout="60" cleanupInterval="60" />
...
<Sessions lifetime="60" timeout="60" checkAddress="false" relayState="ss:mem"
handlerSSL="false">
重新启动apache和shibd是有效的,关闭浏览器并让它静置很长时间(10-15分钟?)我还没有确切知道需要多长时间。
我错过了什么?我应该采取哪些其他途径?
答案 0 :(得分:1)
关键是我们的应用程序是使用Passenger部署的Rails应用程序。看起来Passenger在第一次调用后没有更新环境变量,所以你可能最终得到旧数据。
切换到通过标题传递用户信息(ShibUseHeaders on)解决了问题。