wake-up-neo.com

Für das Schema ist kein Authentifizierungshandler konfiguriert: Automatisch

Ich habe ASP.NET 5 Framework Beta-8-Pakete mit RC-Paketen auf zuvor funktionierenden Anwendungen aktualisiert. Nachdem ich es zum Laufen gebracht habe, ist ein nächster Fehler im Startprozess aufgetreten:

InvalidOperationException: Für das Schema ist kein Authentifizierungshandler konfiguriert: Automatisch 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
});

Wenn jemand ein ähnliches Problem hätte, würde ich mich über Ihre Idee oder Lösung freuen, was möglicherweise schief gelaufen ist. Die Erklärung dieser Ausnahme ist ebenfalls erwünscht.

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?}"
                );
            });
        }
    }
}
23
msmolcic

Versuchen Sie, options.AutomaticChallenge = true; in Ihren Cookies-Optionen und es sollte funktionieren.

options.AutomaticAuthentication wurde aufgeteilt in options.AutomaticAuthenticate und options.AutomaticChallenge. Wenn der letzte Wert false überlassen wird, wird eine Ausnahme ausgelöst, da keine Authentifizierungs-Middleware die vom Autorisierungsfilter angewendete Herausforderung verarbeitet.

28
Pinpoint

Hoffentlich hilft das jemand anderem, denn ich habe gerade viel Zeit damit verbracht, mich mit diesem Fehler zu befassen, obwohl ich AutomaticChallenge = true Gesetzt hatte.

Es stellt sich heraus, dass Sie den gleichen Fehler erhalten, wenn Sie app.UseIdentity(); nach app.UseMvc(routes => ...) setzen. Jetzt, wo ich die Antwort weiß, ist es offensichtlich. Dies liegt daran, dass die gesamte Middleware in der Reihenfolge abläuft, in der Sie sie hinzufügen.

Dies verursacht den Fehler "Es ist kein Authentifizierungshandler konfiguriert":

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

        app.UseIdentity();
    }

Dies verursacht den Fehler nicht:

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

        app.UseMvc(routes => { routes.MapRoute(...); });
    }
49
Robert Paulsen

Setzen Sie dies auf Configure-Methode.

        app.UseIdentity();
19
celuxcwb

Das Problem wurde für mich gelöst, indem sichergestellt wurde, dass das Cookie-Schema überall dort, wo darauf verwiesen wurde, einheitlich benannt wurde. z.B.:

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

Und bei der Interaktion mit der Authentifizierungs-Middleware. z.B.:

await HttpContext.Authentication.SignInAsync(Constants.DefaultCookieAuthenticationScheme, cp);
6
TreeAndLeaf

Wenn Sie app.UseIdentity(); und eine andere Login-Middleware wie UseFacebookAuthentication verwenden, stellen Sie sicher, dass app.UseFacebookAuthentication() AFTER app.UseIdentity(); ist.

3
iuliu.net

bei einer anderen Möglichkeit fehlt die folgende Einstellung in Konfigurieren

app.UseCookieAuthentication();
2
maxisam

Obwohl es verlockend ist, einen Großteil unserer Konfigurationseinstellungen in der Datei startup.cs Zu platzieren, besteht die bevorzugte Vorgehensweise darin, Ihre app.UseCookieAuthentication() - sans -Optionen - in der Datei startup.cs Datei, und platzieren Sie dann alle 'Optionen' und andere Details in einer separaten Datei.

In etwa so, wie wir es mit den Zeigern der Datei Global.asax Auf die Ordnerdateien App_Start In Asp.Net vBefore gemacht haben.

Ich hatte ähnliche Schmerzen, als ich versuchte, EF/Sql im startup.cs Zu konfigurieren, und indem ich alle 'Optionen' außerhalb von startup.cs Verschob, funktionierten die Dinge viel besser.

AUCH: nehmen Sie den Kommentar von Fredy Wenger zu Ihrer Frage zur Kenntnis, der auf die Umbenennung vieler Namespaces von v -8beta in v -RC1-final hinweist.

0
SRQ Coder