验证后设置 `acr_values` 不会 return `id_token` 中的 acr 值

Setting the `acr_values` does not return acr value in `id_token` after authentication

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

根据我在网上阅读的内容,我的印象是这是使用 acr 值的常用方法。

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

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

我是否需要做一些特殊的事情才能将 acr 包含在 id_token 中?我应该以某种方式手动添加它吗?任何代码示例将不胜感激。

我会说,你的印象太乐观了:)
到目前为止,对于特定 IdP 的实施而言,这是相当实验性的和可选的。根据 spec:此参数要求 acr 索赔作为 自愿索赔
Identityserver 所做的是 acr_values 参数解析和有限处理。
根据他们的 docs:

Allows passing in additional authentication related information
IdentityServer special cases the following proprietary acr_values:
idp:name_of_idp bypasses the login/home realm screen and forwards the user directly to the selected identity provider (if allowed per client configuration)
tenant:name_of_tenant can be used to pass a tenant name to the login UI

您可以通过以下方式发送任意数量的 space 分隔值:
&acr_values=param1:value1 param2:value2 tenant:name_of_tenant idp:name_of_idp
然后在 Identityserver 端使用以下访问者:

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() 实现的令牌中。