实施并应用全局自定义 ActionFilterAttribute,它禁止 HTTPS 请求,但应用了自定义属性的控制器/操作除外。
1. 创建一个自定义属性,该属性将应用于支持 HTTPS 请求的控制器/方法:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AllowHttpsAttribute : Attribute { }
2. 创建一个自定义 ActionFilterAttribute,当控制器或操作未应用 AllowHttpsAttribute 时,它会短路通过 HTTPS 发出的请求(短路是通过给context.Result赋值来完成的:
public class HttpOnlyActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var isHttps = context.HttpContext.Request.Scheme == Uri.UriSchemeHttps;
if (isHttps && HttpsNotSupported(context))
{
context.Result = new BadRequestResult();
}
}
private bool HttpsNotSupported(ActionContext context)
{
return context.ActionDescriptor is ControllerActionDescriptor x &&
!x.ControllerTypeInfo.GetCustomAttributes<AllowHttpsAttribute>().Any() &&
!x.MethodInfo.GetCustomAttributes<AllowHttpsAttribute>().Any();
}
}
3. 全局应用HttpOnlyActionFilter(在Program.cs中):
builder.Services.AddControllers(x => x.Filters.Add<HttpOnlyActionFilter>());
用法:
应用于行动:
public class Controller : ControllerBase
{
// Allow requests over HTTPS
[HttpGet, AllowHttps]
public ActionResult Action1() => ...;
// Disallow requests over HTTPS
[HttpGet]
public ActionResult Action2() => ...;
}
应用于控制器:
[AllowHttps] // Allow requests over HTTPS
public class Controller : ControllerBase
{
...
}