从/ saml / sso重定向时,将SAML 2.0转换为JWT

时间:2019-06-07 06:07:00

标签: spring jwt saml-2.0 spring-saml

我需要从ADFS IDP创建服务提供商。 IDP正在发送SAML 2.0令牌,在服务方面,我正在接收它。 我在服务提供商中使用过Spring Security相同的扩展插件。

我的代码流程如下所述

/ saml / login->将调用ADFS(IDP)————>重定向到saml / sso(带有SAML令牌)

现在从此相同/ sso重定向到前端(客户端将发生,请求令牌)。我想发回JWT而不是SAML来发回浏览器。 最好的方法是什么。我怎样才能使/ saml / sso在successRedirectHandler中将SAML隐蔽到JWT。

样本处理程序

@Bean

public SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler() {

    SavedRequestAwareAuthenticationSuccessHandler successRedirectHandler =

            new SavedRequestAwareAuthenticationSuccessHandler();

    successRedirectHandler.setDefaultTargetUrl("/landing");

    return successRedirectHandler;

}

请注意,我正在使用Nimbus JSON JWT jar进行SAML到JWT的转换。我不希望不创建单独的控制器来将SAML转换为JWT。任何帮助和指示都会有所帮助。

1 个答案:

答案 0 :(得分:1)

基本上,在IDP端进行身份验证之后,您将收到断言作为响应。您将提取属性并在服务端执行一些验证。您将使用所需的属性创建JWT令牌。之后,您可以使用令牌重定向到目标网址。下面是一段代码。

public class SAMLLoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

  public SAMLLoginSuccessHandler() {}

  @Override
  public void onAuthenticationSuccess(final HttpServletRequest request,
      final HttpServletResponse response, final Authentication authentication)
      throws IOException, ServletException {

    if (authentication.getPrincipal() instanceof UserDetails
        || authentication.getDetails() instanceof UserDetails) {
      UserDetails details;
      String failureRedirectUrl = Constants.REDIRECTION_WEB;
      if (authentication.getPrincipal() instanceof UserDetails) {
        details = (UserDetails) authentication.getPrincipal();
      } else {
        details = (UserDetails) authentication.getDetails();
      }

      String username = details.getUsername();
      SAMLCredential credential = (SAMLCredential) authentication.getCredentials();
      List<Attribute> attributes = credential.getAttributes();
      // validate user related information coming in assertions from IDP

      // TODO:JWT Token generation code 

      // eventually you want to send that code to client therefore append the token
      // in the url to which you want to redirect
      String redirectUri;  // set the redirect uri  
      response.sendRedirect(redirectUri);
    }
    super.onAuthenticationSuccess(request, response, authentication);
  }
}