是否可以禁用身份validation过滤MVC 5控制器中的一个操作?

[AuthenticateUser] public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return View(); } [AllowAnonymous] public ActionResult List() { return View(); } } 

如何删除名为List的操作的身份validation? 请指教….

我的自定义filter编码如下..我也inheritance了FilterAttribute调用。 请告知

 public class AuthenticateUserAttribute: FilterAttribute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext context) { if (this.IsAnonymousAction(context)) { } if (user == "user") { // do nothing } else { context.Result = new HttpUnauthorizedResult(); // mark unauthorized } } public void OnAuthenticationChallenge(AuthenticationChallengeContext context) { if (context.Result == null || context.Result is HttpUnauthorizedResult) { context.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary{ {"controller", "Home"}, {"action", "List"}, {"returnUrl", context.HttpContext.Request.RawUrl} }); } } } 

下面的代码生成错误消息:错误1’MVC5Features.Filters.AuthenticateUserAttribute.IsAnonymousAction(System.Web.Mvc.AuthorizationContext)’的最佳重载方法匹配有一些无效的参数c:\ users \ kirupananthan.g \ documents \ visual studio 2013 \ Projects \ MVC5Features \ MVC5Features \ Filters \ AuthenticateUserAttribute.cs 16 17 MVC5Features错误2参数1:无法从’System.Web.Mvc.Filters.AuthenticationContext’转换为’System.Web.Mvc.AuthorizationContext’c:\ users \ kirupananthan.g \ documents \ visual studio 2013 \ Projects \ MVC5Features \ MVC5Features \ Filters \ AuthenticateUserAttribute.cs 16 40 MVC5Features

 if (this.IsAnonymousAction(context)) 

由于它是您的自定义filter,您可以将其扩展为处理AllowAnonymous (如果您不想使用AllowAnonymous,yoy可以创建自己的fe NoAuthentication):

 public class AuthenticateUser : IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { if (this.IsAnonymousAction(filterContext)) { return; } // some code } private bool IsAnonymousAction(AuthenticationContext filterContext) { return filterContext.ActionDescriptor .GetCustomAttributes(inherit: true) .OfType() //or any attr. you want .Any(); } } 

试试吧

 [AllowAnonymous] 

属性

也许如果您为该操作指定了特定的用户组,并且在自定义身份validationfilter中允许此组用于所有操作。

在MVC 5和我引用http://www.dotnetcurry.com/showarticle.aspx?ID=975 类CustomOverrideAuthorizationAttributeinheritance自FilterAttribute类并实现IOverrideFilter。 此接口用于定义应用于控制器的filter。 属性FiltersToOverride返回IAuthorizationFilter类型。 这意味着将覆盖应用于父(控制器或全局应用程序类)的授权filter

我相信您应该从控制器中删除该属性并将其放在除List之外的每个操作方法上。

因此,阅读@Bilal发布的文章(2014年10月30日12:24) ,似乎有一种优雅的方式来按类(或接口)覆盖filter。 您必须为要覆盖的每个filter编写自定义属性,但如果您认为您可能不想覆盖许多filter,那么这可能不是一个大问题,对吧?

因此,在您的问题中,您希望覆盖AutherizationUser属性,因此您将实现此类:

 public class CustomOverrideAuthenticateUserAttribute : FilterAttribute, IOverrideFilter { public Type FiltersToOverride { get { return typeof(AuthenticateUserAttribute); } } } 

并将您的控制器重写为:

 [AuthenticateUser] public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return View(); } [CustomOverrideAuthenticateUser] public ActionResult List() { return View(); } }