2012-09-03 47 views
13

我正在編寫一個使用MVC4的Web API,該API應該被多種客戶端類型使用。我想使用OpenID進行身份驗證。如何將OpenID集成到MVC4 Web API中

我已經下載了DotNetOpenAuth NuGet包,但到目前爲止,所有示例都是針對客戶端應用程序的,而不是API。

我的問題很簡單。我想讓客戶端向我的API發送認證請求。 API使用OpenID提供程序進行身份驗證。然後,API設置所需的任何內容,以便在整個Web API調用中使用[Authorize]標籤。

我知道在.NET應用程序中,可以調用FormsAuthentication.SetCookie,但是這對於其他語言也是一個易於實現的解決方案嗎?

簡而言之,這個問題。我如何將OpenID集成到MVC4 web api中,以允許使用可被多種語言調用和使用的Authorize標籤?

+1

對於回頭來看這個的人來說,DotNetOpenAuth的NuGet包似乎並不是最新的(截至今天)。它沒有包含OAUTH2名稱空間。請使用[sourceforge鏈接](http://sourceforge.net/projects/dnoa/)。 – Quickhorn

+0

看看這個項目http://weblogs.asp.net/haithamkhedre/archive/2011/03/13/openid-authentication-with-asp-net-mvc3-dotnetopenauth-and-openid-selector.aspx –

回答

23

您可能會混淆身份驗證和授權的角色。這聽起來像你的Web API需要

讓我們從授權開始。每個API(即由瀏覽器以外的客戶端應用程序訪問的網址)都允許匿名訪問,或者必須經過授權(即授權)。授權是OAuth的域名。 OAuth(v2,大概)描述了客戶端如何授權對您的WebAPI的調用。

推測作爲授權過程的一部分,用戶登錄到您的服務。登錄用戶的這一步是認證。它與授權正交。無論您是通過OpenID認證用戶,用戶名/密碼,X.509證書等,都與WebAPI呼叫的授權無關。換句話說,你的WebAPI方法不應該關心用戶如何認證(閱讀:沒有OpenID綁定任何東西)。他們將擁有一個授權過濾器,用於驗證傳入請求的授權並將其轉換爲幾條信息,包括授權訪問的帳戶的用戶名,訪問級別,授權的ID客戶端等

因此,在一次一步,整個情況可能去是這樣的:

  1. 用戶運行第三方客戶端應用程序(假設爲簡單起見,該客戶端應用程序是第三第三方Web應用程序)希望使用需要客戶端以用戶名訪問WebAPI的功能。
  2. 當客戶端調用WebAPI時,客戶端需要獲取有限的模擬用戶的授權。他們從您的服務開始,將OAuth 2重定向到授權端點。如果這是使用DotNetOpenAuth實現的,則可以使用WebServerClient類。
  3. 您的授權終端充滿了OAuth 2授權服務器的角色,因此使用DotNetOpenAuth的AuthorizationServer類。它所做的第一件事是檢查請求中是否包含ASP.NET表單身份驗證Cookie。這個cookie很自然地表明用戶是否已經在他們的瀏覽器上登錄了你的服務,如果是,那麼這個用戶是誰。檢查這個cookie是一個簡單的電話Controller.User。請注意,您的授權端點是MVC而不是WebAPI,因爲它的響應是針對瀏覽器/用戶的,而不是客戶端應用程序。我們假設沒有這樣的cookie,Controller.User爲空(或User.Identity.IsAuthenticatedfalse)。請參閱OAuthAuthorizationServer示例以瞭解如何實現此端點。
  4. 您的授權端點會響應重定向至用戶登錄頁面,其中包含查詢字符串中的redirectUrl參數,該參數保留完整的傳入OAuth 2授權請求URL。
  5. 您的用戶登錄頁面是充當OpenID依賴方的MVC端點。此端點使用DotNetOpenAuth的OpenIdRelyingParty類。請注意,此端點對OAuth 2或授權內容一無所知。它只是驗證用戶。驗證用戶身份後,它會重定向回redirectUrl參數中的URL。請參閱OpenIdRelyingPartyMvc示例瞭解如何執行此操作。
  6. 授權端點重複其前一步驟,但此時有一個FormsAuthentication cookie,因此它繼續向用戶顯示一個頁面,詢問他們是否要授權客戶端訪問用戶的數據。用戶點擊是。 (請注意:在此用戶授權頁面上實施XSRF和點擊劫持緩解措施)。
  7. 授權端點處理用戶的肯定響應並呼叫AuthorizationServer創建授權記錄並將響應返回給客戶端。此調用的結果之一是爲客戶端提供重定向響應,併爲其提供授權代碼。
  8. 瀏覽器正在拉取傳遞授權碼的客戶端應用程序的URL。客戶端然後使用WebServerClient類交換訪問令牌的授權代碼(通常也是一個刷新令牌)。
  9. 客戶端應用程序現在直接調用WebAPI URL,包括通過HTTP Authorization標頭中的OAuth 2獲取的訪問令牌。
  10. 您的WebAPI填充了OAuth2資源服務器的角色,並且您應用於您的WebAPI方法以驗證傳入OAuth 2訪問令牌的授權篩選器屬性使用DotNetOpenAuth ResourceServer類來完成其工作。您可以參考OAuthResourceServer示例,或者更好地瞭解如何執行此操作。

這就是整個故事。是的,客戶端角色很容易編寫,無論他們碰巧使用哪種語言或庫。

順便說一下,我所指的DotNetOpenAuth示例不是通過NuGet分發的。你get the samples from SourceForge