非常缺少有关在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扩展。