c# - 向 ASP.NET Core 3.1 Web Api 添加安全标头
问题描述
我需要向我的新 ASP.NET Core 3.1 Web API 添加一些安全标头。在 MVC 和 webform 中,我曾经在 web.config 文件中使用以下代码:
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000"/>
<add name="X-Content-Type-Options" value="nosniff"/>
<add name="X-Xss-Protection" value="1; mode=block"/>
<add name="X-Frame-Options" value="SAMEORIGIN"/>
<add name="Content-Security-Policy" value="default-src https:; img-src * 'self' data: https:; style-src 'self' 'unsafe-inline' www.google.com platform.twitter.com cdn.syndication.twimg.com fonts.googleapis.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' www.google.com cse.google.com cdn.syndication.twimg.com platform.twitter.com platform.instagram.com www.instagram.com cdn1.developermedia.com cdn2.developermedia.com apis.google.com www.googletagservices.com adservice.google.com securepubads.g.doubleclick.net ajax.aspnetcdn.com ssl.google-analytics.com az416426.vo.msecnd.net/;"/>
<add name="Referrer-Policy" value="no-referrer-when-downgrade"/>
<add name="Feature-Policy" value="geolocation 'none';midi 'none';notifications 'none';push 'none';sync-xhr 'none';microphone 'none';camera 'none';magnetometer 'none';gyroscope 'none';speaker 'self';vibrate 'none';fullscreen 'self';payment 'none';"/>
<remove name="X-Powered-By" />
<remove name="X-AspNet-Version" />
<remove name="Server" />
</customHeaders>
</httpProtocol>
我知道我们也可以在 .NET Core 中有一个 web.config 文件,但我想通过在启动类中添加自定义代码来实现这一点。我发现很少有使用一些 NUGET 包的文章,但如果有人能给我一个清晰的图片以在 .Net Core 中添加安全标头,那就太棒了。提前致谢。
解决方案
CustomResponseHeaderMiddleware
在您的代码中创建一个像这样的中间件类:
public class CustomResponseHeaderMiddleware
{
private readonly RequestDelegate _next;
public CustomResponseHeaderMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
//To add Headers AFTER everything you need to do this
context.Response.OnStarting(state =>
{
var httpContext = (HttpContext)state;
httpContext.Response.Headers.Add("Strict-Transport-Security", "max-age=31536000");
httpContext.Response.Headers.Add("X-Content-Type-Options", "nosniff");
httpContext.Response.Headers.Add("X-Xss-Protection", "1; mode=block");
httpContext.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
//... and so on
return Task.CompletedTask;
}, context);
await _next(context);
}
}
startup.cs
并在文件中注册这个中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ....
app.UseMiddleware(typeof(CustomResponseHeaderMiddleware));
app.UseMvc();
}
推荐阅读
- c# - iOS/Xamarin 如何使用 Biometrics 允许用户登录已有用户名和密码的帐户?
- algorithm - 这个硬币找零算法的时间复杂度是多少?
- rest - Netsuite Webservices Postman 集合在哪里?
- python - 将列添加到数据框
- angular - 如何从模板中获取与Angular中数组中的属性匹配的对象计数?
- python - 编码作为值列表的分类变量
- uproot - 如何将大量数据作为惰性数组读取
- amazon-dynamodb - 已定义分区键和排序键时,DynamoDB如何通过createdAt查询
- c# - Chart.CopyPicture vs Chart.Copy C# - 复制粘贴大量excel图表到powerpoint
- amazon-web-services - Cloudfront:HTTP/2 合规性问题