MVC RequireHttps并重定向,如果不是https

JK.*_*JK. 13 c# ssl requirehttps asp.net-mvc-2

我已经阅读了很多关于ASP.NET MVC的问题[RequireHttps]- 但是找不到这个问题的答案:

[RequireHttps]如果不是https开始,如何使属性将URL切换为https?

我有这个代码:

public ActionResult DoSomething()
{
    return View("AnotherAction");
}

[RequireHttps]
public ActionResult AnotherAction()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误说:"所请求的资源只能通过SSL访问."

MVC期货项目具有类似的属性[RequireSsl(Redirect = true)].但现在已经过时了...... MVC 2中的等价物是什么?

当有人类型的网址http://example.com/home/dosomething或网址http://example.com/home/anotheraction,我需要他们被自动重定向到http 小号://示例.com /家/ anotheraction

编辑这是一系列事件:

从其他网站调用URL http://example.com/home/dosomething.他们将用户重定向到此网址(使用response.redirect或类似网址).

DoSomething()然后尝试返回AnotherAction(),但失败并显示错误消息"所请求的资源只能通过SSL访问".

Jef*_*ata 22

RequiresHttps属性会自动尝试重定向到https://your-url.我在我使用该属性的网站上验证了此行为,并查看了Reflector中的代码:

protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
    if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
    {
        throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl);
    }
    string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
    filterContext.Result = new RedirectResult(url);
}
Run Code Online (Sandbox Code Playgroud)

您确定要将您的网站设置为接受安全连接吗?如果您尝试https://your-url直接浏览会发生什么?

  • 实际上,正如您上面的代码所示,它只重定向GET请求.如果POST(或HEAD等)请求进来,它将简单地抛出异常.一个重要的区别 (20认同)

Yak*_*nor 14

[mvc 4]简答:

protected void Application_BeginRequest(Object source, EventArgs e)
{
  if (!Context.Request.IsSecureConnection)
  {
      Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}
Run Code Online (Sandbox Code Playgroud)

更长的答案:
从http移动到https你不能在第一个数据包之后发送重定向到https,
因此你需要使用Application_BeginRequest捕获数据包,
从Global.asax添加函数它将覆盖默认值,
代码应该是类似的东西(类级别的Global.asax):

protected void Application_BeginRequest(Object source, EventArgs e)
{
  if (!Context.Request.IsSecureConnection && 
      !Request.Url.Host.Contains("localhost") && 
      Request.Url.AbsolutePath.Contains("SGAccount/Login"))
  {
      Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}
Run Code Online (Sandbox Code Playgroud)

我强烈建议设置一个断点并检查Request.Url对象是否有任何与网址相关的需求.
或访问msdn页面混淆request.url absoluteuri vs originalalstring?
我也是你可以去dotnetperls的例子.
此功能使您可以在localhost上进行开发并按原样部署代码.
现在,对于要进行https重定向的每个页面,您需要在if条件中指定它.
要从https移动到http,您可以使用常规的Response.Redirect,如下所示:

if (Request.Url.Scheme.Contains("https"))
{
    Response.Redirect(string.Format("http://{0}", Request.Url.Authority), true);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这也支持在本地主机上开发时使用相同的代码,而不是在https添加之前中断原始过程.

我也建议考虑实现一些返回URL约定(如果尚未实现),那么你应该这样做:

if (Request.Url.Scheme.Contains("https"))
{
    Response.Redirect(string.Format("http://{0}{1}", Request.Url.Authority, returnUrl), true);
}
Run Code Online (Sandbox Code Playgroud)

这将在登录后重定向到请求的页面.

当然,您应该保护每个显示用户数据,注册,登录等的页面.