Пользовательские авторизации в Web.API
Мое понимание ASP.NET MVC заключается в том, что для авторизации я должен использовать что-то вроде -
public class IPAuthorize : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
//figure out if the ip is authorized
//and return true or false
}
Но в веб-API нет AuthorizeCore(..)
.
Существует OnAuthorization(..)
, а общий совет для MVC - не использовать OnAuthorization(..)
.
Что я должен использовать для пользовательских авторизаций в веб-API?
Ответы
Ответ 1
Авторизация выполняется в фильтре авторизации - это означает, что вы наследуете от System.Web.Http.AuthorizeAttribute и реализуете метод IsAuthorized.
Вы не реализуете авторизацию в обычном фильтре действий, потому что они запускаются позже в конвейере, чем фильтры авторизации.
Вы также не реализуете аутентификацию в фильтре (например, при анализе JWT) - это делается еще раньше в точке расширения, называемой MessageHandler.
Ответ 2
Метод, которым мы используем, является обычным атрибутом ApiAuthorize, который наследуется от System.Web.Http.AuthorizeAttribute. например:
public class ApiAuthorizeAttribute : AuthorizeAttribute
{
readonly CreditPointModelContext _ctx = new CreditPointModelContext();
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if(Authorize(actionContext))
{
return;
}
HandleUnauthorizedRequest(actionContext);
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
throw new HttpResponseException(challengeMessage);
}
private bool Authorize(System.Web.Http.Controllers.HttpActionContext actionContext)
{
try
{
//boolean logic to determine if you are authorized.
//We check for a valid token in the request header or cookie.
}
catch (Exception)
{
return false;
}
}
}