You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Umbraco对接Duende Server OpenID Connect遇InvalidOperationException求助

解决思路

1. 排查Duende Server的Claim配置与用户数据

  • 确认Duende的IdentityResource中已包含显示名称相关的Claim(比如标准name或自定义user_displayname),且客户端的AllowedScopes包含对应Scope(如openid、profile或自定义Scope)。
  • 检查Duende用户存储中,目标用户是否存在有效的user_displayname(或标准name)Claim值,避免用户数据本身缺失该字段。

2. 修正Umbraco端的OIDC Claim映射与配置

  • 核对代码中查找的Claim类型:如果Duende返回的是标准name类型,需将代码中x.Type == "user_displayname"改为x.Type == ClaimTypes.Name或x.Type == "name";若使用自定义Claim,需在Duende和Umbraco两端保持类型一致。
  • 在Umbraco的OIDC配置(AddOpenIdConnect)中,添加明确的Claim映射,比如:
    options.ClaimActions.MapJsonKey("user_displayname", "user_displayname");
    
    或启用全量Claim映射options.ClaimActions.MapAll(),避免默认过滤掉所需Claim。
  • 确保配置中设置SaveTokens = true,保证外部登录信息能被正确保存和读取。

3. 修复UmbExternalLoginController中loginInfo为null的问题

  • 确认在OIDC回调流程中,已正确调用SignInManager.GetExternalLoginInfoAsync(),且该方法执行前已完成外部身份验证的回调处理(比如中间件顺序正确,未跳过关键步骤)。
  • 检查Umbraco的外部登录路由配置,确保回调路径与Duende端配置的RedirectUris一致,避免因路径不匹配导致登录信息丢失。

4. 处理"Name value cannot be null"错误

  • 在UmbracoBuilderExtensions.cs中添加兜底逻辑:当获取的name为null时,用用户的其他有效Claim(如sub用户ID、email)作为默认名称,示例代码:
    var name = claims?.SingleOrDefault(x => x.Type == "user_displayname")?.Value 
               ?? claims?.SingleOrDefault(x => x.Type == ClaimTypes.Email)?.Value 
               ?? claims?.SingleOrDefault(x => x.Type == "sub")?.Value;
    
  • 确保创建Umbraco用户时,Name参数不为null,避免触发该异常。

5. 调试验证

  • 在Duende端开启详细日志,查看返回给Umbraco的Claim列表,确认目标Claim是否被正确返回。
  • 在Umbraco端的中间件或回调代码中,打印所有获取到的Claim集合,对比实际收到的Claim类型与代码预期是否一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:38:20