ASP.NET Web API 2:如何使用外部身份验证服务登录?

时间:2014-01-11 17:44:12

标签: asp.net .net asp.net-web-api oauth-2.0 asp.net-identity

根据这篇文章http://www.asp.net/web-api/overview/security/external-authentication-services ... 我能够使用本地身份验证服务(使用新的Asp.net身份框架)登录

但无法找到一个walktrough来正确调用(从移动应用程序或Postman)Visual Studio 2013 SPA模板中生成的默认Web api。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:110)

我今天遇到了同样的问题,并找到了以下解决方案:

首先获取所有可用的提供者

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请求。您将被重定向到外部提供商的登录页面。填写您的凭据,您将被重定向回您的网站。现在解析网址中的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来验证这一点。

现在从网址中提取access_token。您必须为每个请求添加Authorization: Bearer [access_token]标头。

答案 1 :(得分:5)

我发现另一个post显示了此外部身份验证的工作原理。客户端是WPF,服务器使用ASP.NET身份。

答案 2 :(得分:-1)

对于那些试图在Android App中使用Web Api 2外部登录和Facebook的用户,这篇文章仅解释了我们要做的第一部分。这是整个图片的非常说明性的链接:

[Authenticated access to WebAPI via Facebook token from Android App