我有一个需要使用SSL保护的网站。如何设置路由或IIS配置,以自动将在非SSL协议上收到的任何请求发送到SSL协议?这是可以作为路由规则处理的事情,还是最好只在主控制器中使用RequireHttps
属性而不是控制器本身并在{{1}中检测协议方法?
作为备注:我阅读了使用UrlRewriting和IIS7的应用程序请求路由的this question,但我遇到了IIS6,而UrlRewriting不适合我。
答案 0 :(得分:2)
这样的事情会有所帮助:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new RequireHttpsAttribute());
}
答案 1 :(得分:1)
这就是我们使用的。很想听听它是否可以改进。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class EnforceHttpsAttribute : RequireHttpsAttribute
{
private static bool AuthorizeCore(HttpContextBase httpContext)
{
return httpContext.Request.IsSecureConnection;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!AuthorizeCore(filterContext.HttpContext))
{
HandleNonHttpsRequest(filterContext);
}
else
{
var cache = filterContext.HttpContext.Response.Cache;
cache.SetProxyMaxAge(new TimeSpan(0L));
cache.AddValidationCallback(CacheValidateHandler, null);
}
}
// ReSharper disable RedundantAssignment
private static void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
// ReSharper restore RedundantAssignment
{
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}
private static HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
{
return !httpContext.Request.IsSecureConnection
? HttpValidationStatus.IgnoreThisRequest
: HttpValidationStatus.Valid;
}
}
对评论1的回复
好问题,我不确定。 HandleNonHttpsRequest来自基础RequireHttpsAttribute。我刚刚在fiddler2中进行了检查,并且只有1个请求通过http发送。然而,响应通过https回复。
我刚刚意识到我们使用上面的命令使RequireHttps与输出缓存一起工作。您可能最好只使用RequireHttps属性。