2017-01-20 29 views
1

私が持っているサイトのリダイレクト認証を処理しようとしています。これを処理するために、Server2012 R2でADFSを構成しました。私は依頼を送信している私たちのドメイン内のURLを使用して依拠当事者の信頼を設定します。彼らが来ている特定のページにエンドポイントを追加しました。ブロックの長さがその補数と一致しません

基本的に、私はここでこのようなものを取っている:How do I correctly prepare an 'HTTP Redirect Binding' SAML Request using C#

しようとすると、単純なSAMLリクエストトークンを介して送信します。

 public static string SAMLRequest = @"<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>"; 

これは私が(エスケープ文字のため、およびID値の文字列置換)C#の文字列としての上に送信していたテンプレートURLです。すべての作業を完了すると

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

、ページがトークンとの適切なエンドポイントに私をリダイレクトします。ここ

そして、私は私のリダイレクトURLに起こっているのリクエストパラメータを生成するために使用しているコードです。 base64は正しくエンコードされます。まあ、まあまあ。

物事のAD FS側では、ページにエラーが発生し、認証が停止するだけです。 AD FSのイベントビューアで見ると、それは私にこの不可解なエラーを与える:

System.IO.InvalidDataException: Block length does not match with its complement. 

私は無駄に、圧縮と要求オブジェクト自体のプロパティのいくつかをいじってみました。誰でも私がこの悪い男の子を試すことができるアイデアはありますか?仮定すると、DeflaterOutputStream

+0

手動でsaml 2.0リクエストを作成する理由はありますか? –

+0

リダイレクト用のSAMLリクエストトークンを簡単に構築できるライブラリを使用することができませんでした。あなたが良いものを知っているなら、私はすべて耳です。 – bafadam

+0

ポイントは、Saml 1.1は2.0とは対照的にサポートされています。だから私はあなたが2.0と一緒に行く理由を尋ねる。 –

答えて

1

はそれが実際にRFC 1951から、DEFLATEない、RFC 1950あり、実際には、あなたのZLIB出力ストリームを与えるSharpZipLib、new DeflaterOutputStream(output)からです。違いは、ZLIBがヘッダとフッタをDEFLATEに追加することです.DEFLATEでは、SharpZipLibをnew DeflaterOutputStream(output, new Deflater(level: Deflater.DEFAULT_COMPRESSION, noZlibHeaderOrFooter: true))で抑制することができます。

関連する問題