ASP.NET MVC 2授权问题

时间:2011-01-07 20:00:07

标签: asp.net-mvc-2 forms-authentication

我正在使用自定义成员资格提供程序。一切都很好。但是,在我的web.config文件中,我启用了“拒绝用户”,因此整个站点都被锁定了。

这很有效。用户被重定向到登录页面。

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

我能弄清楚如何执行此操作的唯一方法是解锁整个站点,在每个控制器上放置[Authorize]属性,并为我想要匿名的控制器/操作删除它们。

这似乎是我的倒退。我宁愿默认锁定所有内容并解锁匿名内容。

有解决方法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我可以考虑实现此方法的其他方法,但它们都涉及使用自定义的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;
    }
}

答案 1 :(得分:1)

您可以在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>