2011-01-29 126 views
2

我想在我的C#服務器驗證傳入的簽名請求。 這些請求來自社交平臺(naver)。 我從他們那裏得到的是一張證書(如下)。在C#驗證簽名的請求#

我使用DevDefinedOAuth

http://code.google.com/p/devdefined-tools/

他們對這一主題的wiki文章。

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 MqqmVCasFlON7zU7Yyi8nOUAoClpoft0BXbT5xyNUmLOxT k47tmjWVMLniaOieVUEQLwP2yycH6hiWkf2gFWGsu9LHZbE = & 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 & opensocial_app_id = 25992 & oauth_timestamp = 1296334075

  • 列舉HTTPMethod:GET

  • 的UserAgent:Jakarta通用-的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 - 轉發,對於:61.75.38.242
    • X-狂歡-DOS :開 - 接受編碼:gzip,deflate
    • 房主:www.maxmax.co .CC:7677
  • 身上: 「」

我沒有得到任何錯誤信息,沒有例外,但isValidRequest2()總是返回 '假' 即使有有效的請求。

我一定是用錯了。 任何幫助將不勝感激! 如果您對此問題有任何疑問,請詢問。

謝謝!

+1

錯誤是...? – 2011-01-29 21:16:29

+1

什麼問題? – 2011-01-29 21:16:49

回答

0

您正在使用什麼版本的庫,也許嘗試從源文件編譯過的github在這裏,如果您尚未:

https://github.com/bittercoder/DevDefined.OAuth

此外,值得注意的是,一些的OpenSocial平臺實現返回的URL額外的符號(如用於和Friendster) - 看到這個博客帖子的底部查看詳情:

http://blog.bittercoder.com/PermaLink,guid,4f387bde-7ed6-480b-952b-bbc0ead9ebfb.aspx

如果你還在^ h如果你可以提供一個鏈接到你的消費者代碼的完整例子(我建議創建一個要點:https://gist.github.com/gists),這對於理解問題是什麼非常有幫助。