在http和https上托管网站

时间:2013-06-13 14:10:34

标签: asp.net asp.net-mvc asp.net-mvc-4

我想用http和https绑定来托管我的ASP.NET MVC网站。 但是只有少数路径可以通过http获得,因为所有路径都应该通过https提供。

e.g。 我的应用程序公开了以下网址:

https://server/v1/setup
https://server/v1/exchange
https://server/v1/time

我希望通过http以及

提供时间网址
http://server/v1/time

我不想在IIS中设置任何规则。有什么办法可以通过代码中的http来控制网址吗?

我也对RequiresHttps属性感兴趣,但是它有一些重定向问题。 如果对不允许的路径发出http请求,则响应应为404(未找到)。

3 个答案:

答案 0 :(得分:3)

你可以制作一个动作过滤器来检查https。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class HttpsOnlyAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Called by the MVC framework before the action method executes.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            throw new HttpException(404, "HTTP/1.1 404 Not Found");
        }
    }
}

只需将属性放在您想要成为https的控制器之上

[HttpsOnly]
public class SecureController : Controller
{
     // your actions here
}

你甚至可以只针对行动

public class SampleController : Controller
{
    [HttpsOnly]
    public ActionResult SecureAction()
    {
        return View();
    }
}

答案 1 :(得分:1)

在这种情况下仍然可以使用RequireHttpsAttribute

使用此功能修改操作控制器会将GET请求重定向到安全版本,并为所有其他方法抛出错误。

如果从此方法扩展,则可以覆盖处理以始终返回404,或使用默认处理。

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class RequireHttpsExtendedAttribute : RequireHttpsAttribute
{
    public RequireHttpsExtendedAttribute(bool throwNotFound = false)
    {
        ThrowNotFound = throwNotFound;
    }

    private bool ThrowNotFound { get; set; }

    protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        if (ThrowNotFound)
            throw new HttpException(404, "HTTP/1.1 404 Not Found");

        base.HandleNonHttpsRequest(filterContext);
    }
}

答案 2 :(得分:0)

感谢您的回复!!我提出了使用自定义路由约束的解决方案。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Test1_default",
            "Test1/CurrentTime",
            new { action = "CurrentTime", controller = "Default1" },
            new { https = new HttpsConstraint() });
    }
}

public class HttpsConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return httpContext.Request.IsSecureConnection;
    }
}