2016-06-27 6 views
0

http-getでxml、signature、signature-algoirthmを別々に取得しています。 だから、どうやって署名を検証するのですか?http-redirect samlresponse uriリクエストの確認方法

は、現在、私のコードはこれです:

public void CheckSignature(string response, string sig, string sigalg, byte[] cert) 
{ 
    Log("loading cert"); 
    X509Certificate2 cert2 = new X509Certificate2(cert); 

    bool result = false; 

    /* response, sigalg and sig are url-decoded or not, doesn't matter :(*/ 
    Log("first variant"); 
    var signedString = string.Format(CultureInfo.InvariantCulture, "SAMLResponse={0}&SigAlg={1}", response, sigalg); 
    result = DoCheck(signedString, sigalg, sig, cert2); 

    Log("2nd variant"); 
    signedString = string.Format(CultureInfo.InvariantCulture, "SAMLResponse={0}", response); 
    result = DoCheck(signedString, sigalg, sig, cert2); 


    Log("3rd variant"); 
    signedString = string.Format(CultureInfo.InvariantCulture, "{0}", response); 
    result = DoCheck(signedString, sigalg, sig, cert2); 
} 

private bool DoCheck(string signedString, string sigalg, string sig, X509Certificate2 cert2) 
{ 
    try { 
     var sigDescription = (SignatureDescription)CryptoConfig.CreateFromName(sigalg); 
     var hashAlg = sigDescription.CreateDigest(); 
     //why is this needed? 
     hashAlg.ComputeHash(Encoding.UTF8.GetBytes(signedString)); 

     var signature = Convert.FromBase64String(sig); 

     Log("trying to verify::" + signedString + Environment.NewLine); 

     X509AsymmetricSecurityKey key = new X509AsymmetricSecurityKey(cert2); 
     AsymmetricAlgorithm asym_alg = key.GetAsymmetricAlgorithm(sigalg, false); 
     AsymmetricSignatureDeformatter def = sigDescription.CreateDeformatter(asym_alg); 


     bool result = false; 
     result = def.VerifySignature(hashAlg, signature); 
     //sadly always false. 
     Log("woop woop:" + result); 
     return result; 
    } 
    catch (Exception ex) { 
     Log(ex.Message); 
     Log(ex.StackTrace); 
    } 
    return false; 
} 

今のところ、私は何でも、結果は常にfalseです。 あなたが結合SAML2 HTTPリダイレクトを使用してメッセージを取得しているフォームSAMLResponse=....SigAlg=...Signature=...(最初のパラメータもSAMLRequestすることができます)上のクエリ文字列を取得する場合https://github.com/KentorIT/authservices/blob/master/Kentor.AuthServices/WebSSO/Saml2RedirectBinding.cs

答えて

0

に基づきます。どのように動作するかについては、SAML2 Specificationを参照してください。具体的には、バインディング仕様を読んでください。

多くの作業を自分で保存したい場合は、代わりに使用する既存のSAML2実装を探します。 C#にはいくつかのオープンソース実装が用意されています。

+0

まあ、私はそれが仕様でどのように機能するかを理解する..しかし、オープンソースの実装では、私の特定の目的のために文書化安っぽい/適していません。 – Mafti

+0

具体的な目的がある場合は、それらの目的を質問に含めないでください。それはより良い応答を得るのに役立ちます。 –

+0

こんにちは、曖昧さをお詫び申し上げます。私の現在のコードを追加しました。私はあなたのコードbtwとしてhttprequestdataを得ることができるかどうかわからない。 – Mafti

0

よく、

私はそれを自分で見つけました。 これは本当にrawrequestパラメータの問題です。 (私のコードはすでにそれを解析されますが、それはとにかく失敗した)

// Can't use the query string params as found in HttpReqeustData 
// because they are already unescaped and we need the exact format 
// of the original data. 
     var rawQueryStringParams = request.Url.Query.TrimStart('?') 
      .Split('&') 
      .Select(qp => qp.Split('=')) 
      .ToDictionary(kv => kv[0], kv => kv[1]); 
関連する問題