在ASP.NET MVC 1.0中切换HTTP和HTTPS

时间:2010-03-10 03:31:22

标签: asp.net-mvc ssl

我正在使用MVC 1.0并创建了一个“RequireSSLAttribute”(就像ASP.NET MVC 1.0 Futures中的一个但忽略了本地计算机的SSL指令)。我想通过SSL启用注册和登录页面来保护正在发送的密码。但是,我希望网站的其余部分不是SSL。

通过将[RequireSSL]属性添加到我的控制器的注册和登录方法,我能够成功地使应用程序通过HTTPS重定向到相应的页面。但是,注册或登录后的所有页面都将继续使用SSL。

有没有办法让应用程序切换回HTTP而不必创建我必须添加到所有其他控制器方法的“RequireNonSslAttribute”?

感谢。

4 个答案:

答案 0 :(得分:1)

如果您只是将其添加到登录后重定向到的控制器操作,该怎么办?或者在基本控制器中添加重定向。例如,我们在OnActionExecuting基础上执行类似的操作:

        if (req.IsSecureConnection && 
            filterContext.RouteData.Values["controller"]
                         .ToString().ToLower() != "home")
        {
            string url = req.Url.ToString().ToLower().Replace("http:", "https:");
            res.Redirect(url);
        }

这是我们完成基本相同操作的最快方式(我们的家庭控制器有登录类型的操作)。

答案 1 :(得分:1)

在ControllerBase类中,您可以覆盖Controller.OnAuthorization,然后检查Controller Action上是否设置了RequireHttps属性(在MVC2中是RequireHttpsAttribute是新的)。如果未设置RequireHttps属性并且请求在SSL下,则将重定向结果返回到非ssl URL。这样您就不必同时设置控制器属性,然后将controller.action名称放在其他位置。

protected override void OnAuthorization(AuthorizationContext filterContext)
{
    Boolean requireHttps = false;
    requireHttps = filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), false).Count() >= 1;

    //the RequireHttpsAttribute set on the Controller Action 
    //will handle redirecting to Https.
    // We just need to handle any requests 
    //that are already under SSL but should not be.

    //If this request is under ssl but yet the controller action 
    // does not require it, then redirect to the http version.
    if (Request.IsSecureConnection && !requireHttps)
    {
        UriBuilder uriBuilder = new UriBuilder(Request.Url);

        //change the scheme
        uriBuilder.Scheme = "http";
        uriBuilder.Port = 80;

        filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
    }


    base.OnAuthorization(filterContext);
}

答案 2 :(得分:1)

在用户仍然登录时从HTTPS移至HTTP会带来安全风险,因为在后续帖子中,身份验证cookie仍会从浏览器传输给用户,但这次不会加密。

一旦签名,最好(从安全角度来看)继续使用HTTPS。在任何情况下,只要TCP会话处于初始状态,就会确定抖动,因此也不会对性能产生重大影响。

答案 3 :(得分:0)

我在Controller.OnAturhotization上使用了这段代码。

var redirect = string.Format(
 "https://{0}{1}", 
 filterContext.HttpContext.Request.Url.Authority,
 Response.ApplyAppPathModifier(filterContext.HttpContext.Request.Url.AbsolutePath));
var queryString = filterContext.HttpContext.Request.QueryString.ToString();
if (!string.IsNullOrEmpty(queryString))
 redirect += "?" + queryString;

filterContext.Result = new RedirectResult(redirect);

Response.ApplyAppPathModifier支持无cookie会话。

HttpResponse.ApplyAppPathModifier Method (System.Web)