MVC 4覆盖AuthorizeAttribute不起作用

时间:2013-03-04 01:41:13

标签: asp.net-mvc-4 authorize-attribute

我创建了一个基本的MVC 4项目。添加了HomeController和Home \ Index.cshtml以及ContactUs.cshtml。 在Global.asax中为ContactUs添加路由。

添加文件夹验证并在Auth文件夹中添加类Auth.css。

using System;
using System.Web;
using System.Web.Http;
using System.Net.Http;


namespace MvcApplicationTestProject1
{
    public class AuthAttribute : AuthorizeAttribute
    {
        //public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        //{
        //    HandleUnauthorizedRequest(actionContext);
        //}        

        protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Redirect);
            response.Headers.Add("Location", "http://www.google.com");
            actionContext.Response = response;
        }
        //MVC 4 Web.Http.AuthorizeAttribute has IsAuthorized function but not AuthorizeCore
        protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            return false;
        }
    }
}

在HomeController中

public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

        //
        // GET: /Home/  
        [Auth]       
        public ActionResult ContactUs()
        {
            return View();
        }
    }

问题是运行代码并访问http:// localhost:[此处的端口号] / Home / ContactUs, 它没有点击覆盖类AuthAttribute。

代码有问题吗?

1 个答案:

答案 0 :(得分:17)

您的评论说您正在尝试实现this post中的内容,但您根本不是从该帖子复制的代码,而是复制了以前的SO帖子:Using custom authorization in MVC 4,它指的是Web API 。在阅读该帖子时,您会看到区别在于您使用的AuthorizeAttribute。您使用System.Web.Http代替System.Web.Mvc

如果您使用了评论中提到的代码,那么您会发现它会起作用:

using System.Web;
using System.Web.Mvc;

namespace MvcApplicationTestProject1
{
    public class AuthAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return false;
        }
    }
}