问题 在MVC 4中使用自定义授权


我目前正在使用MVC 4 Web API项目类型开发Web API。我目前处于需要为API添加一些安全性的阶段。我知道Authorize属性,但客户端更喜欢不同的方法。 为此,我试图覆盖我自己的类中的Authorize属性,作为一个基本的开始,我只是让AuthorizeCore总是返回false,这应该意味着没有经过身份验证。如果我然后将其添加到控制器中的Action,则操作始终完成,并且我始终检索数据。 我认为原因可能是由于自定义属性未在web.config文件中注册,但是,我不确定如何在不使用表单身份验证时进行此操作。

我用来测试的代码是一个全新的MVC 4 Web API项目,其自定义属性如下所示。

public class Auth : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return false;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("http://www.google.com");
    }
}

然后我将属性添加到默认ValuesController的Get方法中

[Auth]
public IEnumerable<string> Get()

但是,当我导航到domain / api / Values时,我总是会看到数据,而不是预期的重定向谷歌。任何帮助表示赞赏。

编辑:看了一下后我在这里找到了这个: http://weblogs.asp.net/jgalloway/archive/2012/05/04/asp-net-mvc-authentication-customizing-authentication-and-authorization-the-right-way.aspx 这表明我选择了错误的AuthorizeAttribute类,因为我从System.Web.MVC中选择了一个而不是System.Web.Http中的那个。似乎Http版本不允许与MVC版本相同级别的配置,因为它不允许我覆盖AuthorizeCore。对此有任何帮助表示赞赏。


2949
2017-10-14 12:54


起源

我不认为它与错误的AuthorizeAttribute类有任何关系。在“返回假”上设一个断点语句,在调试模式下运行,看看你是否点击该语句。 - Turnkey
我试过这个,断点根本没有被击中。这与链接中提到的行为匹配,如果使用了错误的属性,则根本不会发生任何事情。 - bruinbrown
是的,看起来WebApi与MVC的行为有所不同。 - Turnkey


答案:


似乎问题是由使用错误版本的AuthorizeAttribute引起的。使用System.Web.Http中找到的版本后,如果用户没有所需的权限,代码将返回正确的错误代码。作为一个例子,这里是我在原始问题中提供的等效代码

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

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;
    }
}

9
2017-10-14 14:13



在进一步审查时,我建议不要使用重定向处理它,而是通过我修改后的答案中给出的标准响应头。对于使用API​​的客户端,这将更符合预期的行为。然后,客户端可以执行重定向或向用户显示响应。 - Turnkey


对于WebApi,您可以通过在覆盖中指定它来强制它覆盖正确的AuthorizeAttribute类。此外,进行重定向没有意义,这只会返回未经授权的Web响应,这对于API是合适的。

namespace WebApiTest
{
    public class Auth : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            return false;
        }

    }
}

3
2017-10-14 13:04



我应该已经提到过,我只是为目前的一些基本测试设置了它,我确实遵循惯例。 - bruinbrown