我需要从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。任何帮助和指示都会有所帮助。
答案 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);
}
}