问题 在ASP.NET WebApi中实现移动应用程序的外部身份验证2


我正在尝试构建一个API(使用ASP.NET WebApi),该API将由本机移动应用程序用于学校项目。 (我不关心/开发移动应用程序,这个责任落在另一个成员身上) 我正处于需要实现基于令牌的Facebook登录的地步。有很多教程可用于如何为基于浏览器的应用程序实现此功能(这是非常直接的,其中大部分是内置的),但我不认为我遵循如何使用本机应用程序。我不明白重定向是如何工作的?

根据这个 链接,没有什么需要由我的服务器专门处理。我不认为我明白这是如何工作的?如何处理来自Facebook的令牌?

此外,我应该实现令牌处理的哪个部分,我无法找到WebApi外部登录身份验证的良好文档。

无论如何,如果有人能指出我发生的令牌交换的确切流程以及ASP.NET默认实现的内容,那将是非常有用的。

此外,对我来说最大的困惑是我不明白Facebook将返回的令牌将如何处理。

  1. 我假设令牌将返回给客户端(移动应用程序),如何在我的服务器上访问它?
  2. 如何从facebook的令牌创建本地令牌? 这一切都是由ASP.NET内部/自动魔术完成的吗?

对不起,如果这是我应该弄明白的话。我做了很多研究,发现自己陷入了(相关和无关)的信息。我不认为我甚至不知道如何搜索我需要的信息。

我读过的一些链接:

声明和基于令牌的身份验证(ASP.NET Web API)

使用ASP.NET Web API 2,Owin和Identity进行基于令牌的身份验证

在AngularJS应用程序中使用Facebook和Google进行ASP.NET Web API 2外部登录


11168
2017-11-16 01:52


起源



答案:


对于我正在处理的应用程序,我必须做同样的事情。我也很难找到有关它的信息。似乎我发现的一切都接近我所需要的,但不完全是解决方案。我最后从一堆不同的博客文章,文章等中获取点点滴滴,然后将它们放在一起以使其工作。

我记得你在“AngularJS应用程序”中发布的“声明和基于令牌的身份验证”和“ASP.NET Web API 2与Facebook和Google的外部登录”中的两个链接是有用的信息。

我不能给你一个全面的答案,因为我不记得我必须做的一切,也不理解我当时所做的一切,但我可​​以给你一般的想法。你走在正确的轨道上。

基本上我最终使用Facebook授予的令牌来确认他们已登录到他们的Facebook帐户,根据他们的Facebook用户ID创建用户,并授予他们可用于访问我的API的我自己的持票人令牌。

流程看起来像这样:

  1. 客户通过任何方法(我们使用的方法)通过Facebook验证 oauth.io
    • Facebook向他们返回一个令牌
  2. 客户端将令牌信息发送到我的WebApi控制器的注册端点
    • 使用Facebook的Graph API验证令牌,该API返回用户信息
    • 通过ASP.NET Identity在数据库中创建用户,并以Facebook用户ID为关键
  3. 客户端将令牌信息发送到WebApi控制器的身份验证端点
    • 使用Facebook的Graph API验证令牌,该API返回用户信息
    • 用户信息用于在数据库中查找用户,确认他们之前已注册
    • ASP.NET Identity用于为该用户生成新令牌
    • 该令牌将返回给客户端
  4. 客户端在所有未来的HTTP请求中都包含一个Authorization标头,其中包含我的服务授予的新令牌(例如“授权:承载” TOKEN“)
    • 如果WebApi端点具有[Authorize]属性,则ASP.NET Identity将自动验证承载令牌,如果无效则拒绝访问

最终有很多自定义代码用于使用ASP.NET标识实现OAuth,并且您包含的那些链接向您展示了一些。希望这些信息对你有所帮助,对不起我帮不了多忙。


11
2017-11-17 03:05



谢谢你的流程。我觉得我比上周有更好的理解。我确实有一个跟进问题。我是否必须随时创建服务器端cookie? (我正在使用基于令牌的身份验证)另外,另一个复杂的层来自我使用NoSQL数据存储(而不是标准SQL选项)的事实。这意味着我将不得不实现自定义代码。有关于这个主题的任何信息吗?您可以分享的任何链接? - Chris Turk
我不相信您将需要任何类型的cookie,因为您只需将持有者令牌作为标头发送到服务器的所有后验证请求中。我没有使用NoSQL数据存储实现类似的经验。对不起,希望我能提供更多帮助。祝你好运。 - mattherman


答案:


对于我正在处理的应用程序,我必须做同样的事情。我也很难找到有关它的信息。似乎我发现的一切都接近我所需要的,但不完全是解决方案。我最后从一堆不同的博客文章,文章等中获取点点滴滴,然后将它们放在一起以使其工作。

我记得你在“AngularJS应用程序”中发布的“声明和基于令牌的身份验证”和“ASP.NET Web API 2与Facebook和Google的外部登录”中的两个链接是有用的信息。

我不能给你一个全面的答案,因为我不记得我必须做的一切,也不理解我当时所做的一切,但我可​​以给你一般的想法。你走在正确的轨道上。

基本上我最终使用Facebook授予的令牌来确认他们已登录到他们的Facebook帐户,根据他们的Facebook用户ID创建用户,并授予他们可用于访问我的API的我自己的持票人令牌。

流程看起来像这样:

  1. 客户通过任何方法(我们使用的方法)通过Facebook验证 oauth.io
    • Facebook向他们返回一个令牌
  2. 客户端将令牌信息发送到我的WebApi控制器的注册端点
    • 使用Facebook的Graph API验证令牌,该API返回用户信息
    • 通过ASP.NET Identity在数据库中创建用户,并以Facebook用户ID为关键
  3. 客户端将令牌信息发送到WebApi控制器的身份验证端点
    • 使用Facebook的Graph API验证令牌,该API返回用户信息
    • 用户信息用于在数据库中查找用户,确认他们之前已注册
    • ASP.NET Identity用于为该用户生成新令牌
    • 该令牌将返回给客户端
  4. 客户端在所有未来的HTTP请求中都包含一个Authorization标头,其中包含我的服务授予的新令牌(例如“授权:承载” TOKEN“)
    • 如果WebApi端点具有[Authorize]属性,则ASP.NET Identity将自动验证承载令牌,如果无效则拒绝访问

最终有很多自定义代码用于使用ASP.NET标识实现OAuth,并且您包含的那些链接向您展示了一些。希望这些信息对你有所帮助,对不起我帮不了多忙。


11
2017-11-17 03:05



谢谢你的流程。我觉得我比上周有更好的理解。我确实有一个跟进问题。我是否必须随时创建服务器端cookie? (我正在使用基于令牌的身份验证)另外,另一个复杂的层来自我使用NoSQL数据存储(而不是标准SQL选项)的事实。这意味着我将不得不实现自定义代码。有关于这个主题的任何信息吗?您可以分享的任何链接? - Chris Turk
我不相信您将需要任何类型的cookie,因为您只需将持有者令牌作为标头发送到服务器的所有后验证请求中。我没有使用NoSQL数据存储实现类似的经验。对不起,希望我能提供更多帮助。祝你好运。 - mattherman