Подтвердить что ты не робот

Обработчик аутентификации не настроен для обработки схемы: Автоматически

Я обновил пакеты бета-8 с платформой ASP.NET 5 с RC на ранее работающем приложении. После того, как я его запускал, в процессе запуска произошла следующая ошибка:

InvalidOperationException: никакой обработчик проверки подлинности не настроен для обработки схемы: 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?}"
                );
            });
        }
    }
}
4b9b3361

Ответ 1

Попробуйте установить options.AutomaticChallenge = true; в своих файлах cookie, и он должен работать.

options.AutomaticAuthentication был разделен на options.AutomaticAuthenticate и options.AutomaticChallenge. Если последнее осталось в false, генерируется исключение, поскольку промежуточное программное обеспечение для проверки подлинности не обрабатывает проблему, применяемую фильтром авторизации.

Ответ 2

Надеюсь, это поможет кому-то другому, потому что я просто потратил много времени на эту ошибку, хотя я установил 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(...); });
    }

Ответ 3

Поместите это на метод Configure.

        app.UseIdentity();

Ответ 4

Проблема была решена для меня, убедившись, что схема файлов 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);

Ответ 5

другая возможность отсутствует в настройке

app.UseCookieAuthentication();

Ответ 6

Если вы используете app.UseIdentity(); и какое-то другое промежуточное ПО для входа, например UseFacebookAuthentication, убедитесь, что app.UseFacebookAuthentication() ПОСЛЕ app.UseIdentity();.

Ответ 7

В то время как возникает соблазн разместить большую часть наших настроек конфигурации в файле startup.cs, кажется, что предпочтительный способ сделать это - установить параметры app.UseCookieAuthentication() - sans - в файле startup.cs, а затем поместить все "параметры" и другие детали в отдельном файле.

Как и то, что мы делали с тем, как файл Global.asax имел указатели на файлы папок App_Start в Asp.Net vBefore.

Я испытывал подобную боль при попытке настроить EF/Sql в startup.cs, и, перемещая все "параметры" за пределами startup.cs, все работало намного лучше.

ТАКЖЕ: обратите внимание на комментарий Фреди Венгера к вашему вопросу, который указывает на "переименование" многих пространств имен от v -8beta до v -RC1-final.