2013-05-31 47 views
3

我在使用DotNetOpenAuth和我必須處理的特定流程中需要實現一個場景的答案時遇到了很多困難。有自己的Auth服務器的DotNetOpenAuth OpenID流

在下面的圖形中,我控制着MVC站點和API。該API既是我的授權服務器,也是我的資源服務器。

的用戶名和口令流

的處理是在用戶創建一個本地帳戶我的系統上爲我處理的用戶名和密碼credetials的情況相當明顯,以他們登錄到網站然後我可以將其傳遞給我的令牌端點,然後經過我的授權服務器的HandleTokenRequest,以獲取令牌並刷新令牌,以便客​​戶端開始訪問資源。

OpenID的流量

的,我是在虧損與目前的流動是如果用戶決定使用他們的谷歌憑據(例如)登錄到我的網站。在這種情況下,我如何授予他們訪問令牌的權限,並在我的API中從我自己的授權服務器刷新令牌?

我會在我的API令牌端點的請求中包含什麼?

我已經編寫了自己的API客戶端,該客戶端繼承自作爲DotNetOpenAuth庫的一部分的WebServerClient類。

我看到有一個接口提供處理令牌,名爲IServiceProviderTokenManager,但似乎在OpenID提供程序方案中使用,而不是像我的API客戶端實現,所以我假設我需要編寫自定義類用於在客戶端存儲和檢索我自己的API令牌,但是也希望確認這一點?

值得一提的是,網站和API都可以完全訪問同一個安全數據庫,但只有API可以訪問任何資源所在的數據庫。 Shows a set of flows using either local account with username and password or an openid provider

回答

1

爲了完整起見,我想我會用我的答案更新這個問題。

我最終做的是將AuthorizeToken端點移動到我的MVC 4應用程序中,而不是將它們放在API本身中。

調用授權端點時,這一方式在用戶登錄(因此具有ASP.NET FormsAuthentication餅乾存在)也可以當請求處理達到這個代碼來獲得授予的授權代碼:

 // Consider auto-approving if safe to do so. 
     if (((OAuth2AuthorizationServer)this.authorizationServer.AuthorizationServerServices).CanBeAutoApproved(pendingRequest)) 
     { 
      var approval = this.authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, HttpContext.User.Identity.Name); 
      return this.authorizationServer.Channel.PrepareResponse(approval).AsActionResult(); 
     } 

獲得授權碼後,您可以使用WebServerClient實例調用Token端點並調用其RequestUserAuthorization方法。

當這個回調函數可以調用ProcessUserAuthorization方法,它將返回一個IAuthorizationState對象與您的訪問令牌和刷新令牌。