c# - 为某些 Action MVC 添加相同的 AuthorizeAttribute 时如何覆盖全局 AuthorizeAttribute?

标签 c# asp.net .net asp.net-mvc

这是我的 CustomAuthorizeAttribute 类:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{

       public string ControllerName { get; set; }


      public override void OnAuthorization(AuthorizationContext filterContext)
      {
           if (ControllerName != "pass")
           {
            // stop or redirect
           }

      }
}

我将它注册到所有 Controller 都可以使用的全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
      filters.Add(new AdminAuthorizeAttribute());
}

对于某些特定的 Action,我将其添加到参数 ControllerName 中:

[AdminAuthorize(ControllerName="pass")]
public ActionResult Index()
{
      return View();
}

但现在问题出在 OnAuthorization() 中,ControllerName 在执行特定 Action 时始终为 null

那是因为我不能将全局 authorizeAttribute 和相同的 Attibute 用于某些特定的 Action together??为什么?我一直认为如果我为特定的 Action 添加一些 AuthorizeAttribute,并将 Attribute 添加到全局过滤器,特定的 Action 将获得高度优先级

更新1:

如果问题源是2授权全部执行。那么当我为某些操作添加相同的 AuthorizeAttribute 时,如何覆盖全局授权过滤器? (唯一不同的是参数,我只是希望它在我为某些操作添加一个时忽略全局授权)

最佳答案

我通过组合 Order 属性和在上下文项中标记请求已由我的属性授权来完成此操作:

public class AuthorizeByRolesAttribute : AuthorizeAttribute
{
    private const string AuthorizedContextItemName = "_AuthorizedByRoles";

    public AuthorizeByRolesAttribute (params string[] roles)
    {
        this.Order = 0;
        this.Roles = string.Join (",", roles);
    }

    public override void OnAuthorization (AuthorizationContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] != null)
            return;

        base.OnAuthorization (filterContext);

        filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] = this.Roles ?? string.Empty;
    }
}

在全局配置中:

filters.Add (new AuthorizeByRolesAttribute ("Admin"), 255);

在 Controller 中简单地:

[AuthorizeByRoles ("NotAdminButCanAccess")]
public class MyController : Controller
...

关于c# - 为某些 Action MVC 添加相同的 AuthorizeAttribute 时如何覆盖全局 AuthorizeAttribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26689639/

相关文章:

asp.net - 如何在 ASP.Net 中执行 <form method ="get"> 搜索表单?

javascript - 如何从用户控件访问隐藏字段

.net - 在缩放时如何避免平移超过嵌套在 Panel 中的 PictureBox 控件的边缘?

c# - 从 ObservableConcurrentCollection 中删除项目

c# - DataView RowFilter 中的撇号

c# - ASP.NET 表单例份验证 - 记住我问题

c# - 在 LinQ 表达式树中声明变量

c# - 如何在不降低应用程序速度的情况下将冗长的控制台重定向到 C# 中的 TextBox

asp.net - 如何获取数据文本框

c# - IIS 7.5 上经典 ASP 中 WshShell.Exec 的 System.IO.FileLoadException