我想在身份验证质询期间向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()
实现的令牌中。