Asp.net core Identity Server 4 OIDC授权\代码流多租户

Asp.net core Identity Server 4 OIDC授权\代码流多租户,asp.net-core,asp.net-identity,identityserver4,openid-connect,Asp.net Core,Asp.net Identity,Identityserver4,Openid Connect,我在IS4服务器上使用应用程序(Blazor服务器/WASM)验证我的用户时遇到了一个问题。 My IDSRV4与要保护的API位于同一个应用程序上,每个客户端都有自己的数据库(用于用户和业务模型) 为了选择好的数据库,我使用了一个标头,并在EF Core上设置了一个拦截器,根据标头值选择数据库 除了身份验证之外,一切都很好。我在JavaScript应用程序中使用了resource_owner_password flow(安全漏洞,我知道),它允许我为每个调用传递自定义头(使用自定义头调用/连接

我在IS4服务器上使用应用程序(Blazor服务器/WASM)验证我的用户时遇到了一个问题。 My IDSRV4与要保护的API位于同一个应用程序上,每个客户端都有自己的数据库(用于用户和业务模型)

为了选择好的数据库,我使用了一个标头,并在EF Core上设置了一个拦截器,根据标头值选择数据库

除了身份验证之外,一切都很好。我在JavaScript应用程序中使用了resource_owner_password flow(安全漏洞,我知道),它允许我为每个调用传递自定义头(使用自定义头调用/连接/令牌)

现在,使用authorization_代码流,我无法通过头来选择good tenant,这意味着good database,这会导致身份验证失败,因为令牌在用户当前注册到的另一个数据库上进行了验证

在登录过程中(在IDSRV4端发布登录信息时),我可以让承租人选择数据库,并且我在客户端设置了事件,以便在发送回代码以获得back id_令牌时添加头,但在登录/connect/authorize后我的idp重定向用户后,我失去了这样做的能力(IDSRV4端似乎没有用于添加自定义标题的扩展)

因此,我的用户登录后的数据(带有租户信息),在重定向到/connect/authorize时丢失了这些数据,我无法自定义这些数据。有机会这样做吗


不能将所有用户合并到同一数据库中。

您仍然可以从MVC应用程序宿主Identityserver向任何
HttpResponse
添加任何自定义标题

//公共void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境)
app.UseCustomHeaders();
//CustomHeadersMiddleware.cs
公共静态类CustomHeadersMiddlewareExtensions
{
公共静态IApplicationBuilder UseCustomHeader(
此IApplicationBuilder(应用程序生成器)
{
返回builder.UseMiddleware();
}
}
公共类CustomHeaders中间件
{
private readonly RequestDelegate\u next;
专用只读ILogger\u记录器;
公共CustomHeadersMiddleware(RequestDelegate下一步,
ILogger(记录器)
{
_下一个=下一个;
_记录器=记录器;
}
公共异步任务调用(HttpContext上下文)
{
var watch=新秒表();
watch.Start();
//在您需要执行的所有操作之后添加标题
context.Response.onStart(()=>
{
if(!context.Response.Headers.ContainsKey(“X-Response-Time-millides”))
context.Response.Headers.Add(“X-Response-Time-millides”,
新[]{watch.elapsedmillesons.ToString()});
返回Task.FromResult(0);
});
等待下一步(上下文);
}
}

当您使用承载令牌访问api时,我认为您的最佳选择是将租户放入声明中。否则,您的解决方案不安全:您的用户登录到任何租户,然后更改头并获取/操作任何其他租户的数据。不过,您可以在任何MVC操作(如登录)上设置任何自定义头。无标识服务一个简单的方法是从
actionfilteratAttribute
中派生
OnResultExecuting
并将该属性应用于
AccountController
更改头租户将导致401,因为令牌是针对另一个数据库生成的,并且用户/令牌不可识别。我已经遇到过这么多次了在使用Postman时,在开发过程中,忘记使用另一个标记更改租户标头。但是,我的问题不是在MVC操作中使用自定义标头,而是在/connect/Authorized之后使用此租户信息重定向到客户端。您仍然可以从MVC应用程序宿主Identityserver向任何HttpResponse添加任何自定义标头。只需添加一个中间件进入管道。我将发布一个示例。谢谢你的回答。事实上,这是我尝试的,但没有成功。根据这一点:似乎发布了一个html表单,在生成授权代码后删除了我的所有自定义头。我有类似的方法。但是,identity server为授权/回调生成自定义响应端点,它创建一个html表单,该表单在响应中写入,并在加载时将数据发布到客户端回调uri上(通过Javascript,请参阅我之前发布的链接)。我目前无法干预此操作,以便在发布到客户端回调uri时添加自定义头…(在中间件中无法读取和重写响应)试着准确地尝试它,确保它工作,然后调整到你的需要。忘了提:我把它添加到流水线上的一个非常高的位置,就在<代码> App.UpHealthCalgsSo()/<代码>和一个“最后的机会”错误处理中间件中。关于“响应不能在中间件中读取和重写”。诀窍是使用
context.Response.onstart(()={})
并在很早的阶段注册。只有在删除所有自定义代码后,标题才会生效,因为生成的响应是一个html表单,在刷新响应时会发布,因此它会丢失标题,我不会在客户端应用程序上重新获取它们(在signin oidc调用中)