使用外部 Web API 提供的 OAuth 持有者令牌进行授权

本文关键字:持有者 OAuth 令牌 授权 外部 Web API | 更新日期: 2023-09-27 18:37:07

我发布这篇文章是希望收到一些关于我最近几天一直在努力的事情的反馈/建议和信息。首先,我将快速细分该项目。

该解决方案中有 2 个应用程序:

  1. WebAPI 资源和授权服务器 - 使用 OWIN(托管在 IIS 中)和 ASP.NET Identity 在正确登录时颁发身份验证令牌,然后允许向各种控制器发出请求。

  2. MVC 客户端应用程序 - 尚未获得授权(直到我弄清楚),但将调用 WebAPI 资源服务器以获取所有数据。这些调用将仅从客户端应用中控制器的操作进行,不会从客户端 AJAX 调用进行。

客户端应用程序没有自己的数据源。所有信息都存储在 WebAPI 服务有权访问的数据库中,因此基本上,如果它们提供正确的凭据并且客户端应用收到持有者令牌,我需要为应用程序提供一种方法来查看它们是否已授权。

  • 处理这个问题的最佳方法是什么?
  • 是否可以在客户端配置 OWIN 以使用 OAuth服务器的设置?我是否吠错了树,我只需要使用 HTTPClients 吗?
  • 我可以反序列化持有者令牌并将其存储在会话中吗,以及然后编写我自己的授权提供程序以在客户端检查这些?

最初担心的是我滥用不记名代币并试图将它们拼凑成一个不理想的解决方案。到目前为止,我发现的所有外部授权示例通常涉及致电Google/Facebook/Twitter托管的提供商,以检查用户是否是他们所说的人,然后继续在他们的系统中创建用户记录。我的应用程序无法执行此操作。

在安全性方面,我计划引入过滤器,通过提供标识符和机密以及IP验证来验证请求是否来自客户端应用程序。

我意识到这可能有点开放,但我会感谢任何建议。该项目的范围是 Web 服务是唯一可以访问数据库的东西。MVC 客户端应用程序将托管在不同的服务器上,并且该服务将仅接受来自所述客户端应用程序的请求。

使用外部 Web API 提供的 OAuth 持有者令牌进行授权

无需

访问 MVC 应用中的数据源即可验证持有者令牌。基本上,您可以通过以下方式进行操作,

  • MVC 应用从 webapi 请求access_token,并将其传递给 UI 客户端(假设浏览器)。

  • 浏览器将access_token存储在cookie/localstorage中,并将它们发送到MVC应用程序以进行所有后续请求。

  • 在 MVC 应用中创建一个ActionFilter,以验证来自浏览器的请求是否具有标头中提供的令牌。如果没有,请拒绝请求。

  • MVC 应用将 Authorization 标头中的access_token传递给 webapi。

  • 使用 HTTPS 进行所有通信(MVC 应用程序<-> 客户端和 MVC 应用程序<-> WebAPI 之间)

您可以进一步混淆或加密从 MVC 应用程序端的 WebAPI 获得的access_token以提高安全性,但随后您必须将解密的版本发送回 WebAPI。

我意识到我的回答有点晚了,但也许它对其他人有帮助:

从 API 获取的持有者令牌具有已加密的声明列表,只有 API 才能解密。我假设您还需要在 MVC 应用程序上具有这些声明,以便您可以限制客户端上的资源。

所以,我所做的是首先获得令牌。获取它后,向 API 资源 api/me/claims 发出另一个请求,以获取客户端上的可读声明列表。根据此列表,可以使用基于自定义声明的授权属性允许访问 MVC CLient 应用程序中的资源。此外,还可以将声明存储在客户端会话的 Cookie 中。下面是用于获取声明的 API 控制器的代码。

[RoutePrefix("api/me/claims")]
public class ClaimsController : BaseApiController
{
    [Authorize]
    [Route("")]
    public IHttpActionResult GetClaims()
    {
        var identity = User.Identity as ClaimsIdentity;
        var claims = from c in identity.Claims
                     select new
                     {
                         subject = c.Subject.Name,
                         type = c.Type,
                         value = c.Value
                     };
        return Ok(claims);
    }
}

这个想法是在客户端重建登录用户的 ClaimIdentity 对象,并可能将其添加到会话中。

令牌是不够的。您可能会面临在 MVC 客户端应用程序中对用户可见的资源上的 API 收到"未授权"响应的风险。针头说,建议对所有请求使用HTTPS。