.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
相关产品推荐
相关产品推荐

