Estou lendo vários recursos (livros e respostas do SO) sobre autorização no WebApi.
Suponha que eu queira adicionar um atributo personalizado que permite o acesso apenas para determinados usuários:
Caso 1
Já vi essa abordagem de substituição OnAuthorization
, que define a resposta se algo estiver errado
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ( /*check if user OK or not*/)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
}
}
Caso # 2
Mas eu também vi este exemplo semelhante que também substitui, OnAuthorization
mas chama para base
:
public override void OnAuthorization(HttpActionContext actionContext)
{
base.OnAuthorization(actionContext);
// If not authorized at all, don't bother
if (actionContext.Response == null)
{
//...
}
}
Em seguida, você verifica se o
HttpActionContext.Response
está configurado ou não. Se não estiver definido, significa que a solicitação está autorizada e o usuário está ok
Caso # 3
Mas também vi essa abordagem de substituição IsAuthorized
:
public class AllowOnlyCertainUsers : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext context)
{
if ( /*check if user OK or not*/)
{
return true;// or false
}
}
}
Caso # 4
E então eu vi um exemplo semelhante, mas com base de chamada.IsAuthorized (contexto):
protected override bool IsAuthorized(HttpActionContext context)
{
if (something1 && something2 && base.IsAuthorized(context)) //??
return true;
return false;
}
Mais uma coisa
E finalmente Dominick disse aqui :
Você não deve substituir OnAuthorization - porque você estaria perdendo o tratamento de [AllowAnonymous].
Questões
1) Quais métodos devo usar:
IsAuthorized
ouOnAuthorization
? (ou quando usar qual)2) quando devo chamar
base.IsAuthorized or
base.OnAuthorization`?3) É assim que eles o construíram? que se a resposta for nula está tudo bem? (caso 2)
NB
Observe, estou usando (e quero usar) apenas o AuthorizeAttribute
que já herda de AuthorizationFilterAttribute
Por quê ?
Porque estou no primeiro estágio em: http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
De qualquer forma, estou perguntando através da extensão do atributo Autorizar.