C# 是否可以在MVC 5控制器中的一个操作上禁用身份验证筛选器?

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

如何删除名为列表的操作的身份验证?请告知

我的自定义过滤器编码如下。。我也继承了FilterAttribute调用。 请告知

[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();
    }
}