我想用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(未找到)。
答案 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;
}
}