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

如何对外开放C# .NET Core Web API及Angular SPA的API端点?附调用问题

解决Client Credentials模式调用Azure AD认证API返回HTML的问题

你遇到的核心问题是API在认证失败时重定向到了登录页面(返回HTML),而非预期的401状态码或业务数据。这通常是API认证配置错误,或是Azure AD应用权限设置不到位导致的,下面一步步帮你排查解决:

1. 修正.NET Core Web API的认证中间件配置

API应该使用JWT Bearer认证,而非针对交互式应用的OpenID Connect(后者会在认证失败时触发重定向)。检查你的Program.cs(或旧版Startup.cs)配置:

var builder = WebApplication.CreateBuilder(args);

// 添加JWT Bearer认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = $"https://login.microsoftonline.com/{builder.Configuration["AzureAd:TenantId"]}/v2.0";
        options.Audience = builder.Configuration["AzureAd:ClientId"]; // 对应API应用的Client ID/Application ID URI
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true
        };
        // 自定义认证失败响应,避免默认重定向
        options.Events = new JwtBearerEvents
        {
            OnChallenge = context =>
            {
                context.HandleResponse();
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                context.Response.ContentType = "application/json";
                return context.Response.WriteAsync("{\"error\":\"Unauthorized access\"}");
            }
        };
    });

builder.Services.AddAuthorization();

var app = builder.Build();

// 中间件顺序至关重要:先认证,再授权
app.UseAuthentication();
app.UseAuthorization();

// 优先映射API控制器
app.MapControllers();

app.Run();

关键注意点:

  • 不要混用AddOpenIdConnect和AddJwtBearer,API只需要后者
  • 通过OnChallenge事件自定义认证失败响应,彻底避免重定向行为

2. 检查Azure AD应用的权限配置

针对API应用:

  • 必须暴露API范围:在Azure AD的API应用页面,进入「公开API」,添加一个范围(比如access_as_app),权限类型选择「Admin和用户」或「仅管理员」
  • 确认Application ID URI正确(通常格式为api://{ClientId})

针对客户端应用(Postman模拟的应用):

  • 进入客户端应用的「API权限」页面,点击「添加权限」→「我的API」,选中你的API应用
  • 选择应用权限(而非委托权限,因为Client Credentials是服务对服务的认证模式),勾选你创建的范围后点击「添加权限」
  • 必须点击授予管理员同意(应用权限需要管理员审批才能生效)

3. 确保Angular SPA的API端点配置正确

如果Angular SPA的API控制器托管在同一个.NET Core项目中,需注意:

  • API路由(比如/api/xxx)不要被Angular前端路由拦截,确保MapControllers优先于SPA中间件:
// 先映射API控制器
app.MapControllers();

// 再处理SPA静态资源和路由
app.UseSpa(spa =>
{
    spa.Options.SourcePath = "ClientApp";
    // 其他SPA配置...
});
  • 给API控制器添加[Authorize]属性,确保认证中间件正确应用到API路由上

4. Postman调用的正确姿势

获取令牌时,确保参数完全正确:

  • Token URL:https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token
  • Grant Type:Client Credentials
  • Client ID:你的客户端应用ID
  • Client Secret:你的客户端应用密钥
  • Scope:api://{你的API应用ID}/.default(用.default表示使用客户端已配置的所有应用权限)

调用API时,在请求头中添加:

Authorization: Bearer {获取到的令牌}

常见排查点

  • 用JWT解析工具检查令牌的aud(受众)是否和API的Audience配置一致
  • 确保API没有启用UseStatusCodePagesWithRedirects这类会触发重定向的中间件,API应直接返回状态码
  • 如果是Angular独立的后端API,同样要遵循上述.NET Core认证配置规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:38:38