gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:53:39 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com