ASP.NET MVC 2授权问题

问题描述:

我正在使用自定义成员资格提供程序。一切都很好。但是,在我的web.config文件中,我已经“拒绝用户”启用,所以整个网站被锁定。ASP.NET MVC 2授权问题

This works great。用户被重定向到登录页面。

现在,我有几个控制器/操作,我想允许匿名访问。关于页面,密码重置等。

我可以想出如何做到这一点的唯一方法是解锁整个站点,将[授权]属性放在每个控制器上,并将它们移出控制器/我想要匿名的操作。

这似乎倒退给我。我更倾向于默认锁定所有内容并解锁匿名内容。

有没有办法解决这个问题?

谢谢!

我可以考虑实现这一点的替代方法,但它们都涉及使用自定义的AuthorizeAttribute。做到这一点的一种方法是让基础控制器使用所有控制器派生自定义的AuthorizeAttribute。该属性将被自定义以防止匿名(和未授权)访问动作,除非它是控制器或动作本身已用另一个属性修饰 - 例如AnonymousEnabledAttribute。所有的控制器都会从这个控制器派生出来,并继承它的标准的“默认情况下无匿名”行为。然后,您只需用AnonymousEnabledAttribute修饰想要匿名的控制器/操作 - 为该控制器或操作提供覆盖。或者,对于控制器,只是不从受保护的控制器继承,并且它的所有操作都是公开的。

哦,你的整个网站将不得不保持开放。

[OverridableAuthorize] 
public abstract class ProtectedController : Controller 
{ 
} 

public class MostlyProtectedController : ProtectedController 
{ 
    public ActionResult ProtectedAction() 
    { 
    } 

    [AnonymousEnabled] 
    public ActionResult PublicAction() 
    { 
    } 
} 

[AnonymousEnabled] 
public class ExplicitlyPublicController : ProtectedController 
{ 
    // inherits additional behaviors, but anonymous is enabled by attribute 
} 

public class PublicByOmissionController : Controller 
{ 
    // doesn't inherit and is thus public -- assuming whole site is open 
} 

public class AnonymousEnabledAttribute : Attribute 
{ 
} 

public class OverridableAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext context) 
    { 
      context.HttpContext.Items["ActionDescriptor"] = context.ActionDescriptor; 
      base.OnAuthorize(context); 
    } 

    public override bool AuthorizeCore(HttpContextBase context) 
    { 
     var actionDescriptor = context.Items["ActionDescriptor"] as ActionDescriptor; 
     if (actionDescriptor == null) 
     { 
      throw InvalidOperationException("ActionDescriptor missing from context"); 
     } 
     var attribute = actionDescriptor 
          .GetCustomAttributes(typeof(AnonymousEnabledAttribute,true) 
          .FirstOrDefault(); 
     if (attribute == null) 
     { 
      return base.AuthorizeCore(context); 
     } 
     return true; 
    } 
} 
+0

感谢这个建议。所以,这意味着该网站(按照web.config)将完全打开,但所有控制器都会被默认锁定,只要它们从ProtectedController继承? – cbmeeks 2011-01-07 20:44:39

+0

@cbmeeks - 正确。另外,我认为使用AuthorizeAttribute(或从中派生出来的东西),即MVC安全性,绝对比尝试混合基于WebForms的安全性和MVC安全性更可取。 – tvanfosson 2011-01-07 21:09:38

您可以在您要始终允许控制器web.config文件中创建一个位置:

<configuration> 
    <system.web> 
     ... 
     <authorization> 
      <deny users="?" /> 
     </authorization> 
    </system.web> 
    ... 
    <location path="MyArea/MyController"> 
     <system.web> 
      <authorization> 
       <allow users="*" /> 
      </authorization> 
     </system.web> 
    </location> 
    ... 
</configuration>