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

时间:2014-10-30 12:00:15

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5

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

    [AllowAnonymous]
    public ActionResult List()
    {
        return View();
    }
}

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

我的自定义过滤器编码如下..我也继承了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))

6 个答案:

答案 0 :(得分:9)

由于它是您的自定义过滤器,您可以将其扩展为处理AllowAnonymous(如果您不想使用AllowAnonymous,yoy可以创建自己的f.e.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<AllowAnonymousAttribute>() 
                                             //or any attr. you want
                             .Any();
    }
}

答案 1 :(得分:1)

试试

[AllowAnonymous] 

属性

答案 2 :(得分:0)

如果您为该操作指定了特定的用户组,并且在自定义身份验证过滤器中允许此组用于所有内容。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

因此,阅读有关@Bilal posted (Oct 30 '14 at 12:24)的文章,似乎有一种优雅的方法可以按类(或接口)覆盖过滤器。您必须为要覆盖的每个过滤器编写一个自定义属性,但这可能不是一个大问题,如果您认为您可能不想覆盖许多过滤器,对吗?

因此,在您的问题中,您想覆盖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();
    }
}