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