HTTP 리디렉션 바인딩 방법을 사용하여 SP에서 초기화 한 SAML 2.0 인증 트랜잭션을 만들어야합니다. 이것은 매우 쉽습니다. IdP URI를 가져 와서 단일 쿼리 문자열 매개 변수 SAMLRequest
을 연결하면됩니다. param은 SAML 요청을 설명하는 xml의 인코딩 된 블록입니다. 여태까지는 그런대로 잘됐다.C#을 사용하여 'HTTP 리디렉션 바인딩'SAML 요청을 올바르게 준비하는 방법
SAML을 쿼리 문자열 param으로 변환 할 때 문제가 발생합니다. 나는 준비의 과정이 있어야한다고 생각 :
- 는 SAML 문자열을
- 압축
- 은 Base64로 문자열
- 를 UrlEncode 문자열을 인코딩이 문자열을 구축 할 수 있습니다.
SAML 요청
<samlp:AuthnRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="{0}"
Version="2.0"
AssertionConsumerServiceIndex="0"
AttributeConsumingServiceIndex="0">
<saml:Issuer>URN:xx-xx-xx</saml:Issuer>
<samlp:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>
강령
private string GetSAMLHttpRedirectUri(string idpUri)
{
var saml = string.Format(SAMLRequest, Guid.NewGuid());
var bytes = Encoding.UTF8.GetBytes(saml);
using (var output = new MemoryStream())
{
using (var zip = new DeflaterOutputStream(output))
{
zip.Write(bytes, 0, bytes.Length);
}
var base64 = Convert.ToBase64String(output.ToArray());
var urlEncode = HttpUtility.UrlEncode(base64);
return string.Concat(idpUri, "?SAMLRequest=", urlEncode);
}
}
나는 압축 비난 어떻게 든 것으로 판단됩니다. 난 SharpZipLib에서 DeflaterOutputStream
클래스를 사용하고 있습니다.이 클래스는 업계 표준의 deflate-algorithm을 구현하기로되어 있습니다. 그래서 여기에 몇 가지 설정이 있습니다.
인코딩 된 출력은 SAML2.0 Debugger (유용한 온라인 변환 도구)을 사용하여 테스트 할 수 있습니다. 이 도구를 사용하여 출력물을 디코딩하면 난센스가됩니다.
질문은 다음과 같습니다. SAML 문자열을 올바르게 축약되고 인코딩 된 SAMLRequest query-param으로 변환하는 방법을 알고 있습니까?
는EDIT 1
허용 된 대답은 아래의 문제에 대한 답을 제공합니다 감사합니다. 모든 후속 코멘트와 답변에 의해 수정 된 최종 코드입니다.
는 인코딩 SAMLRequest - 작동 코드
private string GenerateSAMLRequestParam()
{
var saml = string.Format(SAMLRequest, Guid.NewGuid());
var bytes = Encoding.UTF8.GetBytes(saml);
using (var output = new MemoryStream())
{
using (var zip = new DeflateStream(output, CompressionMode.Compress))
{
zip.Write(bytes, 0, bytes.Length);
}
var base64 = Convert.ToBase64String(output.ToArray());
return HttpUtility.UrlEncode(base64);
}
}
는 SAMLRequest
변수는이 질문의 상단에 표시 SAML이 포함되어 있습니다.
디코드 SAMLResponse - 작동 코드
private string DecodeSAMLResponse(string response)
{
var utf8 = Encoding.UTF8;
var bytes = utf8.GetBytes(response);
using (var output = new MemoryStream())
{
using (new DeflateStream(output, CompressionMode.Decompress))
{
output.Write(bytes, 0, bytes.Length);
}
var base64 = utf8.GetString(output.ToArray());
return utf8.GetString(Convert.FromBase64String(base64));
}
}
작성된 방식대로 "디코딩 SAMLResponse - 작업 코드"를 사용할 수 없었습니다. 입력을 출력 MemoryStream에서 분리해야했습니다. 또한 DeflateStream을 수행하기 전에 UrlDecode 및 Convert.FromBase64String (...)을 사용해야했습니다. 내가 다음 사람을 돕는 경우에 대비하여 메모를 할 것이라고 생각했습니다. –
작업 코드를 게시 할 수 있습니까? – biofractal
Hey Randall, "Declaration SAMLResponse - Working Code"변경 사항에 대한 코드를 제공 할 수 있습니까? 그게 많이 감사하겠습니다! 감사합니다 – Naner