如何从被SPA调用的ASP.NET Core Web API调用Microsoft Graph API
问题背景
我有一个Angular SPA和ASP.NET Core Web API后端,已经给SPA配置了Azure应用注册,能通过@azure/msal-angular和@microsoft/microsoft-graph-client直接从SPA调用Graph API。现在想调整为:SPA调用Web API,再由Web API代表登录用户调用Graph API。核心疑问是:需要给SPA和Web API分别创建应用注册,还是只用单个应用注册配置两个平台?
已验证可用的实现方案
应用注册配置
需要为SPA和ASP.NET Core Web API分别创建独立的应用注册,配置方式如下:
- 在Web API的应用注册中,进入「公开API」->「授权的客户端应用」,添加SPA的应用注册(无需在SPA的应用注册API权限中添加Web API权限,当前配置即可生效,暂不清楚两种配置方式的区别)
Web API配置细节
appsettings.json 配置
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "ClientId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "TenantId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "ClientSecret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Scopes": "Api.Access" }
无需额外配置Graph API相关项,默认配置即可正常工作。
Program.cs 配置(依赖Microsoft.Identity.Web.MicrosoftGraph 3.5.0)
// Using Microsoft.Identity.Web.MicrosoftGraph 3.5.0 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph() .AddDistributedTokenCaches();
默认配置全部可用,无需额外修改。
控制器示例代码
[Route("api/[controller]")] [ApiController] [Authorize] public class GraphTestController : ControllerBase { public readonly GraphServiceClient _graphClient; public GraphTestController(GraphServiceClient graphClient) { _graphClient = graphClient; } [HttpGet("invite-user")] public async Task<ActionResult> InviteUser(string email, string displayName) { var invite = new Invitation() { InvitedUserDisplayName = displayName, InvitedUserEmailAddress = email, InviteRedirectUrl = "https://www.google.com", SendInvitationMessage = true }; Invitation response = await _graphClient.Invitations.PostAsync(invite); return Ok(response); } }
权限要求
要实现发送邀请的功能,需要在SPA和Web API的应用注册中都添加User.Invite.All委托权限,同时发起请求的用户需要具备足够的权限。
内容的提问来源于stack exchange,提问作者Neutrino
相关产品推荐
相关产品推荐

