c# - MVC 框架未调用自定义 AuthorizeAttribute

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

我一直在互联网上寻找为什么我的自定义 AuthorizeAttribute 在我的 MVC WebApi 中不起作用。我看到有人在 SO 上问过这种事情,但还没有帮助我解决我的问题:

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
                 Inherited = false)]
    public sealed class CustomAuthorization : AuthorizeAttribute
    {

        //...

         protected override bool AuthorizeCore(HttpContextBase httpContext)
        { 
           // custom auth logic, returns true if authorized, false otherwise
        }
    }

我从 System.Web.Mvc 扩展而不是 System.Web.Http。但是,我的 AuthorizeCore(HttpContextBase httpContext) 从未被调用。

我的 CustomAuthorization 类中有一个构造函数,它接受一个 params string[],这是我的特定操作所需的自定义权限的名称,例如:

[CustomAuthorization("Some Permission")]
[System.Web.Http.HttpGet]
public CustomResponse SomeAction()
{
   //...
}

我希望实现的是,每当对用 [CustomAuthorization] 属性装饰的操作发出请求时,都会触发我的授权代码。如果授权失败,我还希望能够返回更具描述性的 auth failed 消息。不只是:

{"Message":"Authorization has been denied for this request."} 

我相信这涉及覆盖 HandleUnauthorizedRequest 但我如何才能提供我自己的 JSON 响应将序列化的对象?

总而言之,即使我使用 [CustomAuthorization] 属性修饰操作,框架也永远不会调用我的授权代码。它只是直接执行操作中的代码。

其次,如何实现未经授权的响应以序列化自定义 JSON 对象?

提前感谢您的帮助,非常感谢!

最佳答案

好吧,我最终解决了这个问题,方法如下:

public override void OnAuthorization(HttpActionContext actionContext) {

    ....

    if (!authorized) {

       actionContext.Response =    
                  actionContext.Request.CreateResponse(
                                   HttpStatusCode.Unauthorized, 
                                   new  Dictionary<string, string> { 
                                                { "hello", "world" } 
                                   }
                  );

    }

产生结果:

{"hello":"world"}

Dictionary对象是任意的,它只是说明一个类型会成功序列化到Response。

如果您不设置actionContext.Response,则请求将继续执行目标操作 - 即。它被视为已通过此过滤器授权。

希望能帮助处于这个位置的其他人。

关于c# - MVC 框架未调用自定义 AuthorizeAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530991/

相关文章:

c# - WPF 控件未正确刷新

c# - Windows Phone 后退按钮

c# - 如何接受 'dictionary' 数据作为自定义 .NET 属性参数?

c# - 在存储库模式中,我应该使用数据库模型作为我的 View 模型还是应该为此创建单独的 ViewModel?

asp.net - MVC3 中 FileResult 操作的缓存

javascript - 如何使用模型将列表从 View 正确连接到 Controller

c# - 从代码和网站调用Web API

jquery - Style Bundle 的 MVC CDN 后备

c# - ASP.Net MVC Ajax.BeginForm OnComplete 在 Razor View 中传递 c# 参数

asp.net-mvc - 将焦点设置在文本框上 - MVC3