2012-01-31 149 views
3

我正在關注Ricky的Twitterizer example(對我的一些修改),但是當我嘗試發送身份驗證請求時收到「401 Unauthorized」異常:Twitterizer-遠程服務器返回錯誤:(401)未授權

{Twitterizer.TwitterizerException: The remote server returned an error: (401) Unauthorized. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. 
    at System.Net.HttpWebRequest.GetResponse() 
    at Twitterizer.WebRequestBuilder.ExecuteRequest() 
    at Twitterizer.OAuthUtility.GetRequestToken(String consumerKey, String consumerSecret, String callbackAddress) 
    --- End of inner exception stack trace --- 
    at Twitterizer.OAuthUtility.GetRequestToken(String consumerKey, String consumerSecret, String callbackAddress) 
    at MyProject.Controllers.AccountController.Authenticate(String oauthToken, String oauthVerifier, String returnUrl) in C:\path\to\my\website\Controllers\AccountController.cs:line 78} 

我有握住我的消費者密鑰和消費者祕密私有成員變量:

// I obtain my consumer key and the consumer secret from the web config 
private static readonly string _twitterConsumerKey = WebConfigurationManager.AppSettings["TwitterConsumerKey"]; 
private static readonly string _twitterConsumerSecret = WebConfigurationManager.AppSettings["TwitterConsumerSecret"]; 

而且我也有一個控制器來處理登錄:

// GET: Account/Logon/ 
[HttpPost] 
public ActionResult LogOn(string returnUrl) 
{ 
    return Authenticate(string.Empty, string.Empty, HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"])); 
} 

//private ActionResult 
private ActionResult Authenticate(string oauthToken, string oauthVerifier, string returnUrl) 
{ 
    if (string.IsNullOrEmpty(oauthToken) || string.IsNullOrEmpty(oauthVerifier)) 
    { 
     UriBuilder builder = new UriBuilder(this.Request.Url); 
     builder.Query = string.Concat(
      builder.Query, 
      string.IsNullOrEmpty(builder.Query) ? string.Empty : "&", 
      "returnUrl=", 
      returnUrl); 

     try 
     { 
      string token = OAuthUtility.GetRequestToken(
       _twitterConsumerKey, 
       _twitterConsumerSecret, 
       builder.ToString()).Token; // <-- Throws the exception 

      return Redirect(OAuthUtility.BuildAuthorizationUri(token, true).ToString()); 
     } 
     catch (Exception e) 
     { 
      ViewBag.Error = e.ToString(); // 401 Unauthorized 
      return View(); 
     } 
    } 

    OAuthTokenResponse tokens = OAuthUtility.GetAccessToken(
     _twitterConsumerSecret, 
     _twitterConsumerSecret, 
     oauthToken, 
     oauthVerifier); 

    // Save the user details and set the authentication (cookie) 
    // ... 
    // ... 
    // ... 

    if (string.IsNullOrEmpty(returnUrl)) 
     return Redirect("/"); 
    else 
     return Redirect(returnUrl); 
} 

請注意,我刪除了一些與該錯誤無關的代碼。僅上面的代碼就會導致例外。有一點要注意的是我的returnUrl是空的(儘管如果我也提供returnUrl也會發生同樣的情況);一切似乎都很好。 HttpWebRequest看起來像這樣:

Address = {https://api.twitter.com/oauth/request_token?oauth_callback=http://localhost:24465/Account/LogOn?returnUrl=} 

有什麼想法可能會導致此問題?

回答

8

登錄到dev.twitter.com並仔細檢查您的應用程序是否是Web應用程序。爲了成爲一個Web應用程序,你必須在那裏提供一個回調url,即使你要在運行時提供一個「真正的」回調。

僅供參考,您無法爲註冊的回調URL提供'localhost',但您可以使用127.0.0.1。

+0

啊,呃!感謝Ricky,我沒有將我的應用程序設置爲一個Web應用程序......我將進行更改,看看能否讓它正常運行。附:這是否意味着我的桌面服務將不再能夠使用相同的宣誓令牌? – Kiril 2012-02-01 22:58:10

+0

Yah,那是問題......謝謝! – Kiril 2012-02-01 23:15:34

+1

您的桌面應用程序可以使用您的網站的消費者令牌:在運行時將「oob」作爲您的回調網址,並且Twitter將使用基於引腳的身份驗證。 – 2012-02-02 21:59:44

相關問題