我有一个网站,需要与SSL的安全。如何设置路由或IIS配置,以便将在非SSL协议上收到的任何请求自动发送到SSL协议?这是可以作为路由规则处理的东西,还是最好只在方法上使用主控制器中的RequireHttps属性,而不是在控制器本身上使用,并在Index()方法中检测协议?
注意:我读过使用UrlRewriting和IIS7的应用程序请求路由的this question,但我被IIS6卡住了,UrlRewriting不是我的选择。
发布于 2011-12-22 20:31:43
这就是我们使用的。如果可以改进的话,我很乐意听到。
[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属性可能会更好。
发布于 2012-01-14 14:01:52
像这样的东西将会有所帮助:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new RequireHttpsAttribute());
}https://stackoverflow.com/questions/8603857
复制相似问题