使用外部访问令牌或本地访问令牌

时间:2014-09-04 12:29:34

标签: asp.net-mvc asp.net-web-api oauth asp.net-identity owin

我正在使用ASP.NET MVC 5.2.2, Web API 2.2 and Katana/OWIN 3.0开发一个应用程序。该应用程序将ASP.NET Identity 2.1用于本地帐户和数据库。

我正在使用OAuth Authorization Server来生成访问权限和刷新令牌。我有使用我的本地oauth授权服务器的Android和IOS应用程序。 Android和IOS应用程序使用SDK登录Facebook,Google等。之后,应用程序将(Facebook / Google / etc)访问令牌发送到服务器。服务器将使用Facebook / Google /等验证访问令牌。

如果有效,那么

  

1)我应该为应用程序生成新的本地访问令牌(在Auth标头中)   对于所有未来的要求?

     

2)该应用程序应该发送给我Facebook / Gmail /等   每次访问令牌(在Auth标头中),服务器验证   每次使用Facebook / Gmail /等访问令牌?

     

3)如果是本地访问   令牌过期,然后服务器使用刷新令牌生成新的   访问令牌。服务器是否应该更新访问令牌   在此期间刷新令牌或更新访问令牌就足够了吗?

1 个答案:

答案 0 :(得分:16)

验证社交提供程序外部访问令牌后,您需要将此外部访问令牌与授权服务器(本地机构)颁发的本地访问令牌交换。可以在此处找到此实施的所有详细信息:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-angularjs-app/ 如果这有帮助,请告诉我。

以下是我通过Local Authority更改外部访问令牌以及访问令牌问题所遵循的确切步骤。前端是AngularJS应用程序。你可以在这里查看演示应用程序,看看我是如何使用Facebook访问令牌访问web api http://ngauthenticationweb.azurewebsites.net/

1- AngularJS应用程序通过指定client_id,redirect_uri,response_type,将HTTP GET请求发送到我们的后端API中定义的匿名端点(/ ExternalLogin)。

2-一旦结束点收到GET请求,它将检查用户是否经过身份验证,并让我们假设他未经过身份验证,因此它将通知负责请求的外部提供商的中间件负责此操作在我们的案例中,它是Google。

3-将显示Google的同意屏幕,用户将提供其Google凭据进行身份验证。

4-谷歌将回调我们的后端API,谷歌将设置一个外部cookie,其中包含来自Google的身份验证结果(包含来自外部提供商的所有用户声明)。

5- Google中间件将列出名为“已验证”的活动,我们将有机会阅读Google设置的所有外部声明。在我们的案例中,我们有兴趣阅读名为“AccessToken”的声明,该声明代表Google Access令牌,此声明的发行人不是本地授权,因此我们无法直接使用此访问令牌来授权我们的安全呼叫后端API端点。

6-然后我们将外部提供商外部访问令牌设置为名为“ExternalAccessToken”的自定义声明,Google中间件将重定向回端点(/ ExternalLogin)。

7-现在使用外部cookie对用户进行身份验证,因此我们需要检查初始请求中设置的client_id和redirect_uri是否有效,并且此客户端配置为重定向指定的URI。

8-现在代码检查外部user_id以及提供者是否已经注册为本地数据库帐户(没有密码),在这两种情况下,代码将发出302重定向到redirect_uri参数中的指定URI,此URI将包含以下内容(“外部访问令牌”,“具有本地帐户”,“提供商”,“外部用户名”)作为URL哈希片段而不是查询字符串。

9-一旦AngularJS应用程序收到响应,它将根据它决定用户是否有本地数据库帐户,基于此,它将向其中一个端点发出请求(/ RegisterExternal或/ ObtainLocalAccessToken) 。两个端点都接受外部访问令牌,该令牌将用于验证,然后使用它来获取LOCAL AUTHORITY颁发的本地访问令牌。此本地访问令牌可用于访问我们的后端API安全端点。