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

aco*_*or3 48 .net asp.net oauth-2.0 asp.net-web-api asp.net-identity

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

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

谁能帮我?

ber*_*hir 111

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

首先获得所有可用的提供商

GET /api/Account/ExternalLogins?returnUrl=%2F&generateState=true
Run Code Online (Sandbox Code Playgroud)

响应消息是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"}]
Run Code Online (Sandbox Code Playgroud)

现在将GET请求发送到您要使用的提供程序的URL.您将被重定向到外部提供商的登录页面.填写您的凭据,您将被重定向回您的网站.现在解析access_tokenurl.

http://localhost:15359/#access_token=[..]&token_type=bearer&expires_in=[..]&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1
Run Code Online (Sandbox Code Playgroud)

如果用户已拥有本地帐户,.AspNet.Cookies则会设置cookie并完成操作.如果没有,则只设置.AspNet.ExternalCookiecookie并且您必须注册本地帐户.

有一个api可以找出用户是否已注册:

GET /api/Account/UserInfo
Run Code Online (Sandbox Code Playgroud)

回应是

{"userName":"xxx","hasRegistered":false,"loginProvider":"Facebook"}
Run Code Online (Sandbox Code Playgroud)

要为用户创建本地帐户,请致电

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

现在像以前一样使用提供者URL发送相同的请求

GET /api/Account/ExternalLogin?provider=Facebook&response_type=token&client_id=self&redirect_uri=http%3A%2F%2Flocalhost%3A15359%2F&state=QotufgXRptkAfJvcthIOWBnGZydgVkZWsx8YrQepeDk1
Run Code Online (Sandbox Code Playgroud)

但这次用户已经拥有一个帐户并获得身份验证.您可以/api/Account/UserInfo再次致电验证这一点.

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

  • @ acor3 - 无论您使用什么平台,它都是相同的过程.对于本机移动应用程序,您可以在应用程序中打开Web视图(iPhone上的UIWebView,Android上的WebView),将用户发送到他们选择的提供商的URL,允许他们登录,并进行重定向url转到api中包含魔术令牌的页面.然后,您的应用程序将在Web视图中查找该令牌,一旦找到它,它将从中获取承载/访问令牌,然后您可以在本机HTTP GET/POST调用中使用它. (6认同)
  • 我的主要问题是我的客户端不是Web应用程序而是本机移动应用程序(andoird app或IOS app) (4认同)
  • 感谢您的详细指导!如果我已经拥有令牌并想要使用它来对web api进行身份验证,该怎么办?我通过内部iOS SDK api获得此令牌,它允许您在不打开webview的情况下获取令牌. (3认同)
  • 我相信'现在向您要使用的提供商的网址发送GET请求.' 实际应该是'重定向到您要使用的提供商的网址.'以及"现在发送与提供商网址相同的请求"应该是"现在再次现在发送与提供商网址相同的请求,如前所述. " (3认同)
  • @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认同)

T N*_*T N 5

我发现另一篇帖子显示了这种外部认证的工作原理.客户端是WPF,服务器使用ASP.NET身份.