【问题标题】:Securing API using OIDC Resoource server使用 OIDC 资源服务器保护 API
【发布时间】:2021-11-16 12:23:29
【问题描述】:

我有 2 个 .NET 解决方案:一个 webapp,一个 API。 当用户浏览 webapp 时,他需要进行身份验证,因此面临以下问题:

        return builder.AddOpenIdConnect("contonso", options =>
        {
            options.Authority = configuration["Contonso:Oidc:Authority"];
            options.ClientId = configuration["Contonso:Oidc:ClientId"];
            options.ClientSecret = configuration["Contonso:Oidc:ClientSecret"];
            options.ResponseType = OpenIdConnectResponseType.Code;
            options.ProtocolValidator.RequireState = true;
            options.UsePkce = false;
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
         }

当我得到所有信息时,这很好用:codetokenid_token 一旦用户通过身份验证。

  • 我将上面的代码复制到我的 API 中,并将 clientId/clientSecret 更改为指向我的资源服务器。
  • 我从我的 web 应用调用 API 添加授权:Bearer token(之前收到)。

但是在 API 解决方案中,我每次都会被重定向到登录页面,无论我在授权标头中传递什么。

我是否需要更改我的 API 代码中的某些内容以使令牌“传输”到资源服务器并验证收到的令牌?

干杯,

【问题讨论】:

    标签: asp.net-core openid-connect


    【解决方案1】:

    API 的行为与 Web 后端不同。 API 不应重定向客户端,而应仅验证 JWT 访问令牌:

    • 当 JWT 有效时返回 200 错误
    • 如果不是,则返回 401 错误

    通过调用AddJwtBearer,您可以在 API 中使用不同的 .Net 中间件。这是一个 Curity code example 这样做。

    主要是实现基于标准的行为,然后可以使用任何编程语言和授权服务器。

    API 代码

    API JWT 验证有两种主要方法,您使用的是第一种:

    • 使用 JWT 框架(如 ASP.Net Core)
    • 使用 JWT 库

    当您不熟悉使用 OAuth 保护 API 时,了解库方法的代码是什么样子会很有用,例如 this class of mine,它显示了 API 应该使用的步骤:

    • 从授权服务器下载令牌签名公钥
    • 将公钥提供给库,然后该库将以加密方式验证 JWT
    • 还要检查发行者、受众和算法是否符合预期

    .Net Core 会自动为您执行此操作,因此请使用 Curity 代码示例方法,因为您将编写更少的代码。

    【讨论】:

    • 我可以使用给定 ClientId/ClientSecret 的资源服务器对其进行验证吗?
    • 资源服务器/API 应该只验证 JWT,这主要通过验证签署 JWT 的公钥来完成。客户端 ID 和密码仅供客户端(例如您的 Web 应用程序)使用。 API 应该对它们一无所知。我也稍微更新了我的答案。
    【解决方案2】:

    与往常一样,RTFM 是好方法。我需要调用自省端点来验证我的令牌。也在这里解释:https://connect2id.com/products/server/docs/api/token-introspection

    然后我使用了一个 Nuget 包,它工作正常。

    无论如何感谢您的帮助和闪电加里 :)

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2016-10-08
      • 2020-07-09
      • 1970-01-01
      • 2021-10-14
      • 2018-07-26
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多