【问题标题】:Using custom authorization in MVC 4在 MVC 4 中使用自定义授权
【发布时间】:2012-10-04 15:31:24
【问题描述】:

我目前正在使用 MVC 4 Web API 项目类型开发 Web API。我目前处于需要为 API 添加一些安全性的阶段。我知道 Authorize 属性,但是,客户更喜欢不同的方法。 为此,我尝试在我自己的类中覆盖 Authorize 属性,作为一个基本的开始,我只是让 AuthorizeCore 始终返回 false,这应该意味着未经过身份验证。如果我随后将其添加到控制器中的动作中,则动作总是完成并且我总是检索数据。 我认为原因可能是由于未在 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 版本不允许与 MVC 版本相同级别的配置,因为它不允许我覆盖 AuthorizeCore。感谢您对此提供更多帮助。

【问题讨论】:

  • 我认为这与错误的 AuthorizeAttribute 类没有任何关系。在“return false;”上放一个断点;语句,在调试模式下运行,看看你是否点击了该语句。
  • 我试过这个,断点根本没有命中。这与链接中提到的行为相匹配,如果使用了错误的属性,什么都不会发生。
  • 是的,WebApi 与 MVC 的行为似乎有所不同。

标签: c# asp.net-mvc-4 asp.net-web-api


【解决方案1】:

问题似乎是由于使用了错误的 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;
    }
}

【讨论】:

  • 在进一步审查中,我建议不要使用重定向来处理它,而是通过我修订后的答案中给出的标准响应标头来处理它。这将更符合使用 API 的客户端的预期行为。然后客户端可以进行重定向或向用户呈现响应。
【解决方案2】:

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

    }
}

【讨论】:

  • 我应该提到我只是为一些基本测试设置了这个,我通常遵循约定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2010-11-01
  • 2013-12-14
  • 2014-01-23
  • 2013-10-31
相关资源
最近更新 更多