2013-05-02 54 views
0

我具有以下调用的OAuth类的GenerateSignature方法代码WCF RESTful服务OAuthentication产生两个不同的散列值

 Uri u = new Uri(urlToCall); 
     string url, param; 
     HttpWebRequest request = WebRequest.Create("http://localhost/RESTFUL_DEMO.Web/services/Calc.svc/dowork") as HttpWebRequest;  

     string consumerKey = "test"; 
     string consumerSecret = "Jenish"; 
     var oAuth = new OAuthBase(); 
     var nonce = oAuth.GenerateNonce(); 
     var timestamp = oAuth.GenerateTimeStamp(); 
     var signature = oAuth.GenerateSignature(u,consumerKey,consumerSecret,string.Empty,string.Empty,"POST",timestamp,nonce,OAuthBase.SignatureTypes.HMACSHA1,out url, out param); 
     WebRequest request = WebRequest.Create(string.Format("{0}?{1}&oauth_signature={2}", urlToCall, param, signature)); 
     request.Method = "POST"; 
     Enroll a = new Enroll("2"); 
     XmlSerializer ser = new XmlSerializer(a.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     ser.Serialize(ms, a); 
     byte[] bytes = ms.ToArray(); 
     request.ContentType = "text/xml"; 
     request.Timeout = 30000; 
     request.ContentLength = bytes.Length; 
     var requeststream = request.GetRequestStream(); 
     requeststream.Write(bytes, 0, bytes.Length); 
     requeststream.Close(); 
     WebResponse response = request.GetResponse(); 
     StreamReader stream = new StreamReader(response.GetResponseStream()); 

我已经创建以下在我的服务身份验证方法,该方法从传入的请求生成签名

private static bool Authenticate(IncomingWebRequestContext context) 
    { 
     bool Authenticated = false; 
     string normalizedUrl; 
     string normalizedRequestParameters; 
     //context.Headers 
     NameValueCollection pa = context.UriTemplateMatch.QueryParameters; 
     if (pa != null && pa["oauth_consumer_key"] != null) 
     { 
      // to get uri without oauth parameters 
      string uri = context.UriTemplateMatch.RequestUri.OriginalString.Replace 
       (context.UriTemplateMatch.RequestUri.Query, ""); 
      string consumersecret = "Jenish"; 
      OAuthBase oauth = new OAuthBase(); 
      string hash = oauth.GenerateSignature(
       new Uri(uri), 
       pa["oauth_consumer_key"], 
       consumersecret, 
       null, // totken 
       null, //token secret 
       "POST", 
       pa["oauth_timestamp"], 
       pa["oauth_nonce"], 
       out normalizedUrl, 
       out normalizedRequestParameters 
       ); 
      Authenticated = pa["oauth_signature"] == hash; 
     } 
     return Authenticated; 
    } 

Above Authenticate方法生成的签名与传入的请求参数pa [“oauth_signature”]不匹配。任何人都可以请帮我解决问题,让我知道为什么两个不同的签名生成。

回答

1

我试图通过考虑您上面的代码复制你的错误,并发现从

context.UriTemplateMatch.RequestUri.OriginalString 

在身份验证方法生成的URI得到确实产生完全合格的计算机名称,而不是本地主机的URI。所以在你的wcf消费者端HttpWebRequest请求URI应包括完全合格的机器名称以及域名。

例如, 如果您有机器名Jenish-PC和访问abc.efg.com那么URI应该像

http://Jenish-pc.abc.efg.com/[rest of your service path] 

,而不是

http://localhost/....