C# 是否可以在MVC 5控制器中的一个操作上禁用身份验证筛选器?
如何删除名为列表的操作的身份验证?请告知 我的自定义过滤器编码如下。。我也继承了FilterAttribute调用。 请告知C# 是否可以在MVC 5控制器中的一个操作上禁用身份验证筛选器?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 5,如何删除名为列表的操作的身份验证?请告知 我的自定义过滤器编码如下。。我也继承了FilterAttribute调用。 请告知 [AuthenticateUser] public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return View(); } [AllowAnonymous] public
[AuthenticateUser]
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
[AllowAnonymous]
public ActionResult List()
{
return View();
}
}
下面的代码生成错误消息:错误1“MVC5Features.Filters.AuthenticateAttribute.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\Project\MVC5Features\MVC5Features\Filters\AuthenticateAttribute.cs 16 40 MVC5Features
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}
});
}
}
}
试试
if (this.IsAnonymousAction(context))
属性由于它是您的自定义筛选器,您可以将其扩展为处理
AllowAnonymous
(如果您不想使用AllowAnonymous,您可以创建自己的f.e.NoAuthentication):
公共类身份验证者:IAAuthenticationFilter
{
身份验证时的公共无效(AuthenticationContext filterContext)
{
if(this.IsAnonymousAction(filterContext))
{
返回;
}
//一些代码
}
private bool IsAnonymousAction(AuthenticationContext filterContext)
{
返回filterContext.ActionDescriptor
.GetCustomAttributes(继承:true)
第()类
//或者任何你想要的属性
.Any();
}
}
如果您为该操作指定了一个特定的用户组,并且在您的自定义身份验证筛选器中,允许该组进行所有操作。在MVC 5中,我引用自
类CustomOverrideAuthorizationAttribute继承自FilterAttribute类并实现IOverrideFilter。此接口用于定义应用于控制器的过滤器。属性FiltersToOverride返回IAuthorizationFilter类型。这意味着应用于父级(控制器或全局应用程序类)的授权筛选器将被覆盖我认为您应该从控制器中删除该属性,并将其放在除列表之外的每个操作方法上。因此,阅读这篇文章时,似乎有一种优雅的方法可以按类(或接口)覆盖筛选器。您必须为要重写的每个筛选器编写自定义属性,但如果您认为可能不想重写多个过滤器,那么这可能不是一个很大的问题,对吗?p> 因此,在您的问题中,您希望覆盖
AutherizationUser
属性,因此您需要实现这个类:
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<AllowAnonymousAttribute>()
//or any attr. you want
.Any();
}
}
并将控制器改写为:
public class CustomOverrideAuthenticateUserAttribute :
FilterAttribute, IOverrideFilter
{
public Type FiltersToOverride
{
get
{
return typeof(AuthenticateUserAttribute);
}
}
}
这是您的自定义属性。如果没有,可能
[AllowyAnonymous]
会起作用。MVC5中引入了身份验证过滤器。。没有内置的身份验证筛选器。。这是我的自定义身份验证筛选器…其中是impl。是否为非ymousAction
?更重要的是,if body中应该有return
。secodly-更改我函数的imported body-有AuthorizationContext
,但参数中应该是AuthorizationContext
。[AllowAnonymous]不适用于身份验证筛选器禁用。。。这是为了授权过滤器我试过你的例子。。但它显示了上述错误。。。通过编辑我的问题,我被包含在错误中。。。请看我的评论。你的回答是正确的。我已经复制了你的函数并将其粘贴到我的代码中。因此,您已将答案“AuthorizationContext”编辑为该参数中的“AuthenticationContext”。请注意是的-这是我的错误。Iy当然应该是参数中的AuthenticationContext
。
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();
}
}