Estou trabalhando com o aplicativo ASP.NET Core. Estou tentando implementar a autenticação baseada em token, mas não consigo descobrir como usar o novo sistema de segurança no meu caso. Passei por exemplos, mas eles não me ajudaram muito, estão usando autenticação de cookie ou autenticação externa (GitHub, Microsoft, Twitter).
Qual é o meu cenário: o aplicativo angularjs deve solicitar o /token
URL que passa o nome de usuário e a senha. O WebApi deve autorizar o usuário e o retorno, access_token
que serão usados pelo aplicativo angularjs nas seguintes solicitações.
Encontrei um excelente artigo sobre como implementar exatamente o que eu preciso na versão atual do ASP.NET - Autenticação baseada em token usando a API da Web 2 do ASP.NET, Owin e Identidade . Mas não é óbvio para mim como fazer a mesma coisa no ASP.NET Core.
Minha pergunta é: como configurar o aplicativo ASP.NET Core WebApi para funcionar com autenticação baseada em token?
Respostas:
Atualização para .Net Core 3.1:
David Fowler (arquiteto da equipe do ASP .NET Core) reuniu um conjunto incrivelmente simples de aplicativos de tarefas, incluindo um aplicativo simples que demonstra o JWT . Em breve, incorporarei suas atualizações e seu estilo simplista.
Atualizado para .Net Core 2:
Versões anteriores desta resposta usavam RSA; realmente não é necessário se o mesmo código que está gerando os tokens também estiver verificando os tokens. No entanto, se você estiver distribuindo a responsabilidade, provavelmente ainda desejará fazer isso usando uma instância de
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Crie algumas constantes que usaremos mais tarde; aqui está o que eu fiz:
Adicione isso ao seu Startup.cs
ConfigureServices
. Usaremos a injeção de dependência posteriormente para acessar essas configurações. Estou assumindo que vocêauthenticationConfiguration
é umConfigurationSection
ou umConfiguration
objeto que pode ter uma configuração diferente para depuração e produção. Guarde sua chave com segurança! Pode ser qualquer string.Eu já vi outras respostas alterar outras configurações, como
ClockSkew
; os padrões são definidos de forma que funcionem em ambientes distribuídos cujos relógios não estejam exatamente sincronizados. Essas são as únicas configurações que você precisa alterar.Configure a autenticação. Você deve ter essa linha antes de qualquer middleware que exija suas
User
informações, comoapp.UseMvc()
.Observe que isso não fará com que seu token seja emitido com o
SignInManager
ou qualquer outra coisa. Você precisará fornecer seu próprio mecanismo para produzir seu JWT - veja abaixo.Você pode especificar um
AuthorizationPolicy
. Isso permitirá que você especifique controladores e ações que permitem apenas tokens do Bearer como autenticação usando[Authorize("Bearer")]
.Aí vem a parte complicada: construir o token.
Em seguida, no seu controlador onde você deseja seu token, algo como o seguinte:
Aqui, suponho que você já tenha um diretor. Se você estiver usando o Identity, poderá
IUserClaimsPrincipalFactory<>
transformá-loUser
em umClaimsPrincipal
.Para testá-lo : obter um token, colocá-lo em forma de jwt.io . As instruções que forneci acima também permitem que você use o segredo da sua configuração para validar a assinatura!
Se você estava renderizando isso em uma exibição parcial na sua página HTML em combinação com a autenticação somente do portador no .Net 4.5, agora você pode usar a
ViewComponent
para fazer o mesmo. É basicamente o mesmo que o código de Ação do Controlador acima.fonte
IOptions<OAuthBearerAuthenticationOptions>
para usar as Opções; o uso de um objeto Options diretamente não é suportado devido à configuração nomeada suportada pela estrutura do Modelo de Opções.Trabalhando com a fabulosa resposta de Matt Dekrey , criei um exemplo completo de autenticação baseada em token, trabalhando no ASP.NET Core (1.0.1). Você pode encontrar o código completo neste repositório no GitHub (ramificações alternativas para 1.0.0-rc1 , beta8 , beta7 ), mas, resumidamente, as etapas importantes são:
Gere uma chave para seu aplicativo
No meu exemplo, eu gero uma chave aleatória cada vez que o aplicativo é iniciado, você precisa gerar uma e armazená-la em algum lugar e fornecê-la ao seu aplicativo. Veja este arquivo para saber como estou gerando uma chave aleatória e como você pode importá-la de um arquivo .json . Conforme sugerido nos comentários de @kspearrin, a API de proteção de dados parece ser um candidato ideal para gerenciar as chaves "corretamente", mas ainda não resolvi se isso é possível. Envie uma solicitação de recebimento se você trabalhar com isso!
Startup.cs - ConfigureServices
Aqui, precisamos carregar uma chave privada para que nossos tokens sejam assinados, os quais também usaremos para verificar os tokens conforme eles são apresentados. Estamos armazenando a chave em uma variável em nível de classe
key
que reutilizaremos no método Configure abaixo. TokenAuthOptions é uma classe simples que contém a identidade de assinatura, o público e o emissor que precisaremos no TokenController para criar nossas chaves.Também estabelecemos uma política de autorização para permitir o uso
[Authorize("Bearer")]
nos pontos de extremidade e classes que desejamos proteger.Startup.cs - Configurar
Aqui, precisamos configurar o JwtBearerAuthentication:
TokenController
No controlador de token, você precisa ter um método para gerar chaves assinadas usando a chave que foi carregada no Startup.cs. Como registramos uma instância TokenAuthOptions na inicialização, precisamos injetar isso no construtor do TokenController:
Em seguida, você precisará gerar o token em seu manipulador para o terminal de logon. No meu exemplo, estou usando um nome de usuário e uma senha e validando aqueles usando uma instrução if, mas a principal coisa que você precisa fazer é criar ou carregar uma declaração baseada em identidade e gere o token para isso:
E deve ser isso. Basta adicionar
[Authorize("Bearer")]
a qualquer método ou classe que você deseja proteger e você receberá um erro se tentar acessá-lo sem a presença de um token. Se você deseja retornar um erro 401 em vez de 500, será necessário registrar um manipulador de exceção personalizado, como eu tenho no meu exemplo aqui .fonte
Você pode dar uma olhada nas amostras de conexão OpenId que ilustram como lidar com diferentes mecanismos de autenticação, incluindo Tokens JWT:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Se você olhar o projeto Cordova Backend, a configuração da API é a seguinte:
A lógica em /Providers/AuthorizationProvider.cs e o RessourceController desse projeto também merecem uma olhada;).
Como alternativa, você também pode usar o código a seguir para validar tokens (também há um trecho para fazê-lo funcionar com signalR):
Para emitir token, você pode usar os pacotes do servidor openId Connect da seguinte maneira:
EDIT: Eu implementei um aplicativo de página única com implementação de autenticação baseada em token usando a estrutura de front end Aurelia e o núcleo do ASP.NET. Há também uma conexão persistente do sinal R. No entanto, eu não fiz nenhuma implementação de banco de dados. O código pode ser visto aqui: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Espero que isto ajude,
melhor,
Alex
fonte
Dê uma olhada no OpenIddict - é um novo projeto (no momento da redação) que facilita a configuração da criação de tokens JWT e a atualização de tokens no ASP.NET 5. A validação dos tokens é realizada por outro software.
Supondo que você usar
Identity
comEntity Framework
, a última linha é o que você adicionar ao seuConfigureServices
método:Em
Configure
, você configura o OpenIddict para servir tokens JWT:Você também configura a validação de tokens em
Configure
:Há uma ou duas outras coisas menores, como o DbContext precisa derivar do OpenIddictContext.
Você pode ver uma explicação completa nesta postagem do blog: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Uma demonstração de funcionamento está disponível em: https://github.com/capesean/openiddict-test
fonte