【问题标题】:ASP.NET: best practice for redirecting to httpsASP.NET:重定向到 https 的最佳实践
【发布时间】:2010-12-27 10:02:17
【问题描述】:

我正在处理一个项目,该项目有一页需要使用 SSL 证书。站点中指向此页面的所有链接都使用 https 而不是 http,但如果用户可以直接导航到该页面,我希望该页面的 http 版本重定向到自身,但使用 https。

我可以在 page_load 事件中执行 Response.Redirect。我可以编写 javascript 来更新导致回发的 location.href。我敢肯定还有更多方法可以剥这只猫的皮。

我的问题是,IIS 6 或 7 上的 ASP.NET 站点将 http 页面重定向到 https 的最佳做法是什么?是否有最佳做法或所有替代方案都相同?

【问题讨论】:

标签: asp.net security iis ssl


【解决方案1】:

我会在 page_load 中调用 Response.Redirect。它比生成 javascript 更简单,并且向客户端发送的字节更少。

Code example

【讨论】:

  • Ray - 使用 CodeFile 逻辑而不是在每个请求中发送的 javascript 时发送的字节更少,这是一个很好的观点。谢谢
  • 当通过 js 重定向时,您还必须考虑没有 js 或禁用 js 的客户端,这会降低应用程序的安全性。服务器端验证更轻松、更安全。
【解决方案2】:

我会使用 URL 重写来做到这一点。为什么?因为它易于实现,无需对应用程序进行修改,并且易于维护。

在 IIS7 上,您可以使用 URL rewrite module 完成此操作,例如:

<!-- http:// to https:// rule -->
<rule name="ForceHttpsBilling" stopProcessing="true">
  <match url="(.*)billing/(.*)" ignoreCase="true" />
  <conditions>
    <add input="{HTTPS}" pattern="off" ignoreCase="false" />
  </conditions>
  <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" />
</rule>

在 IIS6 上,您必须使用 3rd 方库。我使用 IIRF (http://www.codeplex.com/IIRF),它是免费的、稳定的,并且有很多功能。

【讨论】:

  • 感谢您添加示例 Pavel。我还在 IIS6 上,所以还没有被 IIS7 的重写模块弄脏。不过看起来确实很有希望:)
【解决方案3】:

实际上,最好的做法是在三个位置之一执行此操作,假设硬件或 IIS 设置不是一个选项。只是代码选项。

  1. 在 HTTP 模块中。 HttpModules 在处理任何请求之前运行,因此您可以进行 URL 检查并在那里重定向。这就是我会做的。
  2. 在 Global.asax 中。
  3. 在自定义基本页面中,在 init 函数中。

所有这些都是不错的选择。 ASP.NET 处理的每个请求都保证命中一和二。第三个要求您确保所有页面都继承自基本页面。

我不会把代码放在每一页,那只是糟糕的编程。

如果您需要更多说明,请告诉我,但这是一个好的开始。

【讨论】:

    【解决方案4】:

    通常,您希望网站的某些特定部分始终为 HTTPS 或 HTTP。

    我使用以下操作属性将流量转换为一种或另一种:

    public class ForceConnectionSchemeAttribute : ActionFilterAttribute
    {
        private string scheme;
    
        public ForceConnectionSchemeAttribute(string scheme)
        {
            this.scheme = scheme.ToLower();
        }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Uri url = filterContext.HttpContext.Request.Url;
            if (url.Scheme != scheme)
            {
                string secureUrl = String.Format("{0}://{1}{2}", scheme, url.Host, url.PathAndQuery);
                filterContext.Result = new RedirectResult(secureUrl);
            }
        }
    }
    
    
    // Suppose I always want users to use HTTPS to access their personal info:
    [ForceConnectionScheme("https")]
    public class UserController: Controller
    {
        // blah
    }
    

    【讨论】:

    • 此方法假定您使用的是 MVC。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多