Asp.net core 在一个控制器上强制https,在另一个控制器上强制http
我正在使用ASP.NET core 2.1, 我正在寻找一种方法,在一个控制器上强制执行https,在另一个控制器上强制执行http 下面的文档演示了如何对整个ASP.NET核心强制执行HTTPS,但不针对单个控制器Asp.net core 在一个控制器上强制https,在另一个控制器上强制http,asp.net-core,asp.net-core-webapi,Asp.net Core,Asp.net Core Webapi,我正在使用ASP.NET core 2.1, 我正在寻找一种方法,在一个控制器上强制执行https,在另一个控制器上强制执行http 下面的文档演示了如何对整个ASP.NET核心强制执行HTTPS,但不针对单个控制器 一种方法是使用两个操作过滤器:一个用于强制HTTPS重定向,另一个用于允许HTTP请求。第一个是全局注册的,第二个仅用于您希望允许HTTP通信的控制器/操作。例如: [AllowHttp] public class HomeController : Controller 其中al
一种方法是使用两个操作过滤器:一个用于强制HTTPS重定向,另一个用于允许HTTP请求。第一个是全局注册的,第二个仅用于您希望允许HTTP通信的控制器/操作。例如:
[AllowHttp]
public class HomeController : Controller
其中allowttp
定义为:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
// Inheriting from ActionFilterAttribute allows this to show
// up in the ActionExecutingContext.Filters collection.
// See the global filter's implementation.
public class AllowHttpAttribute : ActionFilterAttribute
{
}
接下来,全局过滤器:
// Needed for the GetEncodedUrl() extension method.
using Microsoft.AspNetCore.Http.Extensions;
public class RedirectToHttpsActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.Filters.Any(x => x is AllowHttpAttribute))
{
return;
}
if (!context.HttpContext.Request.IsHttps)
{
var insecureUri = context.HttpContext.Request.GetEncodedUrl();
var secureUri = insecureUri.Replace("http://", "https://");
// As you're likely trying this out locally, you'll need to specify
// the port to redirect to as well. You won't need this on production.
// Change the first port to your HTTP port and the second to your HTTPS port.
secureUri = secureUri.Replace(":49834", ":44329");
context.Result = new RedirectResult(secureUri);
}
}
}
最后,您必须在Startup.cs中全局注册过滤器:
services.AddMvc(options =>
{
options.Filters.Add(new RedirectToHttpsActionFilter());
});
我相信您可以通过URL重写实现同样的效果,但如果您可能更改控制器路由,这将继续工作,而无需干预。谢谢,我认为asp.net内核中有一种更直接的方法。关于“全局过滤器”,我需要在project中制作一个常规类吗?@Dror不客气,没错。为它创建一个新类ActionFilterAttribute
位于Microsoft.AspNetCore.Mvc.Filters
命名空间中。明白了,无法在本地对其进行测试,因为在IIS express上它在任何情况下都使用HTTP。我可以在本地忽略此筛选器吗?另一方面,在生产中,它似乎确实有效@Dror实际上是一个好问题,但也许最好的方法是为IIS Express启用SSL。这样,您的工作环境更能反映生产情况。如果您转到web项目的属性->调试->web服务器设置->启用SSL,应该可以完成这项工作。不过,您需要在本地包含端口重定向。@Dror实际上,我刚刚发现您可以从ConfigureServices
方法获取环境,并避免在开发环境中注册筛选器。见: