Com o Core 1.1, seguiu o conselho de @blockdart e implementou um middleware personalizado:
https://stackoverflow.com/a/31465227/29821
Funcionou assim:
- Middleware rodou. Pegou um token dos cabeçalhos de solicitação.
- Verificou o token e, se válido, criou uma identidade (ClaimsIdentity) que continha várias declarações que, em seguida, foi adicionada por meio de HttpContext.User.AddIdentity ();
- Em ConfigureServices using services.AddAuthorization, adicionei uma política para exigir a declaração fornecida pelo middleware.
- Nos controladores / ações, eu usaria [Autorizar (Funções = "alguma função que o middleware adicionou")]
Isso funciona um pouco com 2.0, exceto que se o token não for válido (etapa 2 acima) e a declaração nunca for adicionada, recebo "Nenhum authenticationScheme foi especificado e nenhum DefaultChallengeScheme encontrado."
Agora estou lendo que a autenticação mudou no 2.0:
https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/identity-2x
Qual é o caminho certo para eu fazer a mesma coisa no ASP.NET Core 2.0? Não vejo um exemplo para fazer autenticação verdadeiramente personalizada.
Respostas:
Então, depois de um longo dia tentando resolver esse problema, eu finalmente descobri como a Microsoft quer que façamos manipuladores de autenticação personalizados para sua nova configuração de middleware único no núcleo 2.0.
Depois de examinar parte da documentação do MSDN, encontrei uma classe chamada
AuthenticationHandler<TOption>
que implementa aIAuthenticationHandler
interface.A partir daí, encontrei uma base de código inteira com os esquemas de autenticação existentes localizados em https://github.com/aspnet/Security
Dentro de um deles, ele mostra como a Microsoft implementa o esquema de autenticação JwtBearer. ( https://github.com/aspnet/Security/tree/master/src/Microsoft.AspNetCore.Authentication.JwtBearer )
Copiei a maior parte desse código para uma nova pasta e limpei todas as coisas relacionadas com
JwtBearer
.Na
JwtBearerHandler
classe (que estendeAuthenticationHandler<>
), há uma substituição paraTask<AuthenticateResult> HandleAuthenticateAsync()
Eu adicionei nosso middleware antigo para configurar declarações por meio de um servidor de token personalizado e ainda estava encontrando alguns problemas com permissões, apenas emitindo um em
200 OK
vez de um401 Unauthorized
quando um token era inválido e nenhuma declaração foi configurada.Percebi que havia substituído o
Task HandleChallengeAsync(AuthenticationProperties properties)
qual, por qualquer motivo, é usado para definir permissões por meio[Authorize(Roles="")]
de um controlador.Depois de remover essa substituição, o código funcionou e lançou um
401
quando as permissões não coincidiram.A principal conclusão disso é que agora você não pode usar um middleware personalizado, você deve implementá-lo via
AuthenticationHandler<>
e definir oDefaultAuthenticateScheme
eDefaultChallengeScheme
ao usarservices.AddAuthentication(...)
.Aqui está um exemplo de como tudo isso deve ser:
Em Startup.cs / ConfigureServices (), adicione:
Em Startup.cs / Configure () adicione:
Crie um novo arquivo CustomAuthExtensions.cs
Crie um novo arquivo CustomAuthOptions.cs
Crie um novo arquivo CustomAuthHandler.cs
fonte
DefaultAuthenticateScheme
eDefaultChallengeScheme
? Eu não entendo porque eles são usados? e quais são as diferenças entre eles.AuthExtension
precisa estar dentro doMicrosoft.Extensions.DependencyInjection
namespace. Veja este exemplo: github.com/aspnet/Security/blob/rel/2.0.0/src/…Há mudanças consideráveis na identidade do Core 1.x para o Core 2.0, conforme aponta o artigo que você referencia. A principal mudança é se afastar da abordagem de middleware e usar injeção de dependência para configurar serviços personalizados. Isso fornece muito mais flexibilidade na personalização da identidade para implementações mais complexas. Portanto, você deseja se afastar da abordagem de middleware mencionada acima e passar para os serviços. Siga as etapas de migração no artigo referenciado para atingir esse objetivo. Comece substituindo app.UseIdentity por app.UseAuthentication . UseIdentity está depreciado e não terá suporte em versões futuras. Para obter um exemplo completo de como inserir uma transformação de declarações personalizadas e realizar a autorização na declaraçãoveja esta postagem do blog .
fonte