2014-01-11 109 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标识。