You need to enable JavaScript to run this app. Duende IdentityServer 5注销流程中如何获取EndSessionEndpoint的sid声明?
优惠活动
大模型
产品
解决方案
定价
更多

Duende IdentityServer 5注销流程中如何获取EndSessionEndpoint的sid声明?

Duende IdentityServer 5.0.4 注销场景sid配置方案

核心原因说明

  • sid是会话级别标识,不属于用户身份本身的声明,因此Duende默认不会将其注入代表当前用户的ClaimsPrincipal,自然不会出现在注销确认页默认的可用声明列表中,这是正常行为。
  • Duende会在用户登录时自动生成sid并存入IdP认证Cookie(idsrv)对应的加密身份票据的AuthenticationProperties中,同时默认会将sid加入签发的id_token声明中。

常见问题解答

能否直接从idsrv Cookie读取sid?

  • 不建议手动解析Cookie:idsrv Cookie存储的是加密的身份票据,直接读取无法获取明文sid。
  • 可通过Duende内置接口直接获取:不需要手动操作Cookie,官方封装的IIdentityServerInteractionService已经提供了当前会话sid的读取能力。

如何移除手动传sid的临时方案?

不需要客户端在重定向时手动拼接sid参数,按以下两种场景处理即可:

  1. 规范流程:使用id_token_hint
    • OpenID Connect RP发起注销的标准参数id_token_hint本身就包含sid声明(Duende默认签发的id_token会自动携带),Duende会自动从id_token_hint中解析sid,无需额外传参。
    • 该方式不影响注销确认页的展示:只要未配置强制跳过确认页,即使携带id_token_hint,也会正常返回注销确认页面供用户操作。
  2. 无id_token_hint的场景
    • 只要用户浏览器中存在IdP的有效登录Cookie(idsrv),EndSessionEndpoint会自动关联到当前登录会话,无需任何客户端传参,Duende即可自动识别当前会话的sid。

如何在注销确认页获取sid?

在注销确认页的Controller中,通过注入IIdentityServerInteractionService调用GetLogoutContextAsync即可直接拿到当前会话的sid,示例代码:

// 构造函数注入依赖
private readonly IIdentityServerInteractionService _interaction;

[HttpGet]
public async Task<IActionResult> ShowLogoutConfirmation(string logoutId)
{
    // 获取注销上下文
    var logoutContext = await _interaction.GetLogoutContextAsync(logoutId);
    // 直接读取当前会话sid,无需从请求或Cookie手动解析
    var currentSid = logoutContext.SessionId;
    
    // 传入视图使用即可
    return View(currentSid);
}

如何配置EndSessionEndpoint强制要求携带sid?

如果业务要求必须校验注销请求携带的sid(或id_token_hint),可通过自定义IEndSessionRequestValidator实现校验逻辑:

  • 实现Duende内置的IEndSessionRequestValidator接口,重写ValidateAsync方法
  • 在方法中增加判断:若请求同时缺少sid参数、id_token_hint参数,直接返回校验失败结果
  • 自定义完成后在DI容器中替换Duende默认的实现即可

内容的提问来源于stack exchange,提问作者David Montgomery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 02:06:03