2015-11-20 50 views
21

我更新了以前工作的應用程序的RC 5的ASP.NET 5框架beta-8包。我得到了它運行的下一個錯誤發生後,在啓動過程:沒有驗證處理程序配置爲處理該方案:自動

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?}" 
       ); 
      }); 
     } 
    } 
} 
+0

我剛剛開始用asp.net開發最後一個測試版(創建了一個新項目,然後對其進行了一些改進),並且在更新到RC之後也出現問題,因爲它們已經更改了各種BASE事物。不幸的是,我沒有找到任何描述,如何改變現有的項目兼容。所以...然後我從頭開始重新創建我的項目,以完全兼容。由於RC是由MS支持生產的,我認爲(希望如此)將來不會有這種變化(2016年第1季度發佈)。 – FredyWenger

回答

28

嘗試在你的cookie的選項來設置options.AutomaticChallenge = true;,它應該工作。

options.AutomaticAuthentication被分成options.AutomaticAuthenticateoptions.AutomaticChallenge。如果最後一個留給false,則會拋出異常,因爲沒有身份驗證中間件處理由授權篩選器應用的挑戰。

+0

再次感謝你,這解決了我的問題! :) – msmolcic

+4

如果您不使用Cookies,該怎麼辦? –

+1

@ AlexHopeO'Connor,我直接將其設置爲Google身份驗證選項 – SiberianGuy

0

雖然這是很有誘惑力的地方多的startup.cs文件中我們的配置設置,好像是做事情的首選方式是設置app.UseCookieAuthentication() - SANS選項 - 在startup.cs文件中,然後把所有的「選項'和其他細節在一個單獨的文件中。

有點像我們在做什麼,Global.asax文件如何指向Asp.Net vBefore中的App_Start文件夾文件。

startup.cs中嘗試配置EF/Sql時,我遭受了類似的痛苦,並且通過移動startup.cs之外的所有「選項」,情況變得更好。

ALSO:注意Fredy Wenger對您的問題的評論,指出了從v-8beta到v-RC1-final的許多命名空間的「重命名」。

20

把它放在Configure方法上。

 app.UseIdentity(); 
+0

我認爲你的意思是'Configure',而不是'ConfigureServices'。 – Peter

+0

我有這條線,但仍然收到錯誤... –

49

希望這將幫助別人,因爲我剛剛花了很多時間來處理,即使我已成立AutomaticChallenge = true此錯誤。

原來,如果您在app.UseMvc(routes => ...)之後放置app.UseIdentity();,您將會得到相同的錯誤。現在我知道答案很明顯。這是因爲所有這些中間件都是按照您添加的順序進行的。

這將導致「無驗證處理程序被配置」錯誤:

public void Configure(...) 
    { 
     app.UseMvc(routes => { routes.MapRoute(...) };); 

     app.UseIdentity(); 
    } 

這不會導致錯誤:

public void Configure(...) 
    { 
     app.UseIdentity(); 

     app.UseMvc(routes => { routes.MapRoute(...); }); 
    } 
+2

謝謝。這似乎適用於Uapp.UseOpenIdConnectAuthentication()和app.UseCookieAuthentication() – tjrobinson

+1

一年後仍然適用於我。 Thx – Mariusz

+0

我的錯誤是這種調用順序(因爲我正在嘲笑集成測試認證)。我永遠不會猜到它!謝謝! – Vetras

2

另一種可能性是缺少配置

以下設置
app.UseCookieAuthentication(); 
6

問題wa通過確保cookie方案在任何被引用的地方被一致地命名來解決我的問題。例如:

public void ConfigureServices(IServiceCollection services) 
{ 
    // if using IdentityServer4 
    var builder = services.AddIdentityServer(options => 
    { 
     options.AuthenticationOptions.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme; 
     ... 
    }) 

    services.AddIdentity<MyUser, IdentityRole>(options => 
    { 
     options.Cookies.ApplicationCookie.AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme; 
     ... 
    } 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationScheme = Constants.DefaultCookieAuthenticationScheme, 
     AutomaticAuthenticate = false, 
     AutomaticChallenge = true 
    }); 
} 

而且當與認證中間件進行交互時。例如: -

await HttpContext.Authentication.SignInAsync(Constants.DefaultCookieAuthenticationScheme, cp); 
+0

在實現了有關「options.AutomaticAuthentication分爲options.AutomaticAuthenticate和options.AutomaticChallenge」的第一個答案後,我仍然收到相同的錯誤,但是將大寫「Cookies」替換爲小寫(因爲它是拼寫在另一個地方),我的應用程序開始工作!非常感謝你! –

2

如果使用app.UseIdentity();和其他一些登錄中間件如UseFacebookAuthentication確保app.UseFacebookAuthentication()之後app.UseIdentity();

相關問題