如何发送 SAML 请求?
How to send a SAML Request?
我想向我的 IDP (Azure AD) 发送 SAML 请求,但我完全不确定如何发送请求。
首先,我使用 OpenSAML 构建了一个 AuthRequest。我将其编码为字符串。
现在我想使用 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 回答的更新:
我从 IDPs 元数据中得到了这个:
<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" />
取决于您应该使用哪个 binding。 IdP 文档或元数据应该提到这一点。有几个:
- 重定向绑定(使用 GET),目前最常见的请求
- POST绑定
- Artifact Binding(更复杂,但我从未见过它用于请求)
- ...
我想您的情况将使用重定向绑定(编辑:您从 IdP 添加了元数据,它提到您可以同时使用重定向和 POST 绑定)。此处描述:https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf 第 15 页。
简短版:您必须先使用 DEFLATE 算法压缩您的 XML 请求,使用 base64 编码,使用 URL 编码对其进行编码,然后将其作为名为 SAMLRequest[ 的查询参数传递=13=]
?SAMLRequest=<your url-encoded base64-encoded deflated authnrequest>
https://en.wikipedia.org/wiki/SAML_2.0#SP_Redirect_Request.3B_IdP_POST_Response
我想向我的 IDP (Azure AD) 发送 SAML 请求,但我完全不确定如何发送请求。
首先,我使用 OpenSAML 构建了一个 AuthRequest。我将其编码为字符串。
现在我想使用 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 回答的更新:
我从 IDPs 元数据中得到了这个:
<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" />
取决于您应该使用哪个 binding。 IdP 文档或元数据应该提到这一点。有几个:
- 重定向绑定(使用 GET),目前最常见的请求
- POST绑定
- Artifact Binding(更复杂,但我从未见过它用于请求)
- ...
我想您的情况将使用重定向绑定(编辑:您从 IdP 添加了元数据,它提到您可以同时使用重定向和 POST 绑定)。此处描述:https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf 第 15 页。
简短版:您必须先使用 DEFLATE 算法压缩您的 XML 请求,使用 base64 编码,使用 URL 编码对其进行编码,然后将其作为名为 SAMLRequest[ 的查询参数传递=13=]
?SAMLRequest=<your url-encoded base64-encoded deflated authnrequest>
https://en.wikipedia.org/wiki/SAML_2.0#SP_Redirect_Request.3B_IdP_POST_Response