在MVC 5控制器中,是否有可能禁用身份验证过滤器来处理一个动作?

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

下面的代码生成错误信息:Error 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 Error 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))

这是你自定义的属性吗?如果不是,也许 [AllowAnonymous] 可以起作用。 - user2160375
MVC 5 中引入了身份验证过滤器。没有内置的身份验证过滤器。这是我的自定义身份验证过滤器... - Kirupananthan.G.S
IsAnonymousAction 的实现在哪里?此外,在 if 语句体中应该有 return - user2160375
第二点 - 改进了我的函数主体 - 参数中应该是AuthenticationContext而不是AuthorizationContext - user2160375
6个回答

11

由于这是您的自定义过滤器,因此可以将其扩展以处理 AllowAnonymous(如果您不想使用 AllowAnonymous,则可以创建自己的例如 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();
    }
}

我已经尝试了你的示例,但是它显示了上述错误。我已经通过编辑我的问题将错误包含在内。请给予建议。 - Kirupananthan.G.S
请查看我在问题中的评论。 - user2160375
你的答案是正确的。我已经复制了你的函数并将其粘贴到我的代码中。因此,你已经在那个参数中将你的答案“AuthorizationContext”编辑为“AuthenticationContext”。请建议。 - Kirupananthan.G.S
是的 - 那是我的错误。参数中应该是 AuthenticationContext 当然。 - user2160375

1

Try the

[AllowAnonymous] 

属性

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Kirupananthan.G.S

0

所以,阅读@Bilal于2014年10月30日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();
    }
}

0
也许如果您为该操作指定一个特定的用户组,并在自定义身份验证过滤器中允许该组执行所有操作,就可以实现。

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

0

我认为你应该从控制器中删除该属性,并将其放在除了List之外的每个操作方法上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接