架构改造场景下,应使用哪种Azure AD应用注册认证流程?
解决方案说明
核心结论
你参考的SPA认证方案只完成了用户访问Web API的认证环节,本身不包含Web API调用MS Graph的配置,但可以基于这个方案扩展实现你的全部需求。
完整实现步骤
1. Azure AD应用注册配置
- 前端SPA应用注册:
- 配置SPA类型的重定向URI,指向前端登录后的回调地址
- 添加委托权限:为Web API定义的自定义范围配置用户级委托权限,用于前端获取访问Web API的令牌
- Web API应用注册:
- 暴露API并定义自定义范围,供前端请求令牌时指定
- 添加应用权限:为MS Graph配置所需的应用级权限(如
User.Read.All、Mail.Read等),需管理员完成权限同意 - 创建客户端密钥(或证书),作为Web API获取自身身份令牌的凭证
- 权限授予:由Azure AD管理员对Web API的MS Graph应用权限执行管理员同意操作
2. 前端Vue SPA配置
- 使用MSAL.js实现登录流程:
- 初始化MSAL实例,配置Azure AD租户ID、SPA应用客户端ID
- 实现登录按钮逻辑,触发跳转至Azure AD登录页面
- 登录成功后获取访问令牌,后续请求Web API时在请求头中携带
Authorization: Bearer {token}
3. ASP.NET Core Web API配置
- 认证授权配置:
- 在
Program.cs中添加Azure AD认证,验证前端传入的令牌:builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); - 启用认证和授权中间件:
app.UseAuthentication(); app.UseAuthorization();
- 在
- MS Graph调用配置:
- 添加MS Graph服务,基于应用身份认证:
builder.Services.AddMicrosoftGraph() .AddAuthenticationProvider(options => { options.ClientId = builder.Configuration["AzureAd:ClientId"]; options.ClientSecret = builder.Configuration["AzureAd:ClientSecret"]; options.TenantId = builder.Configuration["AzureAd:TenantId"]; options.Scopes = new[] { "https://graph.microsoft.com/.default" }; }); - 在控制器中注入
GraphServiceClient调用API:[Authorize] [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly GraphServiceClient _graphClient; public UsersController(GraphServiceClient graphClient) { _graphClient = graphClient; } [HttpGet] public async Task<IActionResult> GetUsers() { var users = await _graphClient.Users.Request().GetAsync(); return Ok(users); } }
- 添加MS Graph服务,基于应用身份认证:
4. 流程验证
用户访问前端登录页 → 点击登录跳转Azure AD → 登录成功返回前端并获取Web API访问令牌 → 前端携带令牌请求Web API → Web API验证令牌通过后,使用自身应用身份令牌调用MS Graph → 将Graph结果返回给前端
关键注意点
- Web API调用MS Graph使用应用权限,所有操作以应用身份执行,而非当前登录用户身份,需确保权限范围匹配业务需求
- 应用权限必须经Azure AD管理员同意后才能生效,否则无法获取有效应用令牌
- 前端令牌仅用于访问Web API,Web API调用Graph需单独获取应用身份令牌(上述配置中
AddMicrosoftGraph会自动处理令牌的获取与缓存)
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

