使用 OIDC 资源服务器保护 API

Securing API using OIDC Resoource server

我有 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 解决方案中,无论我在授权中传递什么,我每次都会被重定向到登录页面 header。

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

干杯,

APIs 与网络后端的行为不同。 API 不应该重定向客户端,而应该只验证 JWT 访问令牌:

  • Return JWT 有效时出现 200 错误
  • Return 不是时出现 401 错误

您通过调用 AddJwtBearer 在 API 中使用不同的 .Net 中间件。这是执行此操作的 Curity code example

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

API 代码

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

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

当您不熟悉使用 OAuth 保护 APIs 时,了解库方法的代码可能很有用,如 this class of mine 中所示,其中显示了 API 应该使用:

  • 从授权服务器下载令牌签名 public 密钥
  • 将 public 密钥提供给一个库,然后它将以加密方式验证 JWT
  • 同时检查发行人、受众和算法是否符合预期

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

一如既往,RTFM 是个好方法。我需要调用内省端点来验证我的令牌。此处也有解释:https://connect2id.com/products/server/docs/api/token-introspection

然后我使用了一个 Nuget 包来做这件事,它工作正常。

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