You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:10:30