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.
fonte
Respostas:
Você estenderá
AuthorizationFilterAttribute
se sua lógica de autorização não depender da identidade estabelecida e das funções. Para autorização relacionada ao usuário, você irá estender e usarAuthorizeAttribute
. Para o primeiro caso, você substituiráOnAuthorization
. Para o último caso, você substituiráIsAuthorized
. Como você pode ver no código-fonte desses atributos,OnAuthorization
está marcado como virtual para você substituir se derivarAuthorizationFilterAttribute
. Por outro lado, oIsAuthorized
método é marcado como virtual emAuthorizeAttribute
. Acredito que este seja um bom indicador do uso pretendido.A resposta a essa pergunta está em como OO geralmente funciona. Se você substituir um método, poderá fornecer completamente uma nova implementação ou pegar carona na implementação fornecida pelo pai e aprimorar o comportamento. Por exemplo, considere o caso de
IsAuthorized(HttpActionContext)
. O comportamento da classe base é verificar o usuário / função em relação ao que está especificado no filtro e a identidade estabelecida. Digamos que você queira fazer tudo isso, mas, além disso, deseja verificar outra coisa, pode ser baseado em um cabeçalho de solicitação ou algo assim. Nesse caso, você pode fornecer uma substituição como esta.Sinto muito, mas não entendi seu Q3. BTW, o filtro de autorização existe há muito tempo e as pessoas o usam para todos os tipos de coisas e às vezes incorretamente também.
O cara que disse isso é o Deus do controle de acesso - Dominick. Obviamente, estará correto. Se você olhar para a implementação de
OnAuthorization
(copiado abaixo),a chamada para
SkipAuthorization
é a parte que garante a aplicação dosAllowAnonymous
filtros, ou seja, a autorização é ignorada. Se você substituir esse método, perderá esse comportamento. Na verdade, se você decidir basear sua autorização em usuários / funções, nesse ponto você terá decidido derivarAuthorizeAttribute
. Nesse ponto, a única opção correta deixada para você será substituirIsAuthorized
e não a já substituídaOnAuthorization
, embora seja tecnicamente possível fazer qualquer um.PS. Na API Web ASP.NET, há outro filtro chamado filtro de autenticação. A ideia é que você use isso para autenticação e filtro de autorização para autorização, como o nome indica. No entanto, existem muitos exemplos em que esse limite é distorcido. Muitos exemplos de filtros de autenticação farão algum tipo de autenticação. De qualquer forma, se você tiver tempo e quiser entender um pouco mais, dê uma olhada neste artigo do MSDN . Disclaimer: Foi escrito por mim.
fonte
OnAuthorization
no meu livro. Tenho certeza de que não teria escrito sobre a verificação de resposta para nulo, porque esta é a primeira vez que ouço sobre isso :)Ok, minha sugestão é fazer o seguinte presumindo que você está usando tokens de portador OAuth para proteger sua API da Web e está configurando o allowedTime como uma declaração para o usuário quando você emitiu o token. Você pode ler mais sobre autenticação baseada em tokens aqui
método de substituição
OnAuthorizationAsync
e use o código de amostra abaixo:fonte
AuthorizeAttribute
que herdaAuthorizationFilterAttribute
e -também para aprender, perguntei especificamente sobre qual método devo usar e sobre a Resposta ter conteúdo ou não ...ASP.NET v5 introduziu um sistema de autorização completamente novo. Para aqueles que vão usar o .NET 5, eu sugiro mudar para Microsoft.AspNet.Authorization.
Muito bonito isso envolve a bagunça causada por manter ambos
System.Web.Http.Authorize
eSystem.Web.Mvc.Authorize
e outras implementações de autenticação mais velhos.Ele fornece uma abstração muito boa de Tipos de Ação (Criar, Ler, Atualizar, Excluir), Recursos, Funções, Reivindicações, Visualizações, Requisitos Customizados e permite construir Manipuladores customizados, combinando qualquer um dos anteriores. Além disso, esses manipuladores também podem ser usados em combinação.
fonte