.NET 5 Blazor Server配置安全场景后启动无默认认证方案报错求助
问题修复方案
你遇到的报错信息如下:
No authenticationScheme was specified, and there was no DefaultAuthenticateScheme found
错误原因
核心问题是没有在服务容器中注册完整的认证服务,也没有配置默认认证方案,同时缺少必要的认证、授权中间件。
修复步骤
- 补全
ConfigureServices方法中的认证、授权服务注册
你之前只配置了OpenIdConnect的选项,没有真正注入AzureAD认证服务,需要添加如下代码:
// 注册AzureAD认证服务并指定默认认证方案 services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); // 注册授权服务 services.AddAuthorization();
- 调整
Configure方法的中间件顺序,在路由和端点之间添加认证、授权中间件:
app.UseRouting(); // 必须添加这两个中间件,顺序不能颠倒 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapBlazorHub().RequireAuthorization( new AuthorizeAttribute { AuthenticationSchemes = AzureADDefaults.AuthenticationScheme }); // 首页回退路由也需要加授权,避免未认证时执行GetTokenAsync报错 endpoints.MapFallbackToPage("/_Host").RequireAuthorization(); });
- 确认
appsettings.json中已经配置了正确的AzureAD参数,示例如下:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "你的租户域名", "TenantId": "你的租户ID", "ClientId": "你的应用客户端ID", "ClientSecret": "你的应用客户端密钥", "CallbackPath": "/signin-oidc" }
修改后的完整Startup.cs示例
using BlazorServerSaveToken.Data; using Microsoft.AspNetCore.Authentication.AzureAD.UI; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.IdentityModel.Protocols.OpenIdConnect; namespace BlazorServerSaveToken { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { // 新增:注册AzureAD认证服务,指定默认认证方案 services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => { options.ResponseType = OpenIdConnectResponseType.Code; options.SaveTokens = true; options.Scope.Add("offline_access"); }); // 新增:注册授权服务 services.AddAuthorization(); services.AddHttpClient(); services.AddScoped<TokenProvider>(); services.AddRazorPages(); services.AddServerSideBlazor(); services.AddSingleton<WeatherForecastService>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); } app.UseStaticFiles(); app.UseRouting(); // 新增:认证、授权中间件,顺序不可调整 app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapBlazorHub().RequireAuthorization( new AuthorizeAttribute { AuthenticationSchemes = AzureADDefaults.AuthenticationScheme }); // 调整:给首页回退路由增加授权要求 endpoints.MapFallbackToPage("/_Host").RequireAuthorization(); }); } } }
内容的提问来源于stack exchange,提问作者Ali Poustdouzan
相关产品推荐
相关产品推荐

