Web API AuthorizeAttribute 不返回自定义响应
本文关键字:自定义 响应 返回 API AuthorizeAttribute Web | 更新日期: 2023-09-27 17:56:57
如何使 IsAuthorized 返回我的自定义对象,而函数返回 false?
在我的 WebAPI 项目中,我有一个类似这样的类;
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
StandardWebAPIResponse invalidUserResponse = new StandardWebAPIResponse()
{
code = (int) Constants.ErrorCodes.InvalidCredentials,
data = "InvalidCredentials.",
StatusCode = HttpStatusCode.Unauthorized
};
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized,
invalidUserResponse);
// if I set this to true I am getting 401 with my custom object
// otherwise it gives me default error message
// {"Message":"Authorization has been denied for this request."}
return false;
}
}
由于某种原因,当我从 IsAuthorized 函数返回 false 时,它不会返回我的自定义无效用户响应对象。但是如果我返回 true,它会返回它。
如何解决此问题?
我知道
这个问题已经得到了回答,但我觉得它有点错误。我认为未经授权的请求的消息不应该由OnAuthorization
处理,而应该由HandleUnauthorizedRequest
处理。我不确定将其放入 OnAuthorization
中是否会导致任何重大问题,但大概您在真和不假时收到消息的原因是基类在 HandleUnauthorizedRequest
中覆盖了您的响应。
这是一件微妙的事情,但OnAuthorization
指向HandleUnauthorizedRequest
是有原因的。这主要是职责分离的事情,但是如果您想要做的不仅仅是发送错误消息,例如记录错误请求,那么您OnAuthorization
方法可能会变得拥挤。如果没有别的,为了清楚起见,您应该使用提供给您的方法。
是的,我同意。您需要实现从 AuthorizeAttribute
派生的自定义过滤器。
protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{
base.HandleUnauthorizedRequest(actionContext);
actionContext.Response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.Unauthorized,
Content = new ObjectContent(typeof(ErrorMessage),
new ErrorMessage()
{
StatusCode = (int)HttpStatusCode.Unauthorized,
Message = Constants.UnauthorisedErrorMessage,
ErrorCode = Constants.UnauthorisedErrorCode
}, new JsonMediaTypeFormatter())
};
}
您应该重写OnAuthorization
方法,该方法使用IsAuthorized
并刷新response
,或强制刷新您的方法。更有意义的是填充筛选器操作它的响应。