在C# ASP.NET Core 3.0中生成Delegated Access Token
获取Microsoft Graph委托型访问令牌(Delegated Access Token)
你当前的代码使用的是客户端凭据流(Client Credentials Flow),获取的是应用权限令牌,而非委托型令牌。委托型令牌代表特定用户访问资源,需要通过用户授权流程获取,常用的是授权码流(Authorization Code Flow),以下是适配ASP.NET Core 3.0的实现方案:
1. 前置配置(Azure AD应用注册)
- 在Azure AD中注册应用,添加委托权限(而非应用权限),例如
User.Read、Mail.Read等,并授予管理员同意 - 设置重定向URI,格式如
https://localhost:xxxx/signin-oidc(xxxx为你的项目端口) - 生成并保存客户端密钥(Client Secret)
2. 项目配置
appsettings.json 添加配置
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "你的租户域名(如xxx.onmicrosoft.com)", "TenantId": "你的租户ID", "ClientId": "你的应用ID", "ClientSecret": "你的客户端密钥", "CallbackPath": "/signin-oidc" }
Startup.cs 配置认证中间件
在ConfigureServices方法中添加Azure AD认证及令牌获取服务:
using Microsoft.Identity.Web; public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); // 配置Azure AD认证 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd")) // 启用下游API令牌获取,指定需要的委托权限 .EnableTokenAcquisitionToCallDownstreamApi(new string[] { "User.Read", "Mail.Read" }) // 使用内存缓存存储令牌 .AddInMemoryTokenCaches(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // ... 其他中间件配置 app.UseAuthentication(); app.UseAuthorization(); // ... 路由配置 }
3. 在控制器中获取委托令牌
通过注入ITokenAcquisition服务获取用户的委托型令牌:
using Microsoft.Identity.Web; using Microsoft.AspNetCore.Authorization; [Authorize] // 需要用户登录才能访问 public class GraphController : Controller { private readonly ITokenAcquisition _tokenAcquisition; public GraphController(ITokenAcquisition tokenAcquisition) { _tokenAcquisition = tokenAcquisition; } public async Task<IActionResult> GetDelegatedToken() { // 指定需要的Graph权限范围 string[] scopes = new string[] { "User.Read", "Mail.Read" }; // 获取当前登录用户的委托型访问令牌 string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(scopes); // 后续可使用此令牌调用Microsoft Graph API return Ok(accessToken); } }
关键说明
- 委托权限的范围不能使用
https://graph.microsoft.com/.default,需指定具体的权限(如User.Read) - 必须确保用户已完成登录认证(通过
[Authorize]特性限制),才能获取代表该用户的委托令牌 - 如果是后台服务需使用委托令牌且无用户交互,可采用On-Behalf-Of(OBO)流,但需前端先获取用户令牌并传递给后台
内容的提问来源于stack exchange,提问作者user22226755
相关产品推荐
相关产品推荐

