IdentityServer4自定义AuthorizeInteractionResponseGenerator

遗憾的是,在IdentityServer4中实现自定义 AuthorizeInteractionResponseGenerator 的文档非常缺乏 .

我正在尝试实现自己的 AuthorizeInteractionResponseGenerator 因为我需要进一步的用户交互步骤(在身份验证之后) . 我的方案是,单个身份(电子邮件)可以与多个租户相关联 . 因此,登录后,我需要向用户显示相关租户的列表,以便他们可以选择一个 .

我已经评估了源代码,并提出了以下自定义 AuthorizeInteractionResponseGenerator

public class AccountChooserResponseGenerator : AuthorizeInteractionResponseGenerator
    {
        public AccountChooserResponseGenerator(ISystemClock clock, 
            ILogger<AuthorizeInteractionResponseGenerator> logger, 
            IConsentService consent, IProfileService profile) 
            : base(clock, logger, consent, profile)
        {
        }

        public override async Task<InteractionResponse> ProcessInteractionAsync(ValidatedAuthorizeRequest request, ConsentResponse consent = null)
        {
            var response = await base.ProcessInteractionAsync(request, consent);
            if (response.IsConsent || response.IsLogin || response.IsError)
                return response;

            return new InteractionResponse
            {
                RedirectUrl = "/Organization"
            };
        }
    }

它继承自IdentityServer4内置的基本AuthorizeInteractionResponseGenerator,以便标准的Logon和Consent页面可以显示 . 发生这种情况,然后用户被正确地重定向到 /Organization url以选择组织(租户) .

那么呢?由于缺乏文档和示例,我真的很难弄清楚以下两个问题:

1)我现在如何选择租户,向我的自定义AccountChooserResponseGenerator表明我的交互已完成,现在可以将用户重定向回客户端?

编辑:

回答1:为了表明交互完成,我必须返回一个空的新InteractionResponse() . 就我而言,检查TenantId索赔的存在是否足够,如下:

if (!request.Subject.HasClaim(c=> c.Type == "TenantId" && c.Value != "0"))
                return new InteractionResponse
                {
                    RedirectUrl = "/Organization"
                };

            return new InteractionResponse();

2)如何将有关所选租户的信息添加到IdentityServer4传回客户端的身份令牌中?

编辑:回答2:在选择租户后执行的Controller Action方法中,我调用了:

await HttpContext.SignInAsync(User.Claims.Single(r=> r.Type == "sub").Value,
                new System.Security.Claims.Claim("TenantId", tenant.Id.ToString()));

            return Redirect(ReturnUrl);

...这是IdentityServer4提供的HttpContext扩展 .

回答(0)