如何将参数从IsAuthorized传递给HandleUnauthorizedRequest方法web api

时间:2017-01-28 13:15:32

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

我扩展了AuthorizeAttribute并根据某些条件我希望向用户显示不同的消息和httpStatusCode。我的代码是:

protected override bool IsAuthorized(HttpActionContext actionContext)
{
    string headerApiKeyValue = string.Empty;
    try
    {
        IEnumerable<string> headerValues;
        bool isExitsInHeader = actionContext.Request.Headers.TryGetValues("ApiKey",out headerValues);

        if (!isExitsInHeader || headerValues == null)
        {
            actionContext.Response = CreateResponse(HttpStatusCode.BadRequest, apiKeyNotExistInHeader);
            return false;
        }
        return true;
    }
    catch (Exception exception)
    {
        // log exception [apiKeyValue]
        return false;
    }
}

protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
{        
    string a = actionContext.Request.ToString();
    // log here
    actionContext.Response = CreateResponse(HttpStatusCode.MethodNotAllowed, accessDeniedMessage);
}

在上面的代码中有两种响应类型:第一种是当标头中不存在密钥dos而第二种是IsAuthorized方法抛出异常时。如何在HandleUnauthorizedRequest方法中处理这两种类型的消息?有没有办法将参数传递给这个方法?

2 个答案:

答案 0 :(得分:1)

更新:(我刚刚意识到这个问题现在已经快2年了,所以我不认为,我们将从操作员那里回来)

您可以仅使用私有字段来存储所需的任何信息。这是一个非常简单的例子,证明了这一点:

public class HeaderAuthenticationAttribute : AuthorizeAttribute
{
    private bool invalidApiKey = false;

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        bool isExitsInHeader = actionContext.Request.Headers.TryGetValues("ApiKey", out IEnumerable<string> headerValues);

        if (isExitsInHeader && headerValues.Any(x => x.Contains("foo")))
        {
            return true;
        }
        else if (isExitsInHeader && !headerValues.Any(x => x.Contains("foo")))
        {
            return false;
        }
        else
        {
            invalidApiKey = true;
            return false;
        }
    }

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
    {
        //check if response has header indicating invalid api key
        if (invalidApiKey)
        {
            actionContext.Response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.MethodNotAllowed,
                Content = new StringContent("errorMessage here")
            };

        }
        else
        {
            actionContext.Response = new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.Forbidden,
                Content = new StringContent("someOther message here")
            };
        }
        // log here
    }
}

这是做什么的(这并不是一个真实的例子):

  1. 检查标题“ ApiKey”是否存在
  2. 如果是,且其中任何结果为“ foo”,那么我们就很成功
  3. 如果是,但没有值是“ foo”,则返回false
  4. 如果没有标题,请将无效的标题字段设置为true并返回false

然后HandleUnauthorizedRequest只是检查是否设置了此私有字段,并将其用作向用户返回具有不同状态代码的其他HttpResponseMessages的开关。

最后,您只需要实现逻辑以验证api密钥并根据您的要求返回适当的消息即可。

答案 1 :(得分:0)

throw new HttpResponseException(HttpStatusCode.Unauthorized);

尝试此操作并传递您想要的异常