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

Posted

技术标签:

【中文标题】ASP.NET Web API 2:如何使用外部身份验证服务登录?【英文标题】:ASP.NET Web API 2: How do I log in with external authentication services? 【发布时间】:2014-01-30 16:26:53 【问题描述】:

根据这篇帖子http://www.asp.net/web-api/overview/security/external-authentication-services... 我可以使用本地身份验证服务(使用新的 ASP.NET 身份框架)登录

但我找不到正确调用(从移动应用程序或Postman)Visual Studio 2013 SPA 模板中生成的默认 Web API 的演练。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

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

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

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"]

现在向您要使用的提供者的 url 发送一个 GET 请求。您将被重定向到外部提供商的登录页面。填写您的凭据,您将被重定向回您的站点。现在从 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"

现在发送与之前一样的提供者 url 的请求

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] 标头添加到您发出的每个请求中。

【讨论】:

我的主要问题是我的客户端不是网络应用程序而是原生移动应用程序(andoird 应用程序或 ios 应用程序) @acor3 - 无论您使用什么平台,这都是相同的过程。对于原生移动应用程序,您将在应用程序中打开一个 Web 视图(iPhone 上的 UIWebView,android 上的 WebView),将用户发送到他们选择的提供商的 url,允许他们登录并进行重定向url 转到您的 api 中包含魔术令牌的页面。然后,您的应用程序将在 Web 视图中查找该令牌,一旦找到,它将从中获取承载/访问令牌,然后您可以在本机 HTTP GET/POST 调用中使用它。 感谢您的详细指导!如果我已经有一个令牌并想使用它对用户进行 Web api 身份验证怎么办。我通过内部 iOS SDK api 获得了这个令牌,它允许您在不打开 web 视图的情况下获取令牌。 我相信“现在向您要使用的提供商的 url 发送一个 GET 请求。”实际上应该是“重定向到您要使用的提供商的 url。”并且“现在像以前一样使用提供商 url 发送相同的请求”应该是“现在再次像以前一样使用提供商 url 发送相同的请求。 " @BrunoRamalho 对不起,我犯了一个错误。这是一个示例:在 C# 中,您可以使用 Uri 类和 HttpUtility.ParseQueryString 方法。 Uri uri= new Uri("http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1"); string access_token = HttpUtility.ParseQueryString(uri.Query).Get("access_token");【参考方案2】:

我发现另一个post 非常详细地展示了这种外部身份验证的工作原理。客户端是 WPF,服务器使用 ASP.NET Identity。

【讨论】:

【参考方案3】:

对于那些尝试在 Android 应用程序中通过 Facebook 使用 Web Api 2 外部登录的人,这篇文章仅解释了我们必须做的第一部分。这是一个非常解释性的全图链接:

[Authenticated access to WebAPI via Facebook token from Android App

【讨论】:

以上是关于ASP.NET Web API 2:如何使用外部身份验证服务登录?的主要内容,如果未能解决你的问题,请参考以下文章