MVC3:如何将非SSL请求自动路由到SSL协议?

时间:2011-12-22 12:28:45

标签: asp.net-mvc-3 ssl routing

我有一个需要使用SSL保护的网站。如何设置路由或IIS配置,以自动将在非SSL协议上收到的任何请求发送到SSL协议?这是可以作为路由规则处理的事情,还是最好只在主控制器中使用RequireHttps属性而不是控制器本身并在{{1}中检测协议方法?

作为备注:我阅读了使用UrlRewriting和IIS7的应用程序请求路由的this question,但我遇到了IIS6,而UrlRewriting不适合我。

2 个答案:

答案 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属性。