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

.NET 8中如何替换DelegateAuthenticationProvider与TokenAcquisition

.NET 8 升级后 MS Graph 用户令牌认证替代方案

针对你遇到的DelegateAuthenticationProvider弃用、TokenAcquisition获取用户信息的问题,可以采用以下直接替代方案,基于.NET 8 官方MS Graph 集成库实现:

1. 安装依赖包

确保项目安装最新版本的以下NuGet包:

  • Microsoft.Identity.Web:处理Azure AD身份验证与令牌获取
  • Microsoft.Identity.Web.MicrosoftGraph:集成MS Graph SDK

2. 配置服务注册

在Program.cs中完成身份验证与GraphServiceClient的注册,让框架自动处理令牌上下文:

var builder = WebApplication.CreateBuilder(args);

// 注册身份验证服务,支持下游API令牌获取
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    // 配置MS Graph服务,从配置文件读取权限与地址
    .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
    // 使用内存缓存存储令牌(生产环境建议改用分布式缓存)
    .AddInMemoryTokenCaches();

// 其他服务注册...

var app = builder.Build();

// 启用身份验证中间件
app.UseAuthentication();
app.UseAuthorization();

// 其他中间件路由配置...

app.Run();

在appsettings.json中添加MS Graph配置:

"MicrosoftGraph": {
  "BaseUrl": "https://graph.microsoft.com/v1.0",
  "Scopes": "User.Read Directory.Read.All" // 替换为你需要的实际权限
}

3. 直接注入使用GraphServiceClient

在控制器或服务中直接注入GraphServiceClient,框架会自动附加当前已认证用户的Bearer令牌:

public class UserService
{
    private readonly GraphServiceClient _graphClient;

    public UserService(GraphServiceClient graphClient)
    {
        _graphClient = graphClient;
    }

    public async Task<User> GetUserByEmail(string email)
    {
        // 直接调用Graph API,无需手动处理令牌
        return await _graphClient.Users[email].GetAsync();
    }
}

4. 手动创建GraphServiceClient(兼容原代码逻辑)

如果需要保留手动获取令牌并创建客户端的逻辑,可使用TokenCredentialAuthenticationProvider替代旧的DelegateAuthenticationProvider:

public class UserService
{
    private readonly ITokenAcquisition _tokenAcquisition;
    private readonly string[] _graphScopes;

    public UserService(ITokenAcquisition tokenAcquisition, IConfiguration configuration)
    {
        _tokenAcquisition = tokenAcquisition;
        _graphScopes = configuration.GetSection("MicrosoftGraph:Scopes").Get<string[]>() 
            ?? new[] { "User.Read" };
    }

    public async Task<User> GetUserByEmail(string email)
    {
        // 获取当前已认证用户的MS Graph访问令牌
        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(_graphScopes);
        
        // 使用新的TokenCredentialAuthenticationProvider创建客户端
        var credential = new AccessTokenCredential(accessToken);
        var authProvider = new TokenCredentialAuthenticationProvider(credential);
        var graphClient = new GraphServiceClient(authProvider);

        return await graphClient.Users[email].GetAsync();
    }
}

注意事项

  • 确保当前请求上下文存在已认证用户(即请求包含有效身份验证凭据),否则ITokenAcquisition无法获取令牌
  • 在Azure AD应用注册中,需添加对应MS Graph API权限并完成管理员同意(若为应用权限)或用户同意(若为委托权限)
  • 若使用Cookie认证(而非JWT),需将认证Scheme调整为OpenIdConnectDefaults.AuthenticationScheme,并确保ITokenAcquisition能正确识别用户会话

内容的提问来源于stack exchange,提问作者Los Morales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:55:14