我有一个带有API部分的ASP.net核心应用程序。我想要所有访问API的Https。
然而Asp.net docs说
警告
不要在接收敏感信息的Web API上使用RequireHttpsAttribute。 RequireHttpsAttribute使用HTTP状态代码将浏览器从HTTP重定向到HTTPS。 API客户端可能无法理解或遵守从HTTP到HTTPS的重定向。此类客户端可以通过HTTP发送信息。 Web API应该:
- 不听HTTP。
- 关闭状态代码400(BadRequest)的连接,不提供请求。
题
有没有办法拒绝但不能在控制器/方法级别重定向传入的https?
既然您正在使用asp.net核心,那么让我们编写一个ActionFilterAttribute
,如果请求方案是HTTP而不是HTTPS,我们将要应用于任何我们想要返回Forbidden结果而不是Redirect的控制器或操作
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class RestrictHttpsAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.HttpContext.Request.IsHttps)
{
context.Result = new ForbidResult();
}
else
{
base.OnActionExecuting(context);
}
}
}
如何使用
这是在控制器上使用动作过滤器的方法:
[RestrictHttps]
public class ExampleController : Controller
{
// controller code goes here.
}
如需进一步阅读,请查看Filters in ASP.NET Core