Comment préparer correctement une requête SAML de redirection HTTP en utilisant C #

J'ai besoin de créer un SP lancé SAML 2.0 Authentification de la transaction à l'aide de HTTP de Redirection de Liaison de la méthode. Il s'avère que c'est assez facile. Juste obtenir de l'IdP, d'URI et de concaténer une seule chaîne de la requête param SAMLRequest. Le param est un bloc codé en xml qui décrit la requête SAML. So far So good.

Le problème vient lors de la conversion de la SAML dans la chaîne de requête param. Je crois que ce processus de préparation doit être:

  1. Construire un SAML chaîne
  2. Compresser cette chaîne
  3. Base64 encode la chaîne
  4. UrlEncode la chaîne.

La Requête 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>

Le Code

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);
    }
}

Je soupçonne que la compression est en quelque sorte à blâmer. Je suis l'aide de la DeflaterOutputStream classe de SharpZipLib qui est censé mettre en œuvre une norme de l'industrie dégonfler-algorithme alors peut-être il y a certains paramètres ici, j'ai tort?

De l'encodage du fichier de sortie peut être testé à l'aide de cette Grâce à saml2!.0 Débogueur (utile en ligne de l'outil de conversion). Quand je décode ma sortie à l'aide de cet outil, il vient en tant que non-sens.

La question est donc: savez-vous comment convertir un SAML chaîne dans le correctement dégonflé et codé SAMLRequest requête param?

Merci

EDIT 1

La accepté de répondre ci-dessous donne la réponse au problème. Ici est la version finale du code tel que modifié par tous les commentaires et réponses.

Encoder SAMLRequest - Code De Travail

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);
    }
}

La SAMLRequest variable contient le SAML indiqué en haut de cette question.

Décoder SAMLResponse - Code De Travail

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));
    }
}

source d'informationauteur biofractal