是否可以禁用身份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(); } }