在MVC中登录后强制HTTPS

时间:2014-06-12 14:23:55

标签: asp.net-mvc security iis ssl model-view-controller

我需要在用户登录后在一个MVC 4应用程序中强制执行ssl连接。 我在Login操作中使用了[RequireHttps]属性,但如果用户手动将协议设置为http,则用户仍然可以使用http协议进行导航。 怎么避免呢? 我不希望每次都在整个站点上强制使用SSL,而只是在登录页面上以及用户登录时。在他注销后,他应该被重定向到带有http协议的主页

1 个答案:

答案 0 :(得分:0)

阅读完评论后,您最好只通过HTTPS发送所有流量,而不是选择是否应该使用HTTPS,具体取决于是否已登录。

但如果你还想,请尝试扩展RequireHttpsAttribute

public class RequireUserHttpsAttribute : RequireHttpsAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.HttpContext.Request.IsSecureConnection && filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            HandleNonHttpsRequest(filterContext);
        }
    }
}

您可能希望将其添加为全局过滤器,以便它可以在每个请求上运行。如果用户没有登录,它也不会处理HTTP重定向,但是在条件中添加重定向回HTTP应该非常容易。

同样,您将花费更多时间来实现此功能,而不仅仅是将所有流量推送到HTTPS。


我觉得你有一个如下所示的登录控制器:

public class LoginController : Controller {
    public ActionResult Login() {
        // something here
        return View();
    }

    [RequireHttps, HttpPost]
    public ActionResult Login(FormCollection form) {
         // test login
         return RedirectToAction("/");
    }
}

请注意,原始Login操作没有RequireHttps属性。试试这个:

[RequireHttps] // put it here to make the entire controller HTTPS
public class LoginController : Controller {

    [RequireHttps] // or here
    public ActionResult Login() {
        // something here
        return View();
    }

    [RequireHttps, HttpPost]
    public ActionResult Login(FormCollection form) {
         // test login
         return RedirectToAction("/");
    }
}

但是我强烈建议您在整个应用程序中使用HTTPS。在大多数情况下,安全性的好处远远超过了非常小的性能损失。