2016-06-27 49 views
0

我在http-get中獲取了xml,簽名和簽名生成器。 那麼,我如何處理這個驗證簽名?如何檢查http重定向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; 
} 

但現在,無論我做什麼,結果總是錯誤的。 基於https://github.com/KentorIT/authservices/blob/master/Kentor.AuthServices/WebSSO/Saml2RedirectBinding.cs

回答

0

如果你上了形式SAMLResponse=....SigAlg=...Signature=...查詢字符串(第一個參數,也可以SAMLRequest)你正在使用SAML2 HTTP重定向綁定的消息。請參閱SAML2 Specification以瞭解其工作原理。具體來說,你應該閱讀綁定規範。

或者如果您想爲自己節省大量工作,可以找一個現有的SAML2實現來代替。有幾種可用的C#開源實現。

+0

嗯,我明白它是如何工作的規範..但開源實現不適合/蹩腳的記錄我的特定目的。 – Mafti

+0

如果你有特定的目的,你爲什麼不在問題中包含這些目的?這有助於獲得更好的迴應。 –

+0

嗨,抱歉,模糊。添加了我當前的代碼。我不知道如果我能夠得到httprequestdata作爲您的代碼btw .. – 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]);