korrekt vor Ich muss eine SP-initiierte SAML 2.0-Authentifizierungstransaktion mithilfe der HTTP-Redirect-Binding-Methode erstellen. Es stellt sich heraus, dass dies ziemlich einfach ist. Holen Sie sich einfach den IdP-URI und verketten Sie einen einzelnen Abfragezeichenfolgenparameter SAMLRequest
. Der Parameter ist ein codierter XML-Block, der die SAML-Anfrage beschreibt. So weit, ist es gut.Wie bereite ich eine 'HTTP Redirect Binding'-SAML-Anfrage mit C#
Das Problem tritt auf, wenn die SAML in den Abfragezeichenfolgenparameter konvertiert wird. Ich glaube, dass dieser Prozess der Vorbereitung sein sollte:
- bauen eine SAML Zeichenfolge
- Compress diese Zeichenfolge
- Base64 die Zeichenfolge
- UrlEncode die Zeichenfolge kodieren.
Die SAML Anfrage
<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>
Der Kodex
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);
}
}
Ich vermute, dass die Kompression irgendwie schuld ist. Ich benutze die DeflaterOutputStream
Klasse von SharpZipLib, die einen Industriestandard Deflate-Algorithmus implementieren soll, also vielleicht gibt es hier einige Einstellungen, die ich falsch gemacht habe?
Der codierte Ausgang kann mit diesem SAML2.0 Debugger (ein nützliches Online-Konvertierungstool) getestet werden. Wenn ich meine Ausgabe mit diesem Werkzeug decodiere, kommt das als Unsinn heraus.
Die Frage ist daher: Wissen Sie, wie Sie eine SAML-Zeichenfolge in den korrekt deflationierten und codierten SAMLRequest-Abfrageparameter konvertieren?
Danke
EDIT 1
Die unten akzeptierte Antwort, die Antwort auf das Problem gibt. Hier ist der endgültige Code, korrigiert durch alle folgenden Kommentare und Antworten.
Encode SAMLRequest - Arbeits-Code
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);
}
}
Die SAMLRequest
Variable enthält die SAML an der Spitze dieser Frage gezeigt.
Decode SAMLResponse - Arbeits-Code
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));
}
}
Ich war nicht in der Lage, Ihre "Decode SAMLResponse - Arbeitscode" so zu verwenden, wie es geschrieben ist. Ich musste die Eingabe von der Ausgabe MemoryStream trennen. Ich musste auch UrlDecode und Convert.FromBase64String (...) vor dem DeflateStream. Ich dachte nur, ich würde mir eine Notiz machen, falls es der nächsten Person hilft. –
Können Sie bitte Ihren Arbeitscode posten? – biofractal
Hey Randall, kannst du den Code für die Änderungen angeben, die du an "SAMLResponse - Arbeitscode decodieren" vorgenommen hast? Das wäre sehr zu begrüßen! Danke – Naner