2014-01-11 107 views

回答

103

今天我有同樣的問題,找到了以下解決方案:

首先獲得所有可用提供商

GET /api/Account/ExternalLogins?returnUrl=%2F&generateState=true 

響應消息是JSON格式列表現在

[{"name":"Facebook", 
    "url":"/api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1", 
    "state":"QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1"}] 

發送一個GET請求到你想要使用的提供者的URL。您將被重定向到外部提供商的登錄頁面。填寫您的憑據,您將被重定向回您的網站。現在解析url中的access_token

http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1 

如果用戶已經擁有本地帳戶,則會設置.AspNet.Cookies cookie並完成操作。如果不是,則只設置.AspNet.ExternalCookie cookie,您必須註冊本地帳戶。

還有就是要找出一個API,如果用戶註冊:

GET /api/Account/UserInfo 

的響應是

{"userName":"xxx","hasRegistered":false,"loginProvider":"Facebook"} 

要爲用戶創建一個本地帳戶,請致電

POST /api/Account/RegisterExternal 
Authorization: Bearer VPcd1RQ4X... (access_token from url) 
Content-Type: application/json 
{"UserName":"myusername"} 

現在發送與提供商網址相同的請求

GET /api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1 

但此時用戶已經有一個帳戶,並通過認證。您可以通過再次調用/api/Account/UserInfo來驗證。

現在從URL中提取的access_token。您必須將Authorization: Bearer [access_token]標頭添加到您提出的每個請求中。

+4

我的主要問題是,我的客戶端不是一個Web應用程序,但原生移動應用程序(andoird應用或iOS應用) – acor3

+5

@ acor3 - 這是相同的過程,不管你使用什麼平臺。對於原生移動應用程序,您可以在您的應用程序(iPhone上的UIWebView,Android上的WebView)中打開Web視圖,將用戶發送到他們選擇的提供商的URL,允許他們登錄並重定向url轉到您的api中包含魔法令牌的頁面。然後,您的應用程序將查看該令牌的Web視圖,一旦找到該應用程序,它就會從中獲取承載/訪問令牌,然後您可以在本地HTTP GET/POST調用中使用它。 –

+1

@berhir - 感謝您的回答,我發現它確實對Web API 2安全性有幫助。雖然我的情況稍有不同。我從另一個MVC應用程序調用API。所以你說'你會被重定向回你的網站。現在解析url中的access_token'在我的情況下,你會如何處理它? – Bartosz

5

我發現了另一個post顯示相當詳細講述外部認證是如何工作的。客戶端是WPF,服務器使用ASP.NET標識。