Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 在一个控制器上强制https,在另一个控制器上强制http_Asp.net Core_Asp.net Core Webapi - Fatal编程技术网

Asp.net core 在一个控制器上强制https,在另一个控制器上强制http

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

我正在使用ASP.NET core 2.1, 我正在寻找一种方法,在一个控制器上强制执行https,在另一个控制器上强制执行http

下面的文档演示了如何对整个ASP.NET核心强制执行HTTPS,但不针对单个控制器


一种方法是使用两个操作过滤器:一个用于强制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
方法获取环境,并避免在开发环境中注册筛选器。见: