Asp.net

沒有配置身份驗證處理程序來處理該方案:自動

  • November 20, 2015

我在以前工作的應用程序上用 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.AutomaticAuthenticateoptions.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(...); });
   }

引用自:https://stackoverflow.com/questions/33825058