2009-07-15 100 views
3

是否有人成功在控制器上同时使用Authorize和RequireSSL(来自MVC期货)属性?我创建了一个控制器,为此我必须执行用户必须登录并使用安全连接才能执行的规则。如果用户不在安全连接上,我希望应用重定向到https,因此我在RequireSSL属性上使用了Redirect = true。代码看起来像(CheckPasswordExpired是我土生土长的属性):ASP.NET MVC期货需求SSLL属性和授权属性

[Authorize] 
[RequireSsl(Redirect = true)] 
[CheckPasswordExpired(ActionName = "ChangePassword", 
    ControllerName = "Account")] 
[HandleError] 
public class ActionsController : Controller 
{ 
    .... 
} 

mysite.com/Actions/Index是站点的默认路由,也是默认页面重定向到窗体身份验证。

当我浏览到http://mysite.com时,我想得到的是用户重定向到安全连接,并且因为他们还没有通过身份验证,所以登录页面。我得到的是一个HTTP 400错误(错误的请求)。如果我导航到http://mysite.com/Account/Login,重定向工作,但我的帐户控制器和登录操作方法都没有[授权]属性。

任何人都有使用这两个属性来实现我的目标的经验吗?

谢谢!

回答

4

我用它们都成功了。你有默认行为的属性吗?

public class HomeController : BaseController 
{ 
    [Authorize] 
    [RequireSsl] 
    public ActionResult Index() 
    { 
    } 
} 

BTW我使用一个稍微修改后的版本比期货,这样我可以在全球范围禁用SSL:

[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public sealed class RequireSslAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public RequireSslAttribute() 
    { 
     Redirect = true; 
    } 

    public bool Redirect { get; set; } 

    public void OnAuthorization (AuthorizationContext filterContext) 
    { 
     Validate.IsNotNull (filterContext, "filterContext"); 

     if (!Enable) 
     { 
      return; 
     } 

     if (!filterContext.HttpContext.Request.IsSecureConnection) 
     { 
      // request is not SSL-protected, so throw or redirect 
      if (Redirect) 
      { 
       // form new URL 
       UriBuilder builder = new UriBuilder 
       { 
        Scheme = "https", 
        Host = filterContext.HttpContext.Request.Url.Host, 
        // use the RawUrl since it works with URL Rewriting 
        Path = filterContext.HttpContext.Request.RawUrl 
       }; 
       filterContext.Result = new RedirectResult (builder.ToString()); 
      } 
      else 
      { 
       throw new HttpException ((int)HttpStatusCode.Forbidden, "Access forbidden. The requested resource requires an SSL connection."); 
      } 
     } 
    } 

    public static bool Enable { get; set; } 
} 
+0

感谢您的答复。我在控制器级别附加了属性,而不是在操作级别。顺便说一句,我喜欢你的启用增强。 – 2009-07-16 17:00:55