如何发送SAML请求?

时间:2016-11-10 14:17:48

标签: java http azure saml-2.0 opensaml

我想向我的IDP(Azure AD)发送SAML请求,但我根本不确定如何发送请求。

首先,我使用OpenSAML构建AuthRequest。我编码为String。

现在我想使用ApacheHttpClient发送请求并读取响应,我不确定OpenSAML是否提供了http发送方法,所以我的想法是暂时使用Apaches HttpClient。

String encodedAuthRequest = generateAuthRequest();
String url = "http://myidp/samlendpoint";
CloseableHttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);

// add request header
request.addHeader("User-Agent", USER_AGENT);

// what is to add else?

HttpResponse response = client.execute(request);

我现在陷入困境,因为我不确定如何设置请求,是否需要在GET中使用?saml=....之类的查询参数,或者我必须将编码的saml响应作为POST放在正文中。

有人可以帮助或澄清这些问题吗?

Guillaumes回复:

我从IDP MetaData获得这个:

<IDPSSODescriptor>
    <SingleSignOnService
        Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
        Location="https://myidp/saml2" />
    <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
        Location="https://myidp/saml2" />

1 个答案:

答案 0 :(得分:4)

取决于您应该使用哪个绑定。 IdP文档或元数据应该提到这一点。有几个:

  • 重定向绑定(使用GET),这是目前最常见的请求
  • POST Binding
  • Artifact Binding(更复杂,但我从未见过它用于请求)
  • ...

我想在您的情况下将使用Redirect Binding(编辑:您从IdP添加了元数据,它提到您可以使用重定向和POST绑定)。这里描述:https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf第15页。

简短版本:您必须首先使用DEFLATE算法压缩XML请求,使用base64对其进行编码,使用URL编码对其进行编码,然后将其作为名为SAMLRequest的查询参数传递

?SAMLRequest=<your url-encoded base64-encoded deflated authnrequest>

https://en.wikipedia.org/wiki/SAML_2.0#SP_Redirect_Request.3B_IdP_POST_Response