基于Angular+DotNet6的Azure AD前后端认证交互方案咨询
Azure AD认证的.NET 6后端配置方案(适配Angular前端)
核心结论
你的场景是前端单页应用(Angular)已完成登录并获取Token,后端为纯API服务,因此应该选择JWT Bearer认证方式,而非OpenIdConnect(后者适用于后端需处理登录跳转的MVC/ Razor Pages应用)。
正确配置步骤
1. 后端依赖与基础配置
使用Microsoft.Identity.Web库简化Azure AD的JWT验证,无需手动编写复杂的Token校验逻辑。
appsettings.json 配置
确保包含以下Azure AD参数:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的Azure AD租户ID", "ClientId": "后端API的Azure AD应用注册ClientID", "Audience": "api://你的后端API应用注册ClientID" } }
Audience必须与前端获取Token时指定的API Scope的受众一致,否则Token会因受众不匹配被拒绝。
Program.cs 服务配置
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务 builder.Services.AddControllers(); // 配置Azure AD JWT认证 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 启用授权策略 builder.Services.AddAuthorization(); var app = builder.Build(); // 中间件顺序必须正确:先认证,后授权 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 前端Token获取与请求头设置
确保前端获取Token时指定后端API的正确Scope,示例:
const tokenRequest = { scopes: ["api://你的后端API应用注册ClientID/access_as_user"] }; this.msalService.acquireTokenSilent(tokenRequest).then(response => { // 请求后端时,在Header中添加Authorization: Bearer {accessToken} const headers = new HttpHeaders().set('Authorization', `Bearer ${response.accessToken}`); // 发起API请求 });
3. 权限响应问题排查
后端返回无权限(401/403)的常见原因:
- Token格式错误:检查请求头是否为
Bearer {token},注意Bearer后有空格。 - 受众不匹配:前端请求的Scope对应的受众(
aud声明)与后端Audience配置不一致。 - 权限未分配:在Azure AD中,需给前端应用注册分配后端API的访问权限(API权限 > 添加权限 > 选择后端API > 勾选
access_as_user等权限并授予管理员同意)。 - 中间件顺序错误:
UseAuthentication()必须在UseAuthorization()之前,且都在UseRouting()之后、UseEndpoints()之前。 - 租户ID/ClientID配置错误:确保后端配置的TenantId和ClientID与Azure AD应用注册完全一致。
关键区别说明
- OpenIdConnect方案:适用于后端需要主动引导用户登录跳转的场景(如传统MVC应用),你的前端已独立完成登录,无需使用此方案。
- JWT Bearer方案:专为API服务设计,直接验证前端传来的Bearer Token,符合前后端分离的架构模式。
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

