Eu tenho um site MVC webapi que usa autenticação OAuth / token para autenticar solicitações. Todos os controladores relevantes têm os atributos corretos e a autenticação está funcionando bem.
O problema é que nem todas as solicitações podem ser autorizadas no escopo de um atributo - algumas verificações de autorização devem ser realizadas no código que é chamado pelos métodos do controlador - qual é a maneira correta de retornar uma resposta 401 não autorizada neste caso?
Eu tentei throw new HttpException(401, "Unauthorized access");
, mas quando faço isso, o código de status de resposta é 500 e também consigo um rastreamento de pilha. Mesmo em nosso registro DelegatingHandler, podemos ver que a resposta é 500, não 401.
c#
asp.net-mvc
authorization
GoatInTheMachine
fonte
fonte
HttpResponseException
versus quando retornar umUnauthorized()
. Usar a exceção para um erro 'esperado' é um pouco antipadrão, portanto, se houver casos em que você espera que a chamada cometa esse erro, retornarUnauthorized()
é provavelmente a chamada certa. EconomizeHttpResponseException
para o verdadeiramente inesperado.Respostas:
Você deve lançar um
HttpResponseException
de seu método de API, nãoHttpException
:Ou, se você deseja fornecer uma mensagem personalizada:
fonte
Basta devolver o seguinte:
fonte
return Content<string>(HttpStatusCode.Unauthorized, "Message");
para fazer isso.Como alternativa às outras respostas, você também pode usar esse código se quiser retornar um
IActionResult
em um controlador ASP.NET.ASP.NET
Atualização: ASP.NET Core
O código acima não funciona no ASP.NET Core, você pode usar um destes em seu lugar:
Aparentemente, a frase de razão é bastante opcional ( uma resposta HTTP pode omitir a frase de razão? )
fonte
ControllerBase
classe (usada pelo ASP.NET Core WebAPI) não tem mais umaContent
sobrecarga que aceita um código de status HTTP.HttpStatusCode.Unauthorized
), não 200.Content(...)
simplesmente uma abreviação para retornar qualquer conteúdo com um determinado código de status HTTP. Se você quiser enviar 200, você pode usarOk(...)
Você obtém um código de resposta 500 porque está lançando uma exceção (o
HttpException
) que indica algum tipo de erro do servidor, essa é a abordagem errada.Basta definir o código de status de resposta.
fonte
Response
propriedade.Para adicionar a uma resposta existente no ASP.NET Core> = 1.0, você pode
Para passar informações ao cliente, você pode fazer uma chamada como esta:
No cliente além da resposta 401 você também terá os dados passados. Por exemplo, na maioria dos clientes, você pode
await response.json()
obtê-lo.fonte
Em .Net Core você pode usar
ao invés de
que tem a vantagem de redirecionar para a página não autorizada padrão (Conta / Acesso Negado) em vez de fornecer um 401 direto
para alterar o local padrão, modifique seu startup.cs
fonte
você pode usar o código a seguir no asp.net core 2.0:
fonte
Você também segue este código:
fonte