2014-09-04 191 views
7

我正在开发使用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)我应该产生(在验证头)新的本地访问令牌到Google Apps 将来所有的请求?

2)应用程序是否每次向我发送Facebook/Gmail/etc 访问令牌(在Auth头文件中),并且服务器每次都通过Facebook/Gmail /等验证 访问令牌? 3)如果本地访问 令牌过期,则服务器使用刷新令牌生成新的访问令牌。在此期间,服务器是否应该更新访问令牌以及更新令牌,或更新访问令牌是否足够?

+0

据我所知,您正在向Google/Facebook验证您的Android/iOS应用程序。从这些第三方服务接收到access_token后,您的服务器将再次使用Google/Facebook验证令牌。那么,第二次验证的目的是什么?它是否正在运行(服务器验证Android/Facebook访问令牌给Google/Facebook)?我从来没有尝试过,但考虑到访问令牌是如何创建的,我理解它很奇怪。 – 2014-09-08 22:00:18

+0

@Freerider,我正在使用承载认证使用OAUTH服务器(请参阅上面的链接)。当用户登录时,我需要从oauth服务器生成一个访问令牌。 – user960567 2014-09-09 05:58:22

回答

15

验证您的社交提供者外部访问令牌后,您需要将此外部访问令牌与授权服务器(本地管理机构)颁发的本地访问令牌交换。这个实现的所有细节可以在这里找到: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应用程序向我们的后端API中定义的匿名终端(/ ExternalLogin)发送HTTP GET请求指定client_id,redirect_uri,response_type。

2-终端接收到GET请求后,会检查用户是否已通过身份验证,并假设他未通过身份验证,因此它会通知负责请求外部提供商的中间件负责这个电话,在我们的例子中是Google。

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

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

5- Google中间件将列出名为“Authenticated”的事件,我们将有机会阅读由Google设置的所有外部声明。在我们的案例中,我们有兴趣阅读代表Google Access令牌的名为“AccessToken”的声明,此声明的发行者不是LOCAL AUTHORITY,因此我们不能直接使用此访问令牌来授权对我们的安全后端API端点。

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

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

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

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

+0

我同意这一点。到#3答案是棘手的。 Oauth手机流量不包含刷新令牌,因此无论您使用持票人令牌还是访问令牌都无法帮助您。你可能需要在你的协议中建立一些东西来工作在一个新的不记名令牌中。 – 2014-09-12 20:19:49

+0

请阅读我完整的问题。 – user960567 2014-09-13 07:08:30

+0

我正在使用原生移动?来吧 – user960567 2014-09-14 07:28:11