我目前正在开发一个身份服务器。它是具有多个用户存储库的多租户。
我能够(使用Services.OpenIDConnect.Options)将我的租户详细信息从MVC传递到IDS,以便在登录时选择适当的用户存储库
options.Events.OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.SetParameter("Tenant", "TenantDetail");
return Task.CompletedTask;
};我正在尝试获取注销的相同信息,但是对注销的初始调用有一些调用CustomProfileService.IsActiveAsync(IsActiveContext上下文的后端进程)。
我无法从IsActiveContext获取租户信息,也无法读取任何类型的查询字符串(因为我用于登录)。
任何建议,甚至可能比我尝试的更正确的替代方法,都将不胜感激。
发布于 2020-06-20 06:14:21
OnRedirectToIdentityProvider不会在注销时被点击。相反,您需要在客户端的OnRedirectToIdentityProviderForSignOut事件中传递租户信息。
这是一个还远未完成的代码片段:
services
.AddOpenIdConnect("oidc", options =>
{
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProviderForSignOut = context =>
{
context.ProtocolMessage.AcrValues = "tenant:TenantDetail";
return Task.CompletedTask;
},
}
}在IdentityServer中,您需要在请求的查询参数中查找acr_values。注入IHttpContextAccessor以访问上下文:
public class ProfileService : IProfileService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public ProfileService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
// ...
}
public async Task IsActiveAsync(IsActiveContext context)
{
// Please note that this method is called on many occasions. Check context.Caller
// This means that you'll have to make sure that the acr_valus are present on all
// ocassions, hence the question in my comment.
var request = _httpContextAccessor.HttpContext.Request;
if (request.Method == HttpMethods.Get)
{
// acr_values should be present on all ocassions.
var values = (string)request.Query["acr_values"];
// This is just a sample, you'll need to parse the values.
var tenant = values.Split(':')[1];
}
// Your code where you link the repository ...
var sub = context.Subject.GetSubjectId();
var user = await userManager.FindByIdAsync(sub);
context.IsActive = user != null;
}
}请让我知道这是否为您解决了问题。
https://stackoverflow.com/questions/62415007
复制相似问题