设置"acr_values"不会在身份验证后返回"id_token"中的acr值



我想在身份验证质询期间向Identity Server 4发送一个acr值,并在登录后重定向回id_token时将其返回。

从我在网上读到的内容中,我得到的印象是,这是使用acr值的常用方法。

IS4不需要对这个acr值做任何特殊的处理,只需要将其返回,这样我就可以使用身份验证提供程序在网站上使用它。

通过在调用RedirectToIdentityProvider回调期间设置context.ProtocolMessage.AcrValues,我确实成功地发送了它,IS4确实得到了它,但我在id_token内部没有得到任何返回。

我需要为要包含在id_token中的acr做一些特别的事情吗?我应该手动添加吗?任何代码示例都将不胜感激。

我想说,你有一个过于乐观的印象:(
到目前为止,这对于特定IdP的实现来说是相当实验性的和可选的。根据规范:此参数将acr索赔请求为自愿索赔
Identityserver所做的是acr_values参数解析和有限处理
根据他们的文档:

允许传入其他身份验证相关信息
IdentityServer特殊情况下,以下专有acr_values:
idp:name_of_idp绕过登录/主域屏幕,将用户直接转发到所选身份提供程序(如果每个客户端配置允许(
tenant:name_of_tenne可用于传递租户名称到登录UI

您可以通过以下方式发送任意多个空格分隔的值:
&acr_values=param1:value1 param2:value2 tenant:name_of_tenant idp:name_of_idp
,然后使用以下访问器在Identity Server端执行任何自定义处理:

var ctx = _IIdentityServerInteractionService.GetAuthorizationContextAsync(returnUrl);
IEnumerable<string> acrs = ctx.AcrValues;
string tenant = ctx.Tenant;
string idp = ctx.IdP;

当您想通知客户端他们的acr_values已经被处理时,您可以像任何其他用户声明一样添加acr
调用时,首先将其添加到Identityserver中的会话中

await HttpContext.SignInAsync(identityServerUser, props);
// Where identityServerUser can take additional claims. 

之后,您的自定义索赔将在Subject
将其添加到id_token的一种方法是实现此处所述的IProfileService

public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.AddRequestedClaims(context.Subject.Claims);
if (context.Caller == "ClaimsProviderIdentityToken")
{
var acr = context.Subject.Claims.FirstOrDefault(c=>c.Type=="acr");
if(acr != null)
context.IssuedClaims.Add(acr);
}
return Task.CompletedTask;
}

另一种选择是在启动时将声明添加到GetIdentityResources()方法中的IdentityResources.OpenId作用域。openid是唯一的强制作用域,因此声明将跳转到具有默认AddRequestedClaims()实现的令牌中。

最新更新