【问题标题】:Custom MVC AuthorizeAttribute for ASP.NET Web APIASP.NET Web API 的自定义 MVC AuthorizeAttribute
【发布时间】:2012-03-17 23:40:16
【问题描述】:

我正在尝试在我的 Web API 控制器上实现自定义授权属性,但遇到了意外行为。

     <Authorize(Users:="myUser")>
     Public Function GetTodoItems() As IQueryable(Of TodoItem)

上面的代码运行得很好:它将允许 "myUser" 检索项目,机器人没有其他人被允许访问。但是,当我使用自定义授权尝试相同的方法时,会跳过整个检查,并且任何用户都可以访问该资源。我的派生类中的 AuthorizeCoreOnAuthorization 覆盖的方法都没有被调用。

     <MyAuth(Users:="myUser")>
     Public Function GetTodoItems() As IQueryable(Of TodoItem)

派生类继承自System.Web.Mvc.AuthorizeAttribute,项目部署在IIS上,Windows Authentication & Impersonation enabled匿名身份验证 禁用。

如果我将相同的自定义授权添加到 MVC 控制器,那么它可以工作。但是在 API 控制器上,什么都没有。如果Authorize 属性也不起作用,它会更有意义。我错过了什么吗?这是预期的行为,还是 Beta 版中的错误?

【问题讨论】:

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


    【解决方案1】:

    我已经为基本授权构建了自己的自定义实现:

    http://remy.supertext.ch/2012/04/basic-http-authorization-for-web-api-in-mvc-4-beta/

    也许这会有所帮助。

    【讨论】:

      【解决方案2】:

      对于 Web API,您应该使用 System.Web.Http.dll 中的 System.Web.Http.AuthorizeAttribute 而不是 System.Web.Mvc.AuthorizeAttribute

      也就是说,因为namespace System.Web.Http.AuthorizeAttribute 派生自AuthorizationFilterAttribute。过滤器由 Web API 自动处理。在我自己的实现中,我直接从 AuthorizationFilterAttribute 派生来处理基本的 HTTP 身份验证。

      【讨论】:

      • 谢谢,更改命名空间有效!使用 System.Web.Mvc.AuthorizeAttribute 为 Web API 工作似乎仍然很奇怪,而我的类(派生自那个确切的类)却没有。
      • 在 MVC 和 Web API 之间似乎有许多类型重复。也许它们会被合并,我们将在版本中拥有单个类型的样本。所以也许AuthorizeAttibute 对象中的任何一个都在内部被检查,只是一个猜测。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2019-08-06
      • 2019-01-05
      • 2014-05-21
      • 1970-01-01
      • 2014-12-23
      • 2012-03-20
      相关资源
      最近更新 更多