服务器上带有 EnableDegradedMode 的 OpenIddict 和多个 API 项目的 UseIntrospection

OpenIddict with EnableDegradedMode on the server and UseIntrospection for multiple API projects

.NET 5 / OpenIddict 3.0

我想将身份验证集中在名为 AuthProject 的项目上。

如果我有多个名为 API1、API2、API3、API4 的 API 项目,我该如何验证它们AuthProject 收到的令牌?

我的 AuthProject 具有以下设置:

services.AddOpenIddict()
     .AddServer(options =>
     {
          options
               .SetTokenEndpointUris("/connect/token")
               .SetAuthorizationEndpointUris("/connect/authorize")
               .SetIntrospectionEndpointUris("/connect/introspect");

          options.RegisterScopes(Scopes.Email, Scopes.Profile, Scopes.Roles);

          options.AllowPasswordFlow()
               .AllowRefreshTokenFlow()
               .AllowClientCredentialsFlow()
               .AllowImplicitFlow();

          options.AddDevelopmentEncryptionCertificate();
          options.AddDevelopmentSigningCertificate();

          options.UseAspNetCore();
          options.EnableDegradedMode();

          options.AddEventHandler<ValidateAuthorizationRequestContext>(builder => builder.UseScopedHandler<MyValidateAuthorizationRequestContext>());

          options.AddEventHandler<ValidateTokenRequestContext>(builder => builder.UseScopedHandler<MyValidateTokenRequestContext>());

          options.AddEventHandler<HandleAuthorizationRequestContext>(builder => builder.UseScopedHandler<MyHandleAuthorizationRequestContext>());

          options.AddEventHandler<HandleTokenRequestContext>(builder => builder.UseScopedHandler<MyHandleTokenRequestContext>());

          options.AddEventHandler<ValidateIntrospectionRequestContext>(builder => builder.UseScopedHandler<MyValidateIntrospectionRequestContext>());

          options.AddEventHandler<HandleIntrospectionRequestContext>(builder => builder.UseScopedHandler<MyHandleIntrospectionRequestContext>());
     })
     .AddValidation(options =>
      {
           options.UseLocalServer();
           options.UseAspNetCore();
      });

我正常连接到 connect/token,我收到令牌,我可以正常连接到 AuthProject 中的 APIs。

所有API均由[授权]

装饰

一切正常。

当我尝试访问 API1、API2、API3、API4 中由 [Authorize] 修饰的任何 API 时(其他 API 项目),我总是收到状态 401 - 未经授权。

这些API个项目的配置是:

services.AddAuthentication(options =>
{
     options.DefaultScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme;
});

services.AddOpenIddict()
     .AddValidation(options =>
     {
          options.SetIssuer("https://authProjectUrl/");
          options.AddAudiences("api1");

          options.UseIntrospection()
               .SetClientId("api1")
               .SetClientSecret("xxxxxxxxxx");

          options.UseSystemNetHttp();
          options.UseAspNetCore();
});

在AuthProject项目中,ValidateIntrospectionRequestContext的实现是:

public class MyValidateIntrospectionRequestContext : IOpenIddictServerHandler<ValidateIntrospectionRequestContext>
    {
        public ValueTask HandleAsync(ValidateIntrospectionRequestContext context)
        {
            if (context.ClientId != "api1" || context.ClientSecret != "xxxx")
                context.Reject("Error");

            return default;
        }
    }

在 AuthProject 中,HandleIntrospectionRequestContext 的实现是:

public class MyHandleIntrospectionRequestContext : IOpenIddictServerHandler<HandleIntrospectionRequestContext>
    {
        public ValueTask HandleAsync(HandleIntrospectionRequestContext context)
        {
            return default;
        }
    }

少了什么?怎么了?

我该怎么办 API1, API2, API3, API4 项目明白如果我把token传给他们,他们必须也明白他们是授权的?

详情: 我通过 Bearer 正确传递令牌来调用 APIs,APIs 自动正确调用 MyValidateIntrospectionRequestContext 和 MyHandleIntrospectionRequestContext 处理程序。

正在调试,一切正常,没有错误。 但是 POSTMAN 的 return 始终是代码 401.

成功了。

我需要在 MyHandleIntrospectionRequestContext 中添加以下代码:

context.Audiences.Add("api1");
context.Audiences.Add("api2");
context.Audiences.Add("api3");