ASP.NET Core 2.1中如何获取Azure AD令牌访问O365 Graph API资源?
获取Graph API访问令牌的新方法(ASP.NET Core 2.1+)
这个问题我之前也碰到过!ASP.NET Core 2.1推出的AddAzureAd确实简化了Azure AD身份验证的配置,但也把之前手动处理的授权码逻辑给封装起来了。不过不用慌,现在有更简洁的方式来获取Graph API所需的访问令牌,具体步骤如下:
1. 安装必要的NuGet包
首先确保你的项目安装了这些依赖:
Microsoft.AspNetCore.Authentication.AzureAD.UI:提供AddAzureAd配置能力Microsoft.Identity.Client:处理令牌的获取、缓存与刷新Microsoft.Graph:Graph API官方客户端库
可以通过NuGet包管理器或命令行安装:
Install-Package Microsoft.AspNetCore.Authentication.AzureAD.UI Install-Package Microsoft.Identity.Client Install-Package Microsoft.Graph
2. 配置AppSettings.json
在配置文件中补充Azure AD信息和Graph API的权限范围:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "你的O365域名.onmicrosoft.com", "TenantId": "你的租户ID", "ClientId": "你的应用客户端ID", "ClientSecret": "你的应用客户端密钥", "CallbackPath": "/signin-oidc" }, "GraphApi": { "Scopes": "Calendars.Read" }
3. 配置Startup.cs
在ConfigureServices方法中,除了配置Azure AD身份验证,还要注册令牌获取服务和Graph客户端:
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); // 配置Azure AD身份验证 services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); // 注册令牌获取服务,自动处理令牌生命周期 services.AddTokenAcquisition(); // 注入Graph API客户端,关联令牌获取逻辑 services.AddScoped<IGraphServiceClient>(sp => { var tokenAcquisition = sp.GetRequiredService<ITokenAcquisition>(); var graphScopes = Configuration.GetSection("GraphApi:Scopes").Get<string[]>(); return new GraphServiceClient(new DelegateAuthenticationProvider(async request => { // 获取当前用户的Graph API访问令牌 var accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(graphScopes); // 将令牌添加到请求头 request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); })); }); }
4. 在Razor Page中调用Graph API
现在你可以直接在PageModel里注入IGraphServiceClient,轻松调用Graph API获取资源(比如你的日历):
public class CalendarModel : PageModel { private readonly IGraphServiceClient _graphClient; public CalendarModel(IGraphServiceClient graphClient) { _graphClient = graphClient; } public List<Event> UpcomingEvents { get; set; } public async Task OnGetAsync() { // 获取当前用户的近期日历事件 var eventsResult = await _graphClient.Me.Events .Request() .Select(e => new { e.Subject, e.Start, e.End }) .Top(10) .GetAsync(); UpcomingEvents = eventsResult.CurrentPage.ToList(); } }
关键注意点
- 权限配置:一定要在Azure门户中给你的应用添加对应的Graph API权限(比如
Calendars.Read),如果是租户级权限,还需要管理员授予同意。 - 令牌自动管理:
ITokenAcquisition服务已经封装了令牌的缓存和刷新逻辑,不用再手动处理授权码交换和令牌存储,省心很多。 - 版本升级建议:如果后续升级到ASP.NET Core 3.1及以上版本,更推荐使用
Microsoft.Identity.Web包,它提供了AddMicrosoftIdentityWebApp和AddMicrosoftGraph等更简洁的API,能一步完成身份验证和Graph集成。
内容的提问来源于stack exchange,提问作者Paul Nearney
相关产品推荐
相关产品推荐

