目前我正在使用NWebsec.AspNetCore.Middleware nuget包来实现CSP标头。当简单地创建一个新的ASP.NET Core 1.1 MVC应用程序并按照后面的方式修改启动时,仍然可以通过控制台注入脚本。我错过了什么?
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseCsp(csp =>
{
csp.DefaultSources(src => src.Self());
});
}
}
内容是将CSP安全性设置为Angular2生成的静态文件(WebPack)。但是CSP似乎没有得到应用。
答案 0 :(得分:1)
中间件从上到下运行,这意味着如果中间件提前退出,那么稍后在管道中注册的中间件将无法运行。
例如,您通常在MVC中间件之前配置静态文件中间件。这样,应用程序将首先尝试找到与当前请求匹配的静态文件并直接提供(将跳过MVC)。只有当没有文件时,它才会回退到MVC路由查找。
这最终意味着所有用于保护内容或锁定用户完成具有“真实”中间件(实际返回内容)的请求的用户必须在管道的开头注册。
在您的情况下,您需要确保在 UseCsp()
之前调用UseMvc
,以确保CSP中间件在MVC中间件之前运行。