如何对外开放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
相关产品推荐
相关产品推荐

