未注册Microsoft.Identity.Abstractions.IAuthorizationHeaderProvider服务排查
本地运行正常,但发布到Azure后打开网站时出现HTTP 500错误,起初怀疑是Startup类中缺少某个服务。此前使用过预发布版NuGet包,回退至旧版本后该错误消失。
Startup.cs 代码
using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.Identity.Web; using Microsoft.Identity.Web.UI; namespace AppOwnsData { using AppOwnsData.Models; using AppOwnsData.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 此方法由运行时调用,用于向容器添加服务 public void ConfigureServices(IServiceCollection services) { // 从配置文件(appsettings.json)中获取作用域 var initialScopes = Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' '); // 添加Microsoft登录支持 services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd")) // 添加获取令牌以调用受保护Web API的能力 .EnableTokenAcquisitionToCallDownstreamApi(initialScopes) // 允许控制器和页面通过依赖注入获取GraphServiceClient // 并使用内存令牌缓存 .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi")) .AddDistributedTokenCaches(); // 注册AadService、PbiEmbedService和PowerBiServiceApi以支持依赖注入 services.AddScoped(typeof(AadService)) .AddScoped(typeof(PbiEmbedService)) .AddScoped(typeof(PowerBiServiceApi)); services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); // 启用登录和登出的UI及控制器 services.AddRazorPages() .AddMicrosoftIdentityUI(); // 将appsettings.json中的配置加载到C#模型类中 services.Configure<AzureAd>(Configuration.GetSection("AzureAd")) .Configure<PowerBI>(Configuration.GetSection("PowerBI")); /*// 添加处理声明挑战的UI支持 services.AddServerSideBlazor() .AddMicrosoftIdentityConsentHandler();*/ } // 此方法由运行时调用,用于配置HTTP请求管道 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); // 默认HSTS值为30天,生产环境中可能需要调整 app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); } } }
Azure Application Insights 中的错误调用栈
System.InvalidOperationException:
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(Microsoft.Extensions.DependencyInjection.Abstractions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60)
at Microsoft.Identity.Web.GraphServiceCollectionExtensions+<>c.b__1_0(Microsoft.Identity.Web.MicrosoftGraph, Version=2.0.6.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae)
内容的提问来源于stack exchange,提问作者crissb3

