我通过在控制器操作上添加属性 [RequireSSL] 使我的登录页面启用了 Https,它工作正常。但是成功登录后它仍然在https环境中,但是该页面是非https页面。谁能给我解决方法如何从 https 跳到 http 模式?在这方面的任何帮助将不胜感激。
3 回答
您基本上需要做相反的事情,即具有 [DoesNotRequireSSL] 属性,它实际上与 {RequireSSL] 属性相反,即重定向到 http 协议
public class DoesNotRequireSSL: ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
if (request.IsSecureConnection && !request.IsLocal)
{
string redirectUrl = request.Url.ToString().Replace("https:", "http:");
response.Redirect(redirectUrl);
}
base.OnActionExecuting(filterContext);
}
}
此外,如果您想确保多个页面具有此行为,您可以设置一个基本控制器,所有非 http 控制器都可以从该控制器继承,因此您不必担心必须为每个需要重复的页面重复自己这个。
注意:我有一个类似的问题。我学到的一件重要的事情是,在切换回 HTTP 后,您的身份验证 cookie 将通过纯文本发送。看到这个。
注意2:不要忘记考虑可怕的您即将被重定向到不安全的连接消息
如果你正在编写一个银行应用程序,你需要非常小心——并且还要意识到公共 wifi 连接上越来越多的用户很可能 [容易] 被一些偷偷摸摸的代理所吸引。对于主流网站来说,这可能是一个更大的关注点,但我们所有人都应该意识到这一点。
另请参阅我的其他问题(在撰写本文时没有答案 - 但我只是问了!)
RequireHttpsAttribute
我知道这是一个相当老的问题,但上面提供的许多链接都已失效,这段代码通过对 System.Web.Mvc 命名空间中包含的内容进行一些轻微修改来解决 ASP.NET MVC 5 的问题:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ForbidHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext.Request.IsSecureConnection)
{
HandleHttpsRequest(filterContext);
}
}
protected virtual void HandleHttpsRequest(AuthorizationContext filterContext)
{
// only redirect for GET requests, otherwise the browser might not propagate the verb and request
// body correctly.
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException("The requested resource can only be accessed *without* SSL.");
}
// redirect to HTTP version of page
var url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
}
代码来自这篇文章,其中简要讨论了强制用户从 HTTPS 重定向到 HTTP 的一些安全问题。