如何修复调用GetAccessTokenForAppAsync获取令牌时出现的NullReferenceException
问题根源
你遇到的NullReferenceException是认证服务注册方式错误导致的:当前使用的AddMicrosoftIdentityWebApiAuthentication是面向接收Bearer令牌的Web API资源服务器场景设计的,默认依赖传入的用户令牌上下文,无用户场景下调用服务级令牌获取方法时,内部缺失必要的初始化对象,因此抛出空引用。
修复步骤
- 调整Startup服务注册逻辑
将原有的WebApi认证注册替换为适用于Razor Pages的WebApp认证注册,修改后的代码如下:
public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddHttpClient(); services.AddMicrosoftIdentityWebAppAuthentication(Configuration) .EnableTokenAcquisitionToCallDownstreamApi() // 保留内存令牌缓存实现自动令牌刷新 .AddInMemoryTokenCaches(); // 如果你不需要全局登录校验,可以删除下方的授权配置 services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); // 其余原有配置保持不变 }
- 调整页面模型配置与调用逻辑
如果你的Index页面不需要用户登录即可访问,需要为PageModel添加[AllowAnonymous]属性,同时调用GetAccessTokenForAppAsync时不需要额外传入tenant参数,直接使用配置文件中预设的租户ID即可,修改后代码如下:
[AllowAnonymous] public class IndexModel : PageModel { private readonly IHttpClientFactory _clientFactory; private readonly ITokenAcquisition _tokenAcquisition; public IndexModel(IHttpClientFactory clientFactory, ITokenAcquisition tokenAcquisition) { _clientFactory = clientFactory; _tokenAcquisition = tokenAcquisition; } public async Task OnGet() { string token = await _tokenAcquisition.GetAccessTokenForAppAsync("https://graph.microsoft.com/.default"); } }
- 兼容校验与配置检查
- 由于你使用的是ASP.NET Core 3.1,需要将
Microsoft.Identity.Web包版本锁定在1.x系列(最高支持1.25.10),2.0及以上版本不再兼容.NET Core 3.1,会引发未知运行时错误。 - 确认appsettings.json(或用户机密)中的AzureAd配置项完整正确:
Instance固定为https://login.microsoftonline.com/,ClientId、TenantId、ClientSecret需要和你在Azure Portal中注册的应用信息完全一致,无拼写错误。 - 确认你注册的Azure AD应用已经授予了所需的Microsoft Graph应用级权限,且已经过租户管理员同意。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

