asp.net-mvc – ASP.Net MVC 3:反向授权属性

我有一个简单的ASP.Net MVC 3应用程序,它有一些控制器和很少的动作.

现在,由于这是基于用户的应用程序,因此大多数控制器操作都需要对用户进行身份验证. MVC使用内置的Authorize属性处理这个问题,您可以使用该属性单独装饰控制器和/或操作.

最棒的是你可以将属性应用于控制器,并且该给定控制器的所有操作也将应用它 – 保存了大量的输入;)

我有一个控制器,比方说,10个动作.但我希望其中一个操作没有应用Authorize属性.

是的,我可以将该属性应用于其他9并将其从控制器中删除,这将完全符合我的需要.但有没有办法将它应用于控制器,只是选择排除其中一个动作?

实际上,会想要……

[!授权]或[NotAuthorize]

我知道我可以创建一个可以完成工作的自定义工具,但我想知道的是,是否有内置方法可以做到这一点?或者我是否必须将该属性应用于所有其他9个其他操作?

解决方法

菲尔·哈克(Phil Haack)最近写了一篇关于这个确切场景的博文:

Conditional Filters in ASP.NET MVC 3

他的解决方包括编写一个自定义的“条件过滤器提供程序”,允许人们为动作方法属性指定过滤条件.

细节和推理在他的帖子中,但代码相对简单.首先,创建过滤器提供程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public class ConditionalFilterProvider : IFilterProvider {
  private readonly 
    IEnumerable<Func<ControllerContext,ActionDescriptor,object>> _conditions;

  public ConditionalFilterProvider(
    IEnumerable<Func<ControllerContext,object>> conditions)
  {

      _conditions = conditions;
  }

  public IEnumerable<Filter> GetFilters(
      ControllerContext controllerContext,ActionDescriptor actionDescriptor) {
    return from condition in _conditions
           select condition(controllerContext,actionDescriptor) into filter
           where filter != null
           select new Filter(filter,FilterScope.Global,null);
  }
}

然后应用它:

IEnumerable<Func<ControllerContext,object>> conditions = 
    new Func<ControllerContext,object>[] { 

    (c,a) => c.Controller.GetType() != typeof(HomeController) ? 
      new MyFilter() : null,(c,a) => a.ActionName.StartsWith("About") ? new SomeFilter() : null
};

var provider = new ConditionalFilterProvider(conditions);
FilterProviders.Providers.Add(provider);

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....