首页 > 解决方案 > 使用 OIDC 资源服务器保护 API

问题描述

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

        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;
         }

一旦用户通过身份验证,当我获得所有信息时,它工作得很好:code, 。tokenid_token

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

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

干杯,

标签: asp.net-coreopenid-connect

解决方案


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

  • JWT 有效时返回 200 错误
  • 不是时返回 401 错误

您可以在 API 中使用不同的 .Net 中间件,方法是调用AddJwtBearer. 这是执行此操作的Curity 代码示例

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

API 代码

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

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

当您不熟悉使用 OAuth 保护 API 时,了解库方法的代码是什么样子会很有用,就像在我的这个类中一样,它显示了 API 应该使用的步骤:

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

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


推荐阅读