我正在开发一个项目,该项目有一个页面需要使用SSL证书。本网站的所有链接都使用https而不是http,但是如果用户可以直接导航到页面,我希望页面的http版本重定向到自己,但使用https。
我可以在page_load事件中执行Response.Redirect。我可以编写将更新location.href的javascript,这将导致回发。我相信还有更多方法可以给这只猫上皮。
我的问题是,IIS 6或7上的ASP.NET站点将http页面重定向到https的最佳做法是什么?是否有最佳实践或所有替代方案都相同?
答案 0 :(得分:12)
我会使用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上,您必须使用第三方库。我使用IIRF(http://www.codeplex.com/IIRF)它是免费的,稳定的,并且具有很多功能。
答案 1 :(得分:2)
实际上,最佳做法是在三个位置之一执行此操作,假设硬件或IIS设置不是一个选项。只是代码选项。
所有这些都是不错的选择。保证一个和两个被ASP.NET处理的每个请求命中。第三个要求您确保所有页面都从基页继承。
我不会把代码放在每个页面中,这只是糟糕的编程。
如果您需要更多说明,请告诉我,但这是一个良好的开端。
答案 2 :(得分:1)
我会在page_load中调用Response.Redirect。它比生成javascript更简单,并且会向客户端发送更少的字节。
答案 3 :(得分:1)
通常,网站的特定部分要么始终是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
}