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,它会返回它。

如何解决此问题?

Web API AuthorizeAttribute 不返回自定义响应

我知道

这个问题已经得到了回答,但我觉得它有点错误。我认为未经授权的请求的消息不应该由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,或强制刷新您的方法。更有意义的是填充筛选器操作它的响应。