2014-09-04 192 views
7

我正在開發使用ASP.NET MVC 5.2.2, Web API 2.2 and Katana/OWIN 3.0的應用程序。該應用程序使用ASP.NET Identity 2.1作爲本地帳戶和數據庫。使用外部訪問令牌或本地訪問令牌

我使用OAuth Authorization Server來生成訪問和刷新令牌。我有使用我的本地oauth授權服務器的Android和IOS應用程序。 Android和iOS應用程序使用SDK與Facebook,Google等登錄。之後,應用程序將(Facebook/Google/etc)訪問令牌發送到服務器。服務器將通過Facebook/Google /等驗證訪問令牌。

如果它是有效的,那麼,

1)我應該產生(在驗證頭)新的本地訪問令牌到Google Apps 將來所有的請求?

2)應用程序是否每次向我發送Facebook/Gmail/etc 訪問令牌(在Auth頭文件中),並且服務器每次都通過Facebook/Gmail /等驗證 訪問令牌? 3)如果本地訪問 令牌過期,則服務器使用刷新令牌生成新的訪問令牌。在此期間,服務器是否應該更新訪問令牌以及更新令牌,或更新訪問令牌是否足夠?

+0

據我所知,您正在向Google/Facebook驗證您的Android/iOS應用程序。從這些第三方服務接收到access_token後,您的服務器將再次使用Google/Facebook驗證令牌。那麼,第二次驗證的目的是什麼?它是否正在運行(服務器驗證Android/Facebook訪問令牌給Google/Facebook)?我從來沒有嘗試過,但考慮到訪問令牌是如何創建的,我理解它很奇怪。 – 2014-09-08 22:00:18

+0

@Freerider,我正在使用承載認證使用OAUTH服務器(請參閱上面的鏈接)。當用戶登錄時,我需要從oauth服務器生成一個訪問令牌。 – user960567 2014-09-09 05:58:22

回答

15

驗證您的社交提供者外部訪問令牌後,您需要將此外部訪問令牌與授權服務器(本地管理機構)頒發的本地訪問令牌交換。這個實現的所有細節可以在這裏找到:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ 讓我知道這是否有幫助。

以下是我通過Local Authority更改外部訪問令牌時出現訪問令牌問題的確切步驟。前端是一個AngularJS應用程序。您可以在這裏查看演示應用程序,並瞭解我如何使用Facebook訪問令牌訪問Web API http://ngauthenticationweb.azurewebsites.net/

1- AngularJS應用程序向我們的後端API中定義的匿名終端(/ ExternalLogin)發送HTTP GET請求指定client_id,redirect_uri,response_type。

2-終端接收到GET請求後,會檢查用戶是否已通過身份驗證,並假設他未通過身份驗證,因此它會通知負責請求外部提供商的中間件負責這個電話,在我們的例子中是Google。

3-將顯示Google的同意屏幕,用戶將提供他的Google憑據進行身份驗證。

4-谷歌會回調我們的後端API,谷歌會設置一個外部cookie,其中包含來自Google的認證結果(包含來自外部提供商的所有用戶聲明)。

5- Google中間件將列出名爲「Authenticated」的事件,我們將有機會閱讀由Google設置的所有外部聲明。在我們的案例中,我們有興趣閱讀代表Google Access令牌的名爲「AccessToken」的聲明,此聲明的發行者不是LOCAL AUTHORITY,因此我們不能直接使用此訪問令牌來授權對我們的安全後端API端點。

6-然後我們將外部提供商外部訪問令牌設置爲名爲「ExternalAccessToken」的自定義聲明,Google中間件將重定向回終點(/ ExternalLogin)。

7-現在,用戶使用外部cookie進行身份驗證,因此我們需要檢查初始請求中設置的client_id和redirect_uri是否有效,並將此客戶端配置爲重定向指定的URI。

8-現在代碼檢查外部user_id是否與提供者一起已經註冊爲本地數據庫帳戶(無密碼),在這兩種情況下代碼都會發出302重定向到redirect_uri參數中指定的URI,this URI將包含以下內容(「外部訪問令牌」,「有本地帳戶」,「提供者」,「外部用戶名」)作爲URL哈希片段而不是查詢字符串。

9-一旦AngularJS應用程序收到響應,它會根據它來決定用戶是否擁有本地數據庫帳戶,基於此將向其中一個端點發出請求(/ RegisterExternal或/ ObtainLocalAccessToken )。兩個端點都接受將用於驗證的外部訪問令牌,然後使用它來獲取由LOCAL AUTHORITY發佈的本地訪問令牌。這個本地訪問令牌可以用來訪問我們的後端API安全端點。

+0

我同意這一點。到#3答案是棘手的。 Oauth手機流量不包含刷新令牌,因此無論您使用持票人令牌還是訪問令牌都無法幫助您。你可能需要在你的協議中建立一些東西來工作在一個新的不記名令牌中。 – 2014-09-12 20:19:49

+0

請閱讀我完整的問題。 – user960567 2014-09-13 07:08:30

+0

我正在使用原生移動?來吧 – user960567 2014-09-14 07:28:11