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

无法将Power Query认证到ASP.NET Core MVC Web应用

解决方案:Excel Power Query连接ASP.NET Core OData服务的认证问题

问题根源

你的应用当前仅配置了OpenID Connect认证方案,这是为浏览器端MVC UI设计的——未认证请求会直接重定向到Azure AD登录页。但Power Query这类API客户端需要的是基于Bearer Token的OAuth 2.0认证流程,要求服务返回带有WWW-Authenticate: Bearer头的401响应,而非跳转页面。同时OData服务未正确暴露元数据,导致Power Query无法识别服务类型。


分步解决方案

1. 为API/OData控制器添加JWT Bearer认证方案

修改Program.cs,同时支持浏览器用的OpenID Connect和API用的JWT Bearer认证:

// 先添加JWT Bearer认证(用于OData/API)
builder.Services.AddAuthentication()
    .AddJwtBearer(options =>
    {
        builder.Configuration.Bind("AzureAd", options);
        options.Authority = $"{options.Instance}{options.TenantId}";
        options.TokenValidationParameters.ValidateAudience = true;
        // 填写你的应用注册的"应用ID URI",比如api://{client-id}
        options.TokenValidationParameters.ValidAudience = builder.Configuration["AzureAd:Audience"] ?? options.ClientId;
        // 适配组声明验证
        options.TokenValidationParameters.RoleClaimType = "roles";
        options.TokenValidationParameters.NameClaimType = "name";
    })
    // 保留原OpenID Connect配置(用于MVC UI)
    .AddMicrosoftIdentityWebApp(options =>
    {
        builder.Configuration.Bind("AzureAd", options);
        options.Events = new OpenIdConnectEvents();
        options.Events.OnTokenValidated = async context =>
        {
            var overageGroupClaims = await GraphHelper.GetSignedInUsersGroups(context);
        };
    })
    .EnableTokenAcquisitionToCallDownstreamApi(options => builder.Configuration.Bind("AzureAd", options), initialScopes)
    .AddInMemoryTokenCaches();

2. 为OData控制器指定JWT Bearer认证方案

修改OData控制器,明确指定使用JWT Bearer认证而非OpenID Connect:

[ApiController]
[Route("[controller]")]
// 指定认证方案为JWT Bearer,同时应用原授权策略
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = "Users")]
public class OdataController : ControllerBase
{
    // 你的OData控制器逻辑
}

3. 配置OData服务暴露元数据

确保Power Query能识别OData服务,在Program.cs中添加OData路由和元数据配置:

builder.Services.AddControllers().AddOData(options =>
{
    // 启用OData常用查询功能
    options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(100);
    // 绑定OData路由并传入你的EDM模型
    options.AddRouteComponents("odata", GetEdmModel());
});

// 示例:创建EDM模型(替换为你的实体模型逻辑)
private static IEdmModel GetEdmModel()
{
    ODataConventionModelBuilder builder = new();
    builder.EntitySet<YourEntity>("YourEntities");
    return builder.GetEdmModel();
}

4. 配置Azure AD应用注册

  • 在Azure AD应用注册的公开API页面,设置应用ID URI(如api://{client-id}),并添加一个用户可访问的范围(如access_as_user)。
  • 在API权限页面,添加委派权限(如User.Read),并完成管理员同意(如果是租户级应用)。
  • 若使用专用Power Query客户端应用,将其Client ID添加到应用注册的授权客户端应用列表中。

5. 配置Power Query连接

  • 选择「获取数据>自OData源」,输入OData服务的完整URL(如https://your-app-domain/odata)。
  • 凭据类型选择OAuth 2.0,使用属于Azure AD Users组的账号登录,完成授权后即可正常获取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:15:50