我的客户端应用程序使用ACR_VALUES在身份验证重定向上传回租户名称,我可以在我的AuthorizeInteractionResponseGenerator的实现中使用它来处理与租户特定的登录/同意相关的代码。在auth回调之后,我的客户端使用UserInfo端点获取有关用户的声明,而IProfileService需要知道的一件事是租户检查某些声明。我还无法找到一种方法来向UserInfo端点和上下文指示租户。那时的主题在登录过程中不存在声明问题。我确实注意到Token端点将查看ACR_VALUES,但是当我进行这些调用时上下文.Subject基于已登录的User,因此声明存在于较早的版本中,但是该令牌中没有声明返回。
在IProfileService的实现中调用UserInfo期间是否能够确定租户,我缺少某些东西吗?
答案 0 :(得分:0)
几个小时后,在IdentityServer4中搜索适当的可扩展性选项,这就是我最终得到的结果。默认的UserInfo终结点不查看ACR值,并且我不想构建自己的终结点实现,因此在进行以下调用时,我在客户端附加了标头:
IHttpClientFactory factory = context.HttpContext.RequestServices.GetRequiredService<IHttpClientFactory>();
System.Net.Http.HttpClient client = factory.CreateClient();
client.DefaultRequestHeaders.Add("X-Tenant", tenant.ShortName);
UserInfoResponse userInfoResponse = await client.GetUserInfoAsync(new UserInfoRequest
{
Address = doc.UserInfoEndpoint,
Token = tokenResponse.AccessToken
});
要在我的IProfileService中访问此值,我注入了IHttpContextAccessor服务,并可以在GetProfileDataAsync中提取标头值:
string tenantName = _httpContextAccessor.HttpContext.Request.Headers["X-Tenant"].SingleOrDefault();
希望这对希望实施特定于租户的索赔检查的人有所帮助。