我有一个必须安全的网站 - 家庭控制器上有[RequireHttps]属性是否有缺点?
答案 0 :(得分:3)
要回答您的特定问题,如果您在HomeController上需要Https,我只能想到三个缺点。
每个请求的服务器CPU增加不大。 (如果此应用程序提供给数百万/数十亿用户,则在特定时间内这可能并不重要)
每个请求的网络活动几乎没有显着增加。 (这也适用于特定时间内的请求数量)
如果您的证书过期,用户将获得主页的负面体验。
答案 1 :(得分:1)
但是如果你想将Https属性添加到整个网站,有两种方法可以做到。
Application_BeginRequest
方法重定向。Conditional Filters
。您可以将[Https]
attibute添加到每个Action方法,特定Controller或任何其他条件在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);
}
}
使用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());
}
答案 2 :(得分:1)
是的,有一个缺点。
一些原因是: 页面无法缓存在共享缓存中, 必须在浏览器和服务器两侧进行加密和描述, 必须在服务器端使用受信任的证书,以避免连接不安全(证书不便宜)。
但是必须支付性能成本(性能成本非常低)才能拥有安全站点,因此如果需要使用HTTPS,并且对于某些重要的数据交换,请删除HTTP并在您的网站上仅启用HTTPS绑定。