如何在 SAMLEntryPoint 中设置 RelayState

Posted

技术标签:

【中文标题】如何在 SAMLEntryPoint 中设置 RelayState【英文标题】:How to Set RelayState in SAMLEntryPoint 【发布时间】:2017-08-04 08:38:25 【问题描述】:

我的 EntryPoint 类如下,但是在中继状态中设置的确切值是什么,任何示例。我想在验证之前获取请求的 URL 参数值。

import org.opensaml.saml2.metadata.provider.MetadataProviderException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.saml.SAMLEntryPoint;
import org.springframework.security.saml.context.SAMLMessageContext;
import org.springframework.security.saml.websso.WebSSOProfileOptions;

public class SamlLoginEntryPoint extends SAMLEntryPoint

    protected WebSSOProfileOptions getProfileOptions(SAMLMessageContext context, AuthenticationException exception) throws MetadataProviderException 

        System.out.println("inside entrypoint");
        WebSSOProfileOptions ssoProfileOptions;
        if (defaultOptions != null) 
            System.out.println("in if");
            ssoProfileOptions = defaultOptions.clone();
            ssoProfileOptions.setRelayState("");
            System.out.println("relaystate:"+ssoProfileOptions.getRelayState());
         else 
            System.out.println("in else");
            ssoProfileOptions = new WebSSOProfileOptions();
            ssoProfileOptions.setRelayState("");
        

        return ssoProfileOptions;

    

【问题讨论】:

【参考方案1】:

@Dalu:我不确定这在竞争条件下是否安全。 SAMLEntryPoint 通常是一个单例 bean。

考虑User A想用URL X登录,但同时User BURL Y登录的场景(在A调用commence()之后,但在他调用getProfileOptions之前。

解决方案是不将private String relayState; 定义为全局变量,而是使用基于会话的存储。

【讨论】:

【参考方案2】:

重写 SAMLEntryPoint 类的 begin() 方法,从请求对象中获取请求参数。

所以我的实现看起来像这样:

public class CustomMFASamlEntryPoint extends SAMLEntryPoint 
   private String relayState;

   @Override 
   public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException 
       //read your request parameter
       setRelayState(request.getParameter("request-param-for-relaystate"));
       super.commence(request, response, authenticationException);
   

   @Override
   protected WebSSOProfileOptions getProfileOptions(SAMLMessageContext samlMessageContext, AuthenticationException authenticationException) throws MetadataProviderException 
       //set the relayState to your SAML message context
       samlMessageContext.setRelayState(getRelayState());
       return super.getProfileOptions(samlMessageContext, authenticationException);
   

   private void setRelayState(String relayState) 
       this.relayState = relayState;
   

   private String getRelayState() 
       return relayState;
   

【讨论】:

以上是关于如何在 SAMLEntryPoint 中设置 RelayState的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xcode 中设置 $(SRCROOT) 的父路径

如何在 Sonata/Symfony 3.3 中设置内容配置?

如何在 BlobStore 中设置文件名属性?

如何在 Django 中设置自定义中间件

使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

如何在 sklearn:: LGBMClassifier() 中为 LightGBM 分类器的 feature_importances_ 中设置“增益”作为特征重要性度量