2011-07-13 15 views
0

此操作過濾器似乎並不一致。有時它會關閉SSL,有時它不會。我已經將它應用於整個控制器的聲明。ActionFilterAttribute關閉Asp.Net上的SSL MVC2控制器不能一致地工作

public class SSLFilter:ActionFilterAttribute 
    { 
      public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase req = filterContext.HttpContext.Request; 
     HttpResponseBase res = filterContext.HttpContext.Response; 

     if (req.IsSecureConnection) 
     { 
      var builder = new UriBuilder(req.Url) 
      { 
       Scheme = Uri.UriSchemeHttp, 
       Port = 80 
      }; 
      res.Redirect(builder.Uri.ToString()); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
    } 

這有點奇怪...任何想法,爲什麼它可能會偶爾工作?

回答

0

您是否試過用[RequireHttps]屬性裝飾您的控制器/操作?

糟糕,沒有注意到你問的是ASP.NET MVC 2.這個屬性僅在ASP.NET MVC 3中可用,所以下面是它的源代碼(在ASP.NET MVC 3中實現):

using System; 
using System.Diagnostics.CodeAnalysis; 
using System.Web.Mvc.Resources; 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class RequireHttpsAttribute : FilterAttribute, IAuthorizationFilter { 

    public virtual void OnAuthorization(AuthorizationContext filterContext) { 
     if (filterContext == null) { 
      throw new ArgumentNullException("filterContext"); 
     } 

     if (!filterContext.HttpContext.Request.IsSecureConnection) { 
      HandleNonHttpsRequest(filterContext); 
     } 
    } 

    protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext) { 
     // only redirect for GET requests, otherwise the browser might not propagate the verb and request 
     // body correctly. 

     if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { 
      throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl); 
     } 

     // redirect to HTTPS version of page 
     string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl; 
     filterContext.Result = new RedirectResult(url); 
    } 

} 

注意,它是如何做任何重定向,而不是使用RedirectResult這是在ASP.NET MVC執行重定向的正確方法=>通過返回操作結果:

filterContext.Result = new RedirectResult(url); 

不僅如此,這將執行正確的重定向,但這是如何短路的執行動作。在語義上你的過濾器實際上應該是IAuthorizationFilter,因爲你在這裏阻止訪問某些資源。

相關問題