2012-07-17 35 views
6

我使用DotNetOpenAuth通過的OAuth2連接到Facebook和谷歌。 OAuth規範要求在request_uri中不提供其他參數,而Google實際上通過在您定義Google App時強制指定確切的回調函數來強制執行此操作。DotNetOpenAuth OAuth2.0的狀態參數

我要完成什麼是能夠給用戶返回到一個特定的URL,他們已經通過驗證與Facebook或谷歌之後。流程就是這樣,用戶點擊一個受保護的鏈接,它們會通過returnUrl參數轉發到我的登錄頁面,然後根據他們選擇的OAuth2授權服務器啓動授權流程。

由於request_uri中不能有任何參數(儘管Facebook可以讓您避開這個問題),我無法將returnUrl參數發送到授權服務器並返回,以便當用戶返回到我的網站,我轉發他們到他們試圖訪問受保護的頁面。我能做的最好的是轉發他們到主頁或成員的歡迎頁面。

解決此問題的方法是使用授權服務器將發送回request_uri的「狀態」參數,但我找不到用DotNetOpenAuth指定此方法的方法。

默認情況下,它看起來像代碼使用的SessionID的狀態參數,以驗證從授權服務器回來的請求。在WebServerClient類上指定一個IClientAuthorizationTracker時,我可以在響應從授權服務器返回時插入邏輯,但在授權請求準備好時不會調用它,所以我無法插入附加狀態。

這是WebServerClient.cs的PrepareRequestUserAuthorization代碼:

  // Mitigate XSRF attacks by including a state value that would be unpredictable between users, but 
     // verifiable for the same user/session. 
     // If the host is implementing the authorization tracker though, they're handling this protection themselves. 
     if (this.AuthorizationTracker == null) { 
      var context = this.Channel.GetHttpContext(); 
      if (context.Session != null) { 
       request.ClientState = context.Session.SessionID; 
      } else { 
       Logger.OAuth.WarnFormat("No request context discovered, so no client state parameter could be set to mitigate XSRF attacks."); 
      } 
     } 

這裏沒有別的塊這就是我本來期望能夠在自己的數據一起玩耍和插件。

對我缺少什麼,我有什麼建議?

+0

我的意思是說callback_uri而不是REQUEST_URI – Ameen 2012-07-18 03:29:12

回答

0

狀態參數必然與減輕XSRF攻擊心事重重。既然你已經有了一個用戶會話,你能否將returnUrl存儲在會話字典中?

或者,您可以使用DotNetOpenAuth file an issue詢問您是否允許將自己的數據綁定到狀態參數(以及DNOA自己的XSRF緩解代碼)。

+1

抱歉挖了這個古老的線程,但我們需要設置狀態值跟蹤的OAuth2旅程的能力。在WebServerClient.cs中,如果AuthorizationTracker不爲null,則不會添加xsrf標記,但不會添加「else」以允許將其設置爲AuthorizationTracker clientState的值,或者允許用戶提供的值代替xsrf標記。這聽起來像是一個疏忽,除非這是一個你可以詳細闡述的故意設計決定。 – Lukos 2014-09-02 15:03:25

+0

在我的情況下,我無法根據不同的URL區分用戶,我需要跟蹤他們正在執行的註冊類型,以便在OAuth2完成後他們到達不同的着陸頁。我認爲國家是實現這一目標的唯一途徑,而不需要修改註冊之旅以在稍後階段進行分裂(我想避免這種情況)。 – Lukos 2014-09-02 15:04:18