我更新了ASP.NET 5框架beta-8包与RC在以前工作的应用程序。在我运行下一个错误发生在启动过程中:
InvalidOperationException: No authentication handler is configured to handle the scheme: Automatic
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 });
如果有人遇到类似的问题,我会感谢您的想法或解决方案可能出错了。此异常的解释也是值得赞赏的。
Startup.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?}" ); }); } } }
解决方法
尝试设置选项.AutomaticChallenge = true;在你的cookies选项,它应该工作。
options.AutomaticAuthentication被分为options.AutomaticAuthenticate和options.AutomaticChallenge。如果最后一个值为false,则抛出异常,因为没有验证中间件处理授权过滤器应用的挑战。