Проверка подписанных запросов в C#
Я пытаюсь проверить входящие подписанные запросы на моем сервере C#. Запросы поступают с социальной платформы (Naver). Все, что я получаю от них, это сертификат (ниже).
Я использую DevDefinedOAuth
http://code.google.com/p/devdefined-tools/
У них есть статья в вики на эту тему.
http://code.google.com/p/devdefined-tools/wiki/OAuthSignatureValidation
и вот мой код:
public static bool isValidRequest2( HttpListenerRequest request )
{
X509Certificate2 cert = new X509Certificate2();
cert.Import( Encoding.ASCII.GetBytes(
@"-----BEGIN CERTIFICATE-----
MIICqDCCAhGgAwIBAgIJANDx5Es1s04zMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV
BAYTAktSMQowCAYDVQQIDAEgMQowCAYDVQQHDAEgMQwwCgYDVQQKDANOSE4xEjAQ
BgNVBAsMCUNvbW11bml0eTESMBAGA1UEAwwJbmF2ZXIuY29tMRAwDgYJKoZIhvcN
AQkBFgEgMB4XDTEwMDYxNDA1MzAzNVoXDTExMDYxNDA1MzAzNVowbTELMAkGA1UE
BhMCS1IxCjAIBgNVBAgMASAxCjAIBgNVBAcMASAxDDAKBgNVBAoMA05ITjESMBAG
A1UECwwJQ29tbXVuaXR5MRIwEAYDVQQDDAluYXZlci5jb20xEDAOBgkqhkiG9w0B
CQEWASAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANX++6LgORv6caQ8LCVh
RYTXi2Lko7zn4wPeqvdCqNZsxcry2mNHn/ic+0XbhNgor5L0l048f0iicW/Qu4vw
RvkZy2N8dNE3Tb5dbPLNo+S+cExv/DhbQVFKGiOOvr4vQ+2Lgw7If5g3sh6/S8Gu
ot47cOrUkiLKBKJt614bue9zAgMBAAGjUDBOMB0GA1UdDgQWBBSB1ReDAnl4lRyl
Rfpl0EZ13E5LzzAfBgNVHSMEGDAWgBSB1ReDAnl4lRylRfpl0EZ13E5LzzAMBgNV
HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAEYdZfQjvk/wvlFP4l3mDqS4NMac
txx1lyYGa0gX4DGhb7aGwBb3qwCdSX7szuYNHHq5Clf9TGQMqc49RFC2TGNRrpSw
BZFRmyzhMsqx/dLcNIBLfz4B+SUw+yiwNKo3krYCJfqgNy0cW8sF121yWI3tPzqr
kD8kEbCa5GvxmsdT
-----END CERTIFICATE-----" ) );
DevDefined.OAuth.Framework.OAuthContext context = new DevDefined.OAuth.Framework.OAuthContext
{
//RawUri = request.Url,
RawUri = CleanUri( request.Url ),
Cookies = new NameValueCollection(),
Headers = request.Headers,
RequestMethod = request.HttpMethod,
FormEncodedParameters = new NameValueCollection(),
QueryParameters = new NameValueCollection( request.QueryString )
};
// do I need to set them manually?.. let's try..
context.ConsumerKey = request.QueryString[ "oauth_consumer_key" ];
context.Timestamp = request.QueryString[ "oauth_timestamp" ];
context.Nonce = request.QueryString[ "oauth_nonce" ];
context.Signature = request.QueryString[ "oauth_signature" ];
var signer = new DevDefined.OAuth.Framework.Signing.OAuthContextSigner();
DevDefined.OAuth.Framework.SigningContext signingContext = new DevDefined.OAuth.Framework.SigningContext();
// use context.ConsumerKey to fetch information required for signature validation for this consumer.
signingContext.Algorithm = cert.PublicKey.Key;
//signingContext.ConsumerSecret; // if there is a consumer secret
return ( signer.ValidateSignature( context, signingContext ) );
}
А вот пример запроса: (я немного изменил URL из соображений безопасности)
Адрес: http://www.maxmax.co.cc:7677/?oauth_signature=b58RqdQ0Atnrvvy6Qi81BRv1fhmXIQEl3hY++Wi7kiinSOhWq7mluhsapEi/GvCUG6RjrYVowwTcoi MqqmVCasFlON7zU7Yyi8nOUAoClpoft0BXbT5xyNUmLOxTk47tmjWVMLniaOieVUEQLwP2yycH6hiWkf2gFWGsu9LHZbE = & oauth_nonce = 14611349243983507 & OAuth _version=1,0&oauth_body_hash=2jmj7l5rSw0yVb/vlWAYkK/YBwk=&oauth_signature_method=RSA-SHA1&oauth_consumer_key=naver.com&xoauth_sign ature_publickey=http://nsocialcontainer.com/server/naver_socialapp_public.cer&xoauth_public_key=http://nsocialcontainer.com/server /naver_socialapp_public.cer&opensocial_owner_id=1400000000010946792&topens=ial_080_0995_0990_0990_0995_0990_0995
HttpMethod: GET
Агент пользователя: Jakarta Commons-HttpClient/3.1
Строка запроса
- oauth_signature: b58RqdQ0Atnrvvy6Qi81BRv1fhmXIQEl3hY ++ Wi7kiinSOhWq7mluhsapEi / GvCUG6RjrYVowwTcoiMqqmVCasFlON7zU7Yyi8nOUAoClpoft0BX bT5xyNUmLOxTk47tmjWVMLniaOieVUEQLwP2yycH6hiWkf2gFWGsu9LHZbE =
- oauth_nonce: 14611349243983507 - oauth_version: 1.0
- oauth_body_hash: 2jmj7l5rSw0yVb / vlWAYkK / YBwk =
- oauth_signature_method: RSA-SHA1
- oauth_consumer_key: naver.com
- xoauth_signature_publickey: HTTP: //nsocialcontainer.com/server/naver_socialapp_public.cer
- xoauth_public_key: HTTP: //nsocialcontainer.com/server/naver_socialapp_public.cer
- opensocial_owner_id: 1400000000010946792
- opensocial_app_id: 25992
- oauth_timestamp: 1296334075
Заголовки
- X-Forwarded-For: 61.75.38.242
- X-shindig-dos: вкл - Accept-Encoding:gzip, deflate
- Ведущий:www.maxmax.co.cc:7677
- тело: ""
Я не получаю ни сообщений об ошибках, ни исключений, но isValidRequest2() всегда возвращает false, даже при наличии действительных запросов.
Я должен использовать это неправильно. Любая помощь будет оценена!! Если у вас есть какие-либо вопросы по этому вопросу, пожалуйста, задавайте.
Спасибо!!!!
1 ответ
Какую версию библиотеки вы используете, возможно, попробуйте собрать ее из исходного кода на github, если вы еще этого не сделали:
https://github.com/bittercoder/DevDefined.OAuth
Кроме того, стоит отметить, что некоторые реализации платформы opensocial возвращают URL-адреса с дополнительными амперсандами (такими, как раньше): подробности см. В нижней части этого поста здесь:
http://blog.bittercoder.com/PermaLink,guid,4f387bde-7ed6-480b-952b-bbc0ead9ebfb.aspx
Если у вас по-прежнему возникают проблемы, вы можете предоставить ссылку на полный пример своего потребительского кода (я предлагаю создать гист: https://gist.github.com/gists), который был бы очень полезен для понимания проблемы является.