我正在使用MVC 1.0并创建了一个“RequireSSLAttribute”(就像ASP.NET MVC 1.0 Futures中的一个但忽略了本地计算机的SSL指令)。我想通过SSL启用注册和登录页面来保护正在发送的密码。但是,我希望网站的其余部分不是SSL。
通过将[RequireSSL]属性添加到我的控制器的注册和登录方法,我能够成功地使应用程序通过HTTPS重定向到相应的页面。但是,注册或登录后的所有页面都将继续使用SSL。
有没有办法让应用程序切换回HTTP而不必创建我必须添加到所有其他控制器方法的“RequireNonSslAttribute”?
感谢。
答案 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会话。