4

我通过在控制器操作上添加属性 [RequireSSL] 使我的登录页面启用了 Https,它工作正常。但是成功登录后它仍然在https环境中,但是该页面是非https页面。谁能给我解决方法如何从 https 跳到 http 模式?在这方面的任何帮助将不胜感激。

4

3 回答 3

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 控制器都可以从该控制器继承,因此您不必担心必须为每个需要重复的页面重复自己这个。

于 2009-10-15T05:23:09.727 回答
3

注意我有一个类似的问题。我学到的一件重要的事情是,在切换回 HTTP 后,您的身份验证 cookie 将通过纯文本发送。看到这个

注意2:不要忘记考虑可怕的您即将被重定向到不安全的连接消息

如果你正在编写一个银行应用程序,你需要非常小心——并且还要意识到公共 wifi 连接上越来越多的用户很可能 [容易] 被一些偷偷摸摸的代理所吸引。对于主流网站来说,这可能是一个更大的关注点,但我们所有人都应该意识到这一点。

另请参阅我的其他问题(在撰写本文时没有答案 - 但我只是问了!)

于 2009-11-06T05:01:41.323 回答
1

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 的一些安全问题。

于 2015-02-24T23:33:58.153 回答