服务器上带有 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");
.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");