首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Identity Server 4多租户注销

Identity Server 4多租户注销
EN

Stack Overflow用户
提问于 2020-06-17 02:10:47
回答 1查看 238关注 0票数 0

我目前正在开发一个身份服务器。它是具有多个用户存储库的多租户。

我能够(使用Services.OpenIDConnect.Options)将我的租户详细信息从MVC传递到IDS,以便在登录时选择适当的用户存储库

代码语言:javascript
复制
options.Events.OnRedirectToIdentityProvider = context =>
{                        
    context.ProtocolMessage.SetParameter("Tenant", "TenantDetail");
    return Task.CompletedTask;
};

我正在尝试获取注销的相同信息,但是对注销的初始调用有一些调用CustomProfileService.IsActiveAsync(IsActiveContext上下文的后端进程)。

我无法从IsActiveContext获取租户信息,也无法读取任何类型的查询字符串(因为我用于登录)。

任何建议,甚至可能比我尝试的更正确的替代方法,都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-20 06:14:21

OnRedirectToIdentityProvider不会在注销时被点击。相反,您需要在客户端的OnRedirectToIdentityProviderForSignOut事件中传递租户信息。

这是一个还远未完成的代码片段:

代码语言:javascript
复制
services
    .AddOpenIdConnect("oidc", options =>
    {
        options.Events = new OpenIdConnectEvents
        {
            OnRedirectToIdentityProviderForSignOut = context =>
            {
                context.ProtocolMessage.AcrValues = "tenant:TenantDetail";
                return Task.CompletedTask;
            },
        }
    }

在IdentityServer中,您需要在请求的查询参数中查找acr_values。注入IHttpContextAccessor以访问上下文:

代码语言:javascript
复制
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;
    }
}

请让我知道这是否为您解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62415007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档