是否可以将用户从使用SAML身份验证的应用程序中注销,但让他们登录IDP,以便他们可以继续访问其他服务提供商?
我希望能够将用户从应用程序中注销,并让他们在返回应用程序时进行身份验证,而无需将他们从IDP中注销(即,我不想使用单一注销)。SAML有可能做到这一点吗?
执行单次注销时,没有标准的方法可以排除IDP会话的终止。此外,终止与单个会话参与者(单个服务提供商)的会话,同时保持其他会话的打开显然不在SAML 2.0单一注销配置文件的范围内(见SAML-profiles-2.0-os.pdf,第1139-1143行)。所以这不是我们要走的路。
但还有另一个解决方案。您可以在服务提供商处使用本地注销(例如,简单地使本地HTTP会话无效),并在向IDP发送AuthnRequest时将其与属性ForceAuthn组合(请参阅saml-core-2.0-os,第2042行)。将ForceAuthn属性设置为true将强制身份提供程序对用户进行身份验证,即使在存在现有IDP会话的情况下也是如此。
整个流程可能是这样的:
- 用户访问SP并需要进行身份验证
- SP向IDP发送SAML 2.0 AuthnRequest,并将ForceAuthn标志设置为true
- IDP强制用户进行身份验证并响应SP
- SP在验证响应后创建本地会话
- 用户注销SP应用程序,该应用程序仅终止本地会话,不会干扰IDP会话或其他SP上的会话
将ForceAuthn标志设置为true会有效地禁用单点登录,因此您可能需要使用一些SP端逻辑来确定是否使用该标志。
设置了标志的有效请求示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest AssertionConsumerServiceIndex="0"
AttributeConsumingServiceIndex="myServiceID"
Destination="https://idp.ssocircle.com:443/sso/SSOPOST/metaAlias/ssocircle"
ForceAuthn="true" ID="a228aje276h0id1g48eihj5gfj9h8bi"
IsPassive="false" IssueInstant="2014-04-11T22:07:05.438Z"
Version="2.0" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">urn:test:sp</saml2:Issuer>
</saml2p:AuthnRequest>