Обработчик аутентификации не настроен для обработки схемы: Автоматически
Я обновил пакеты бета-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?}"
);
});
}
}
}
Ответы
Ответ 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.