我一直在互联网上寻找为什么我的自定义 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/