ASP.NET Core MVC集成Auth0报错:未注册身份验证处理程序
ASP.NET Core MVC登录报错:No authentication handlers are registered
错误信息
InvalidOperationException: No authentication handlers are registered. Did you forget to call AddAuthentication().AddSomeAuthHandler?
我的代码尝试
尝试1:使用Auth0 WebApp认证扩展
Startup类
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { //services.ConfigureSameSiteNoneCookies(); services.AddAuth0WebAppAuthentication(options => { options.Domain = Configuration["Auth0:Domain"]; options.ClientId = Configuration["Auth0:ClientId"]; }); services.AddControllersWithViews(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseStaticFiles(); app.UseCookiePolicy(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); }); } }
Account控制器
public class AccountController : Controller { public async Task Login(string returnUrl = "/") { var authenticationProperties = new LoginAuthenticationPropertiesBuilder() .WithRedirectUri(returnUrl) .Build(); await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, authenticationProperties); } [Authorize] public async Task Logout() { var authenticationProperties = new LogoutAuthenticationPropertiesBuilder() // Indicate here where Auth0 should redirect the user after a logout. // Note that the resulting absolute Uri must be whitelisted in .WithRedirectUri(Url.Action("Index", "Home")) .Build(); await HttpContext.SignOutAsync(Auth0Constants.AuthenticationScheme, authenticationProperties); await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); } [Authorize] public IActionResult Profile() { return View(new UserProfileViewModel() { //Name = User.Identity.Name, EmailAddress = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value, //ProfileImage = User.Claims.FirstOrDefault(c => c.Type == "picture")?.Value }); } /// <summary> /// This is just a helper action to enable you to easily see all claims related to a user. It helps when debugging your /// application to see the in claims populated from the Auth0 ID Token /// </summary> /// <returns></returns> public IActionResult Claims() { return View(); } public IActionResult AccessDenied() { return View(); } }
尝试2:手动配置OpenID Connect
Startup类(ConfigureServices和Configure)
public void ConfigureServices(IServiceCollection services) { // Add authentication services services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect("Auth0", options => { // Set the authority to your Auth0 domain options.Authority = $"https://{Configuration["Auth0:Domain"]}"; // Configure the Auth0 Client ID and Client Secret options.ClientId = Configuration["Auth0:ClientId"]; options.ClientSecret = Configuration["Auth0:ClientSecret"]; // Set response type to code options.ResponseType = OpenIdConnectResponseType.Code; // Configure the scope options.Scope.Clear(); options.Scope.Add("openid"); // Set the callback path, so Auth0 will call back to http://localhost:3000/callback // Also ensure that you have added the URL as an Allowed Callback URL in your Auth0 dashboard options.CallbackPath = new PathString("/callback"); // Configure the Claims Issuer to be Auth0 options.ClaimsIssuer = "Auth0"; // Saves tokens to the AuthenticationProperties options.SaveTokens = true; options.Events = new OpenIdConnectEvents { // handle the logout redirection OnRedirectToIdentityProviderForSignOut = (context) => { var logoutUri = $"https://{Configuration["Auth0:Domain"]}/v2/logout?client_id={Configuration["Auth0:ClientId"]}"; var postLogoutUri = context.Properties.RedirectUri; if (!string.IsNullOrEmpty(postLogoutUri)) { if (postLogoutUri.StartsWith("/")) { // transform to absolute var request = context.Request; postLogoutUri = request.Scheme + "://" + request.Host + request.PathBase + postLogoutUri; } logoutUri += $"&returnTo={Uri.EscapeDataString(postLogoutUri)}"; } context.Response.Redirect(logoutUri); context.HandleResponse(); return Task.CompletedTask; } }; }); services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // app.UseCookiePolicy(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); /*app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name:"default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
问题分析与修复方案
针对尝试1的修复
AddAuth0WebAppAuthentication扩展需要显式绑定认证方案,确保调用ChallengeAsync时能找到对应handler。修改ConfigureServices:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(options => { options.DefaultChallengeScheme = Auth0Constants.AuthenticationScheme; options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddAuth0WebAppAuthentication(options => { options.Domain = Configuration["Auth0:Domain"]; options.ClientId = Configuration["Auth0:ClientId"]; }); services.AddControllersWithViews(); }
针对尝试2的修复
- 修正默认挑战方案:控制器登录时用的是
Auth0Constants.AuthenticationScheme(对应OpenID Connect的"Auth0"方案),但Startup里把DefaultChallengeScheme设成了Cookie认证,导致找不到handler。调整配置:
services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = "Auth0"; // 改为OpenID Connect的方案名 })
- 修复语法错误:Configure方法里有未闭合的
/*注释,导致后续代码无法执行,修正后:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // app.UseCookiePolicy(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name:"default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
通用注意事项
- 确保安装对应NuGet包:Auth0扩展用
Auth0.AspNetCore.Authentication,手动配置用Microsoft.AspNetCore.Authentication.OpenIdConnect和Microsoft.AspNetCore.Authentication.Cookies。 - 验证
appsettings.json中Auth0的Domain、ClientId、ClientSecret配置正确。 - 确保Auth0控制台已添加对应的回调URL和退出URL。
内容的提问来源于stack exchange,提问作者Raz Anam
相关产品推荐
相关产品推荐

