.NET Core Web App使用OpenIDConnect认证时出现invalid_scope错误
问题详情
在.NET 6 Core Web App中配置OpenIDConnect认证时,使用Okta测试正常,但切换到客户指定的第三方认证服务时出现以下异常:
OpenIdConnectProtocolException: Message contains error: 'invalid_scope', error_description: 'The requested scope is invalid, unknown, malformed, or exceeds that which the client is permitted to request.', error_uri: 'error_uri is null'.
配置代码如下:
.AddOpenIdConnect(o => { o.SignInScheme = "Cookies"; o.ClientId = config.GetSection("SsoConfig:ClientId").Value; o.ClientSecret = config.GetSection("SsoConfig:ClientSecret").Value; o.Authority = config.GetSection("SsoConfig:Authority").Value; o.SignedOutRedirectUri = config.GetSection("SsoConfig:SignedOutRedirectUri").Value; o.ResponseType = "code"; o.Scope.Add("openid"); o.Scope.Add("profile") }
错误原因排查及解决方案
第三方认证服务不支持
profilescope
不同OIDC提供商对标准scope的支持存在差异,Okta默认支持profile,但部分第三方服务可能仅支持核心的openidscope,或需额外配置才能启用profile权限。建议先移除o.Scope.Add("profile"),仅保留openid进行测试。客户端未被授予对应scope权限
即使代码中配置了profilescope,若客户的认证服务中,该ClientId对应的应用未被授予访问profile的权限,也会触发此错误。需联系客户确认客户端应用的权限配置,确保已启用所需scope。认证服务不支持该scope(可自行验证)
访问第三方认证服务的OIDC元数据端点({Authority}/.well-known/openid-configuration),查看返回结果中的scopes_supported字段,确认是否包含profile。若该字段不存在profile,说明服务本身不支持此scope,必须从配置中移除。代码语法细节问题
提供的配置代码中,o.Scope.Add("profile")末尾缺少分号,这会导致编译错误。虽然可能是粘贴时的笔误,但需确认实际代码是否存在此类语法问题,避免因此引发异常。Scope格式或拼写问题
部分认证服务对scope的大小写、格式要求严格,检查是否存在拼写错误或多余空格。也可尝试将scope统一赋值,替换两次Add为o.Scope = "openid profile",验证是否解决问题。
内容的提问来源于stack exchange,提问作者Lee

