没有配置身份验证处理程序来处理方案:自动
No authentication handler is configured to handle the scheme: Automatic
我用 RC 更新了 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?}"
);
});
}
}
}
尝试在您的 cookie 选项中设置 options.AutomaticChallenge = true;
,应该可以。
options.AutomaticAuthentication
被拆分为 options.AutomaticAuthenticate
和 options.AutomaticChallenge
。如果最后一个留给 false
,则会抛出异常,因为没有身份验证中间件处理授权过滤器应用的质询。
虽然我们很想将我们的大部分配置设置放在 startup.cs
文件中,但似乎首选的做事方式是设置 app.UseCookieAuthentication()
- 无选项 - 在 startup.cs
文件,然后将所有 'options' 和其他详细信息放在一个单独的文件中。
有点像我们所做的 Global.asax
文件如何指向 Asp.Net vBefore.
中的 App_Start
文件夹文件
我在尝试在 startup.cs
中配置 EF/Sql 时遇到了类似的痛苦,并且通过将所有 'options' 移到 startup.cs
之外,事情变得更好了。
另外:请注意 Fredy Wenger 对您的问题的评论,该评论指出了从 v -8beta 到 v -RC1-final 的许多名称空间的 'renaming'。
将其放在 Configure 方法中。
app.UseIdentity();
希望这会对其他人有所帮助,因为我只是花了很多时间来处理这个错误,即使我已经设置了 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(...); });
}
另一种可能是配置中缺少以下设置
app.UseCookieAuthentication();
通过确保无论在何处引用 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);
如果您使用 app.UseIdentity();
和其他一些登录中间件,例如 UseFacebookAuthentication
,请确保 app.UseFacebookAuthentication()
在 app.UseIdentity();
.
之后
我用 RC 更新了 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?}"
);
});
}
}
}
尝试在您的 cookie 选项中设置 options.AutomaticChallenge = true;
,应该可以。
options.AutomaticAuthentication
被拆分为 options.AutomaticAuthenticate
和 options.AutomaticChallenge
。如果最后一个留给 false
,则会抛出异常,因为没有身份验证中间件处理授权过滤器应用的质询。
虽然我们很想将我们的大部分配置设置放在 startup.cs
文件中,但似乎首选的做事方式是设置 app.UseCookieAuthentication()
- 无选项 - 在 startup.cs
文件,然后将所有 'options' 和其他详细信息放在一个单独的文件中。
有点像我们所做的 Global.asax
文件如何指向 Asp.Net vBefore.
App_Start
文件夹文件
我在尝试在 startup.cs
中配置 EF/Sql 时遇到了类似的痛苦,并且通过将所有 'options' 移到 startup.cs
之外,事情变得更好了。
另外:请注意 Fredy Wenger 对您的问题的评论,该评论指出了从 v -8beta 到 v -RC1-final 的许多名称空间的 'renaming'。
将其放在 Configure 方法中。
app.UseIdentity();
希望这会对其他人有所帮助,因为我只是花了很多时间来处理这个错误,即使我已经设置了 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(...); });
}
另一种可能是配置中缺少以下设置
app.UseCookieAuthentication();
通过确保无论在何处引用 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);
如果您使用 app.UseIdentity();
和其他一些登录中间件,例如 UseFacebookAuthentication
,请确保 app.UseFacebookAuthentication()
在 app.UseIdentity();
.