我扩展了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
方法中处理这两种类型的消息?有没有办法将参数传递给这个方法?
答案 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
}
}
这是做什么的(这并不是一个真实的例子):
然后HandleUnauthorizedRequest
只是检查是否设置了此私有字段,并将其用作向用户返回具有不同状态代码的其他HttpResponseMessages
的开关。
最后,您只需要实现逻辑以验证api密钥并根据您的要求返回适当的消息即可。
答案 1 :(得分:0)
throw new HttpResponseException(HttpStatusCode.Unauthorized);
尝试此操作并传递您想要的异常