首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC3:如何自动将非SSL请求路由到SSL协议?

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

Stack Overflow用户
提问于 2011-12-22 20:28:45
回答 2查看 406关注 0票数 1

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

注意:我读过使用UrlRewriting和IIS7的应用程序请求路由的this question,但我被IIS6卡住了,UrlRewriting不是我的选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-22 20:31:43

这就是我们使用的。如果可以改进的话,我很乐意听到。

代码语言:javascript
复制
[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做了一次检查,只有一个请求通过http发送。然而,响应通过https返回。

我刚刚意识到我们使用上面的代码来让RequireHttps与输出缓存一起工作。只使用RequireHttps属性可能会更好。

票数 1
EN

Stack Overflow用户

发布于 2012-01-14 14:01:52

像这样的东西将会有所帮助:

代码语言:javascript
复制
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new RequireHttpsAttribute());
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8603857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档