在MVC3中,让每个动作都在https下运行是否有缺点?

时间:2012-01-24 20:00:03

标签: asp.net-mvc-3 https

我有一个必须安全的网站 - 家庭控制器上有[RequireHttps]属性是否有缺点?

3 个答案:

答案 0 :(得分:3)

要回答您的特定问题,如果您在HomeController上需要Https,我只能想到三个缺点。

  1. 每个请求的服务器CPU增加不大。 (如果此应用程序提供给数百万/数十亿用户,则在特定时间内这可能并不重要)

  2. 每个请求的网络活动几乎没有显着增加。 (这也适用于特定时间内的请求数量)

  3. 如果您的证书过期,用户将获得主页的负面体验。

答案 1 :(得分:1)

Descriptiom

当然,如果您的证书过期,您的用户会收到警告。

但是如果你想将Https属性添加到整个网站,有两种方法可以做到。

  1. 使用Application_BeginRequest方法重定向。
  2. 使用Conditional Filters。您可以将[Https] attibute添加到每个Action方法,特定Controller或任何其他条件
  3. 样品

    1. Application_BeginRequest方法中重定向。

      protected void Application_BeginRequest(Object sender, EventArgs e)
      {
          if ( !Request.IsSecureConnection)
          {
               string path = string.Format("https{0}", Request.Url.AbsoluteUri.Substring(4));
               Response.Redirect(path);
          }
       }
      
    2. 使用Conditional Filters

      • 将此课程添加到您的项目中

        public class ConditionalFilterProvider : IFilterProvider
        {
            private readonly
                IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;
        
            public ConditionalFilterProvider(
                IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
            {
        
                _conditions = conditions;
            }
        
            public IEnumerable<Filter> GetFilters(
                ControllerContext controllerContext,
                ActionDescriptor actionDescriptor)
            {
                return from condition in _conditions
                        select condition(controllerContext, actionDescriptor) into filter
                        where filter != null
                        select new Filter(filter, FilterScope.Global, null);
            }
        }
        
      • 更改global.asax RegisterGlobalFilters方法,将[Https]属性添加到每个ActionMethod

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
                new Func<ControllerContext, ActionDescriptor, object>[] { 
                (c, a) => new RequireHttpsAttribute()
            };
        
            var provider = new ConditionalFilterProvider(conditions);
            FilterProviders.Providers.Add(provider);
        
            filters.Add(new HandleErrorAttribute());
        }
        
    3. 更多信息

答案 2 :(得分:1)

是的,有一个缺点。

一些原因是: 页面无法缓存在共享缓存中, 必须在浏览器和服务器两侧进行加密和描述, 必须在服务器端使用受信任的证书,以避免连接不安全(证书不便宜)。

但是必须支付性能成本(性能成本非常低)才能拥有安全站点,因此如果需要使用HTTPS,并且对于某些重要的数据交换,请删除HTTP并在您的网站上仅启用HTTPS绑定。