我需要在用户登录后在一个MVC 4应用程序中强制执行ssl连接。 我在Login操作中使用了[RequireHttps]属性,但如果用户手动将协议设置为http,则用户仍然可以使用http协议进行导航。 怎么避免呢? 我不希望每次都在整个站点上强制使用SSL,而只是在登录页面上以及用户登录时。在他注销后,他应该被重定向到带有http协议的主页
答案 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。在大多数情况下,安全性的好处远远超过了非常小的性能损失。