2013-03-01 3 views
27

Мое понимание ASP.NET MVC является то, что для разрешения я должен использовать что-то вроде -Пользовательские разрешения в Web.API

public class IPAuthorize : AuthorizeAttribute { 

protected override bool AuthorizeCore(HttpContextBase httpContext) { 
    //figure out if the ip is authorized 
    //and return true or false 
} 

Но в Web API, нет AuthorizeCore(..).

Существует OnAuthorization(..), а общий совет для MVC - не использовать OnAuthorization(..).

Что следует использовать для пользовательских авторизаций в веб-API?

ответ

43

Я не согласен с Оппозиционный вообще -

Авторизация осуществляется в фильтре авторизации - это означает, что вы проистекают из System.Web.Http.AuthorizeAttribute и реализации IsAuthorized метода.

Вы не реализуете авторизацию в обычном фильтре действий, потому что они работают позже в конвейере, чем фильтры авторизации.

Вы также не реализуете аутентификацию в фильтре (например, синтаксический разбор JWT) - это делается еще раньше в точке расширяемости, называемой MessageHandler.

+2

+1 Это правильный ответ использования System.Web.Http.AuthorizeAttribute. Единственная причина неохотно использовать actionfilter для авторизации - это если вам нужен доступ к десериализованному телу сообщения, чтобы принять решение о авторизации, но это редко либо необходимо, либо хорошая практика. –

+0

Если я реализую авторизацию ip-адреса, наследующую от AuthorizeAttribute, нормально ли переопределять OnAuthorization (..) - я читал это в MVC, о котором вы посоветовали не делать этого. – tom

+1

Вместо того, чтобы переопределять OnAuthorization, вероятно, лучше переопределить IsAuthorized и/или HandleUnauthorizedRequest. Они выполняют большую часть фактической работы. –

11

Метод, которым мы пользуемся, является обычным атрибутом 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; 
     } 
    } 
} 
+9

Вы не должны переопределять OnAuthorization - потому что вы Отсутствует обработка [AllowAnonymous]. – leastprivilege

+4

Я думал, что причина, по которой вы авторизовались, заключалась не в том, чтобы анонимно. Назовите меня сумасшедшим, но это не имеет никакого смысла. –

+1

Имеет смысл, однако, я не могу придумать много причин, по которым вы хотели бы разрешить анонимный доступ к вашему API. В нашем случае мы, конечно, не хотим, чтобы кто-либо получал данные из нашего API без действительного токена аутентификации. –

Смежные вопросы