asp.net-mvc-2 - ASP.NET MVC 2 授权问题

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

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

现在,我有一些 Controller /操作要允许匿名访问。关于页面、密码重置等

我能弄清楚如何做到这一点的唯一方法是解锁整个站点,将 [Authorize] 属性放在每个 Controller 上,并为我想要匿名的 Controller /操作删除它们。

这对我来说似乎倒退了。我更喜欢默认锁定所有内容并解锁匿名内容。

有解决办法吗?

谢谢!

最佳答案

我可以想到其他方法来实现这一点,但它们都涉及使用自定义的 AuthorizeAttribute。一种方法是让一个基本 Controller 使用所有 Controller 派生自的自定义 AuthorizeAttribute。这个属性将被定制以防止匿名(和未经授权的)访问一个 Action ,除非它是 Controller 或 Action 本身已经用另一个属性修饰——比如 AnonymousEnabledAttribute。您的所有 Controller 都将派生自该 Controller ,因此继承了它的标准“默认无匿名”行为。然后,您只需使用 AnonymousEnabledAttribute 装饰您希望匿名的 Controller /操作——为该 Controller 或操作提供覆盖。或者,对于 Controller ,根本不继承 protected Controller ,它的所有操作都会公开。

哦,您的整个网站必须保持开放。

[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;
    }
}

https://stackoverflow.com/questions/4629723/

相关文章:

gwt - 如何从 GWT 中的代码单击 anchor ?

jquery-ui - 如何设置jQueryUI Dialog for v1.8x的背景

authentication - cakephp 基于组的权限

ruby-on-rails - 有没有一种方法可以自定义页面上的 will_paginate 输出?

asp-classic - 我应该总是使用 connection.close

design-patterns - 访问者模式和编译器代码生成,如何获取子属性?

wcf - 注入(inject) WCF REST 服务

sql - 使用 T-SQL 的 SQL Server 中的 Cast 和 Convert 函数有什

wpf - Visual Studio 2010 中WPF 设计器的选择工具在哪里?

networking - 谷歌 API 速率限制