ASP.NET Core调用Databricks API遇401:Entra Token缺user_impersonation权限
问题描述
我们的Web应用已在Entra ID中注册,采用OIDC协议进行身份认证。已在Entra的API权限中添加Databricks的user_impersonation范围,并将<databricks_app_id>/.default作为范围配置到OpenIdConnect客户端。但用户登录后,Entra返回的Access Token中不包含user_impersonation范围,使用该令牌调用Databricks API时出现HTTP 401未授权错误。
相关代码实现:
OidcClient登录代码
var options = new OidcClientOptions() { Authority = "https://login.microsoftonline.com/<tenant_id>", ClientId = "<client_id>", ClientSecret = "<client_secret>", Scope = "<databricks_id>/.default openid", Browser = new WpfEmbeddedBrowser(), RedirectUri = "https://localhost:<port_no>/callback", } options.Policy.Discovery.ValidateEndpoints = false; options.Policy.Discovery.ValidateIssuerName = false; var _oidcClient = new OidcClient(options); var loginResult = await _oidcClient.LoginAsync();
ASP.NET Core认证服务配置
services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddOpenIdConnect("oidc", options => { options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true }; options.Authority = "https://login.microsoftonline.com/<tenant_id>"; options.Scope.Add("openid"); options.Scope.Add("<databricks_id>/.default"); //options.Scope.Add("<databricks_id>/user_impersonation"); options.CallbackPath = "/callback"; options.ResponseType = "code"; options.SaveToken = true; options.ClientId = "<client_id>"; options.ClientSecret = "<client_secret>"; }
解决方案
1. 确认API权限已完成管理员同意
在Entra ID的应用注册页面,找到已添加的Databricks user_impersonation权限,确保点击过授予管理员同意按钮。仅添加权限但未完成同意操作,令牌不会包含该范围。
2. 调整范围配置逻辑
/.default范围适用于应用权限(无需用户上下文),而user_impersonation属于委托权限,需直接指定具体范围:
- OidcClient配置中修改Scope:
Scope = "<databricks_id>/user_impersonation openid" - ASP.NET Core配置中取消注释并使用具体范围:
options.Scope.Add("<databricks_id>/user_impersonation"); // 若有其他应用权限需要保留,可同时保留/.default范围
3. 验证令牌内容
用本地JWT解码工具解析返回的Access Token,检查scp字段是否包含user_impersonation。若仍不包含,排查以下点:
- 确认Databricks应用ID填写无拼写错误
- 确认Entra ID中添加的权限类型为委托权限(匹配用户登录的OIDC流程)
- 检查OIDC流程响应类型为
code时,令牌请求步骤是否正确携带了指定范围
4. 核对令牌受众匹配
确认Access Token的aud字段值与Databricks应用ID完全一致,若受众不匹配,Databricks API会直接返回401错误。
内容的提问来源于stack exchange,提问作者Hemanath
相关产品推荐
相关产品推荐

