Asp.net
沒有配置身份驗證處理程序來處理該方案:自動
我在以前工作的應用程序上用 RC 更新了 ASP.NET 5 框架 beta-8 包。在我讓它執行之後,啟動過程中發生了下一個錯誤:
InvalidOperationException:沒有配置身份驗證處理程序來處理方案:自動 Microsoft.AspNet.Http.Authentication.Internal.DefaultAuthenticationManager.d__12.MoveNext()
var defaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); services.AddMvc(setup => { setup.Filters.Add(new AuthorizeFilter(defaultPolicy)); // Error occurs here });如果有人有類似的問題,我會很感激你對可能出了什麼問題的想法或解決方案。對此異常的解釋也值得讚賞。
啟動.cs
using Autofac; using Autofac.Extensions.DependencyInjection; using Microsoft.AspNet.Authorization; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.Filters; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.PlatformAbstractions; using SuperUserMVC.Configuration; using SuperUserMVC.Extensions; using SuperUserMVC.GlobalModules; using System; namespace SuperUserMVC { public class Startup { public IConfigurationRoot Configuration { get; set; } // Entry point for the application. public static void Main(string[] args) => WebApplication.Run<Startup>(args); public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) { var builder = new ConfigurationBuilder() .SetBasePath(appEnv.ApplicationBasePath) .AddJsonFile("appsettings.json"); Configuration = builder.Build(); } public IServiceProvider ConfigureServices(IServiceCollection services) { services.Configure<AppSettingsBase>(Configuration.GetSection("AppSettingsBase")); services.Configure<ConnectionString>(Configuration.GetSection("ConnectionString")); services.AddSqlServerCache(cache => { cache.ConnectionString = Configuration.Get<string>("ASPState:ConnectionString"); cache.SchemaName = Configuration.Get<string>("ASPState:Schema"); cache.TableName = Configuration.Get<string>("ASPState:Table"); }); services.AddSession(session => { session.IdleTimeout = TimeSpan.FromMinutes(120); }); // Only allow authenticated users. var defaultPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); // Add MVC services to the services container. services.AddMvc(setup => { setup.Filters.Add(new AuthorizeFilter(defaultPolicy)); }); var builder = new ContainerBuilder(); builder.RegisterModule(new AutofacModule()); builder.Populate(services); var container = builder.Build(); return container.Resolve<IServiceProvider>(); } public void Configure(IApplicationBuilder app, IHttpContextAccessor httpContextAccessor) { // Catch unhandled exception in pipeline. bool isProductionEnvironment = Configuration.Get<bool>("environmentVariables:isProductionEnvironment"); app.UseCustomUnhandledException(isProductionEnvironment, Configuration.Get<string>("defaultErrorPagePath")); // Log requests. app.UseVisitLogger(isProductionEnvironment); // Session must be used before MVC routes. app.UseSession(); // Configure the HTTP request pipeline. app.UseCookieAuthentication(options => { options.AuthenticationScheme = "Cookies"; options.LoginPath = new PathString("/Account/Login/"); options.AccessDeniedPath = new PathString("/Account/Forbidden/"); options.CookieName = "MyCookie"; options.AutomaticAuthenticate = true; options.SessionStore = new MemoryCacheSessionStore(); }); AutoMapperInitializer.Init(); app.UseStaticFiles(); // Route configuration. app.UseMvc(routes => { routes.MapRoute( name: "AreaDefault", template: "{area:exists=Demo}/{controller=Home}/{action=Index}/{id?}" ); routes.MapRoute( name: "Default", template: "{controller=Home}/{action=Index}/{id?}" ); }); } } }
嘗試
options.AutomaticChallenge = true;在您的 cookie 選項中進行設置,它應該可以工作。
options.AutomaticAuthentication被分成options.AutomaticAuthenticate和options.AutomaticChallenge。如果最後一個留給false,則拋出異常,因為沒有身份驗證中間件處理授權過濾器應用的質詢。
希望這對其他人有幫助,因為即使我已經設置了
AutomaticChallenge = true.原來你會得到同樣的錯誤,如果你
app.UseIdentity();把app.UseMvc(routes => ...). 現在我知道了答案,這很明顯。這是因為所有這些中間件都是按照您添加它的順序發生的。這會導致“未配置身份驗證處理程序”錯誤:
public void Configure(...) { app.UseMvc(routes => { routes.MapRoute(...) }; ); app.UseIdentity(); }這不會導致錯誤:
public void Configure(...) { app.UseIdentity(); app.UseMvc(routes => { routes.MapRoute(...); }); }