Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET Web API 2:如何使用外部身份验证服务登录?_Asp.net_.net_Asp.net Web Api_Oauth 2.0_Asp.net Identity - Fatal编程技术网

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

ASP.NET Web API 2:如何使用外部身份验证服务登录?,asp.net,.net,asp.net-web-api,oauth-2.0,asp.net-identity,Asp.net,.net,Asp.net Web Api,Oauth 2.0,Asp.net Identity,根据这篇文章。。。 我可以使用本地身份验证服务(使用新的ASP.NET身份验证框架)登录 但我找不到一个演练来正确调用(从移动应用程序或)Visual Studio 2013 SPA模板中生成的默认web API 有人能帮我吗?我今天遇到了同样的问题,找到了以下解决方案: 首先,获取所有可用的提供者 GET /api/Account/ExternalLogins?returnUrl=%2F&generateState=true 响应消息是json格式的列表 [{"name":"Face

根据这篇文章。。。 我可以使用本地身份验证服务(使用新的ASP.NET身份验证框架)登录

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


有人能帮我吗?

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

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

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\u令牌

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\u令牌。您必须在每个请求中添加
Authorization:Bearer[access\u token]
头。

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

对于那些试图在Android应用程序中通过Facebook使用Web Api 2外部登录的用户,本文仅解释我们必须做的第一部分。下面是整个画面的一个非常解释性的链接:


[

我的主要问题是,我的客户端不是一个web应用程序,而是一个本机移动应用程序(andoird应用程序或IOS应用程序)@acor3-无论您使用的是什么平台,这都是相同的过程。对于本机移动应用程序,您将在应用程序中打开一个web视图(iPhone上的UIWebView,Android上的WebView),将用户发送到他们选择的提供商的url,允许他们登录,并将重定向url转到api中包含魔术令牌的页面。然后,你的应用程序将在web视图中查找该令牌,一旦找到,它将从中获取承载/访问令牌,然后你可以在本机HTTP GET/POST调用中使用它。谢谢对于详细的指南!如果我已经有一个令牌,并希望使用它根据web api对用户进行身份验证,该怎么办?我是通过内部iOS SDK api获得该令牌的,它允许您在不打开web视图的情况下获取该令牌。我相信“现在向您要使用的提供商的url发送get请求。”实际上应该是“重定向到p的url”您要使用的rovider。以及“现在使用提供程序url发送与以前相同的请求”应该是“现在再次使用提供程序url发送与以前相同的请求”。“@BrunoRamalho抱歉,我犯了一个错误。下面是一个例子:在C中,您可以使用
Uri
类和
HttpUtility.ParseQueryString
方法。
Uri=new-Uri(”http://localhost:15359/#access_token=[…]&令牌类型=承载人和到期日(in=[…]&状态=qotufgxrptkafjvcThiowbngzydgvkzwsx8yrqeedk1“);string access_token=HttpUtility.ParseQueryString(uri.Query).Get(“access_token”);