如何使用 DotNetOpenAuth 強制 OAuth2 訪問令牌過期
我正在實現基於 DotNetOpenAuth 的 OAuth2 授權/資源伺服器。我的伺服器將頒發壽命很長的訪問令牌。這些令牌將在 iOS 設備上使用。我看到的流程是這樣的,1)要求使用者在 iOS 設備上輸入他們的使用者名/密碼 2)請求訪問令牌,授予類型為資源所有者密碼憑據 3)授予並儲存令牌在 iOS 設備上以供將來使用。
現在有時使用者會被禁用。我想同時撤銷令牌。我該怎麼做呢?我懷疑我需要為此使用
ICryptoKeyStore.RemoveKey方法,但不確定如何找到要刪除的密鑰。注 1:將來該伺服器將被第三方 Web 應用程序使用。
注意 2:擁有授予類型的資源所有者密碼憑據的要求源於這樣一個事實,即認為在 iOS 設備上實現瀏覽器重定向不值得花時間。
更新 1 原始碼中的一些探勘表明 DotNetOpenAuth 不支持這種強制令牌過期的能力。此外,在標準實現中甚至沒有檢查令牌的生命週期。據我所見,calss 對此負責
StandardAccessTokenAnalyzer,它忽略了LifetimeandUtcCreationDate屬性。此外,標準類似乎沒有ResourceServer任何數據庫訪問編碼,令牌有效性僅由令牌內容檢查,所以似乎如果我需要添加使令牌過期的能力,我需要ResourseServer自己連接到數據庫。我錯過了什麼嗎?更新 2 我想我在這裡找到了答案:https ://groups.google.com/forum/#!topic/dotnetopenid/ aLabu1ujkt4 這不是我所希望的,我仍然有一些不清楚的地方。例如,安德魯寫道:
然後,您的自定義類可以獲取訪問令牌,然後使用對授權伺服器的私有 HTTP 請求來驗證令牌的持續有效性。
鑑於不包括授權 ID ,尚不清楚如何進行此驗證。
AccessToken這會使查找目標授權記錄變得困難。理論上,我們可以嘗試通過結合客戶、使用者和發佈時間來查找它,但據我所知,不能保證這些都是唯一的。
現在有時使用者會被禁用。我想同時撤銷令牌。我該怎麼做呢?我懷疑我需要為此使用 ICryptoKeyStore.RemoveKey 方法,但不確定如何找到要刪除的密鑰。
您可以通過撤銷令牌背後的授權來撤銷令牌。這通常意味著您刪除數據庫授權表中的條目。這必須具有的效果是您的實現
IAuthorizationServerHost.IsAuthorizationValid將為此授權返回 false。這不會立即撤銷訪問令牌,但會阻止客戶端刷新過期的訪問令牌。因此,只要您的訪問令牌的生命週期相當短(一小時或更短),那麼使用者的禁用帳戶就意味著所有客戶端訪問都將在一小時內終止。
注意 2:擁有授予類型的資源所有者密碼憑據的要求源於這樣一個事實,即認為在 iOS 設備上實現瀏覽器重定向不值得花時間。
這是你的應用程序。但我敦促大家使用正確的瀏覽器重定向流程。使用者可能已經在設備的瀏覽器上登錄到您的伺服器,因此他們可以完全避免通過這種方式輸入他們的憑據,從而提高您的轉化率。與設備應用程序相比,使用者也更有可能信任要求其憑據的瀏覽器。至少我希望如此。
順便說一句,非身份驗證客戶端 (TBD)可能*不支持資源所有者密碼授予類型,而安裝的設備應用程序通常會支持。*因此,您可能會被迫使用不同的授權類型。
更新 1原始碼中的一些探勘表明 DotNetOpenAuth 不支持這種強制令牌過期的能力。此外,在標準實現中甚至沒有檢查令牌的生命週期。據我所見,calss 對此負責的是 StandardAccessTokenAnalyzer,它忽略了 Lifetime 和 UtcCreationDate 屬性。
DotNetOpenAuth會檢查並拒絕過期的訪問令牌。只是不在那個班級。它在反序列化訪問令牌的程式碼中進行了檢查。
此外,標準 ResourceServer 類似乎沒有任何數據庫訪問編碼,令牌有效性僅由令牌內容檢查,所以似乎如果我需要添加使令牌過期的能力,我需要自己將 ResourseServer 連接到數據庫. 我錯過了什麼嗎?
您是正確的,
ResourceServer該類不需要任何數據庫訪問,因為假定訪問令牌在其整個生命週期內都有效(預設情況下它們是不可撤銷的)。這就是為什麼建議使用較短的訪問令牌生命週期。這並不像你想像的那麼遙遠。例如,您很可能已經使用的 ASP.NET 表單身份驗證基於相同的模式:對使用者進行一次身份驗證,訪問數據庫進行憑據檢查,然後向使用者代理髮出加密和簽名的 HTTP cookie。從那時起,數據庫不會在每個傳入的 HTTP 請求上都被命中——cookie 簽名被驗證,然後假定它是有效的,直到 cookie 過期。同樣的原理。除了在 HTTP cookie 的情況下,還有一個滑動超時,因此只要使用者在站點上保持活動狀態,他們就不必重新進行身份驗證。使用 OAuth 2 訪問令牌,無論使用得多活躍,它們都會過期,從而強制刷新令牌,然後可以拒絕該令牌以鎖定訪問。鑑於 AccessToken 不包含授權 ID,尚不清楚如何進行此驗證。這會使查找目標授權記錄變得困難。理論上,我們可以嘗試通過結合客戶、使用者和發佈時間來查找它,但據我所知,不能保證這些都是唯一的。
確實沒有包含 ID,但是 client-user-issuedate-scope 的元組應該是唯一的,因為您的授權表應該有一個唯一的約束,因為重複是沒有意義的。此外,如果它們不是唯一的,那麼只要存在帶有該元組的任何記錄就表明授權是有效的。
希望這可以幫助。