IdentityServer4定制AuthorizeInteractionResponseGenerator

时间:2018-08-06 13:15:23

标签: identityserver4

非常缺少有关在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,因此可以显示标准的“登录”和“同意”页面。发生这种情况,然后将用户正确重定向到/Organization网址以选择组织(承租人)。

那又如何呢?由于缺乏文档和示例,我真的很难找出以下两个问题:

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 个答案:

没有答案