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映射,比如:
或启用全量Claim映射options.ClaimActions.MapJsonKey("user_displayname", "user_displayname");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
相关产品推荐
相关产品推荐

