2016-06-27 3 views
0

Я получаю xml, подпись и подпись algoirthm отдельно в http-get. Итак, как мне подойти к этому, чтобы проверить подпись?Как проверить http-redirect samlresponse uri request

В настоящее время мой код это:

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 Redirect связывания. См. Описание 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]); 
Смежные вопросы