2015-11-20 8 views
21

Ho aggiornato i pacchetti di framework beta-8 di ASP.NET 5 con quelli RC su un'applicazione precedentemente funzionante. Dopo aver ottenuto in esecuzione prossimo errore si è verificato nel processo di avvio:Nessun gestore di autenticazione è configurato per gestire lo schema: Automatico

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 
}); 

Se qualcuno aveva un problema simile, mi piacerebbe apprezzare la vostra idea o soluzione su quello che potrebbe essere andato storto. Anche la spiegazione di questa eccezione è apprezzata.

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

Ho appena iniziato a sviluppare con asp.net l'ultima beta (ho creato un nuovo progetto e poi l'ho migliorato un po ') e ho avuto anche problemi dopo l'aggiornamento a RC, perché hanno cambiato varie cose BASE. Purtroppo non ho trovato alcuna descrizione, come modificare i progetti esistenti per renderli compatibili. Quindi ... Quindi ho ricreato il mio progetto da zero da un nuovo modello, per essere completamente compatibile. Poiché RC è supportato per la produzione da parte della SM, penso che (spero) non ci saranno tali cambiamenti in futuro (versione di rilascio Q1 2016). – FredyWenger

risposta

28

provare a impostare options.AutomaticChallenge = true; nelle opzioni biscotti e dovrebbe funzionare.

options.AutomaticAuthentication è stato diviso in options.AutomaticAuthenticate e options.AutomaticChallenge. Se l'ultimo viene lasciato a false, viene generata un'eccezione perché nessun middleware di autenticazione gestisce la sfida applicata dal filtro di autorizzazione.

+0

Grazie ancora una volta, questo ha risolto il mio problema! :) – msmolcic

+4

Cosa succede se non usi i cookie? –

+1

@ AlexHopeO'Connor, l'ho impostato direttamente sulle opzioni di autenticazione di Google – SiberianGuy

0

Mentre si sta tentando di inserire gran parte delle nostre impostazioni di configurazione all'interno del file startup.cs, sembra che il modo migliore di fare le cose è quello di impostare le app.UseCookieAuthentication() - opzioni sans - all'interno del file startup.cs, e quindi inserire tutte le 'opzioni 'e altri dettagli in un file separato.

Un po 'come quello che stavamo facendo con come il file Global.asax aveva i puntatori ai file di cartella App_Start in Asp.Net vBefore.

ho sofferto dolore simile durante il tentativo di configurare EF/Sql nel startup.cs, e spostando al di fuori di tutte le cose startup.cs 'opzioni' ha funzionato molto meglio.

INOLTRE: prendi nota del commento di Fredy Wenger alla tua domanda che indica la "rinomina" di molti degli spazi dei nomi da v -8beta a v -RC1-final.

20

Mettere questo in modalità Configura.

 app.UseIdentity(); 
+0

Penso che intendiate 'Configure', non' ConfigureServices'. – Peter

+0

Ho questa linea, ma continuo a ricevere l'errore ... –

49

Speriamo che questo vi aiuterà a qualcun altro perché ho appena trascorso un sacco di tempo si occupano di questo errore anche se avevo impostato AutomaticChallenge = true.

Risulta che si otterrà lo stesso errore se si inserisce app.UseIdentity(); dopo app.UseMvc(routes => ...). Ora che conosco la risposta è ovvio. È perché tutto questo middleware avviene nell'ordine in cui lo aggiungi.

In questo modo il "Nessun gestore di autenticazione è configurato" Errore:

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

     app.UseIdentity(); 
    } 

Ciò non causa l'errore:

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

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

Grazie. Lo stesso sembra applicarsi a Uapp.UseOpenIdConnectAuthentication() e app.UseCookieAuthentication() – tjrobinson

+1

Dopo un anno ancora valido per me. Thx – Mariusz

+0

Il mio errore era questo ordine di chiamate (dato che stavo prendendo in giro l'autenticazione per i test di integrazione). Non l'avrei mai indovinato! Grazie! – Vetras

2

un'altra possibilità che manca la seguente impostazione nel Configura

app.UseCookieAuthentication(); 
6

Il problema wa Ho risolto il problema assicurandomi che lo schema dei cookie fosse costantemente denominato ovunque fosse referenziato. per esempio.:

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 
    }); 
} 

E quando si interagisce con il middleware di autenticazione. es .:

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

Dopo aver implementato la prima risposta riguardante "options.AutomaticAuthentication è stata divisa in options.AutomaticAuthenticate and options.AutomaticChallenge", ho ricevuto lo stesso errore, ma dopo aver sostituito i "cookie" maiuscoli dal campione al minuscolo (come era scritto in un altro posto), la mia app ha iniziato a funzionare! Grazie mille! –

2

Se si utilizza app.UseIdentity(); e qualche altra login middleware come UseFacebookAuthentication assicurarsi app.UseFacebookAuthentication() è dopo app.UseIdentity();.

Problemi correlati