我发布这篇文章是希望收到一些反馈/建议以及关于我最近几天一直在努力解决的问题的信息。首先,我将简要介绍一下该项目。
解决方案中有 2 个应用程序:
WebAPI 资源和授权服务器 - 使用 OWIN(托管在 IIS 中)和 ASP.NET Identity 在正确登录时发出身份验证 token ,然后允许对各种 Controller 的请求。
MVC 客户端应用程序 - 目前还没有授权(直到我弄清楚),但会调用 WebAPI 资源服务器以获取所有数据。这些调用只会通过客户端应用程序中 Controller 的操作进行,而不是客户端 AJAX 调用。
客户端应用程序没有自己的数据源。所有信息都存储在 WebAPI 服务可以访问的数据库中,因此基本上,如果它们提供了正确的凭据并且客户端应用程序收到了不记名 token ,我需要提供一种方法让应用程序将它们视为已授权。
- 处理此问题的最佳方法是什么?
- 是否可以在客户端配置 OWIN 以使用 OAuth 服务器的设置?我是不是找错了树,我是否只需要使用 HTTPClients?
- 我可以反序列化不记名 token 并将其存储在 session 中,并且 然后编写我自己的授权提供商在客户端检查这些?
我最初担心的是我在滥用不记名 token 并试图将它们拼凑成一个不理想的解决方案。到目前为止,我发现的所有外部授权示例通常都涉及调用由 Google/Facebook/Twitter 托管的提供商来检查用户是否是他们所说的人,然后继续在他们的系统中创建用户记录。我的应用程序无法执行此操作。
关于安全性,我计划引入过滤器,通过提供标识符和密码以及 IP 验证来验证请求是否来自客户端应用程序。
我意识到这可能有点开放性,但我将不胜感激任何建议。该项目的范围是 Web 服务是唯一可以访问数据库的东西。 MVC 客户端应用程序将托管在不同的服务器上,该服务将只接受来自该客户端应用程序的请求。
最佳答案
您无需访问 MVC 应用中的数据源来验证不记名 token 。基本上,您可以通过以下方式完成,
MVC 应用程序从 webapi 请求
access_token
并将其传递给 UI 客户端(假设是浏览器)。浏览器将 access_token 存储在 cookie/localstorage 中,并将它们发送到 MVC 应用以用于所有后续请求。
在 MVC 应用程序中创建一个
ActionFilter
以验证来自浏览器的请求是否具有 header 中提供的 token 。如果不是,则拒绝该请求。MVC 应用将
Authorization
header 中的access_token
传递给 webapi。对所有通信使用 HTTPS(在 MVC 应用 <-> 客户端和 MVC 应用 <-> WebAPI 之间)
您可以进一步混淆或加密从 MVC 应用程序端的 WebAPI 获取的 access_token
以提高安全性,但随后您必须将解密版本发送回 WebAPI。
关于c# - 使用外部 Web API 提供的 OAuth Bearer Token 进行授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27898235/