Tenho usado a biblioteca JWT para decodificar um Json Web Token e gostaria de mudar para a implementação JWT oficial da Microsoft, System.IdentityModel.Tokens.Jwt .
A documentação é muito esparsa, então estou tendo dificuldade em descobrir como realizar o que venho fazendo com a biblioteca JWT. Com a biblioteca JWT, há um método Decode que pega o JWT codificado em base64 e o transforma em JSON, que pode ser desserializado. Eu gostaria de fazer algo semelhante usando System.IdentityModel.Tokens.Jwt, mas depois de uma boa quantidade de pesquisas, não consigo descobrir como.
Pelo que vale a pena, estou lendo o token JWT de um cookie, para uso com a estrutura de identidade do Google.
Qualquer ajuda seria apreciada.
Respostas:
Dentro do pacote, há uma classe chamada
JwtSecurityTokenHandler
que deriva deSystem.IdentityModel.Tokens.SecurityTokenHandler
. No WIF, essa é a classe principal para desserializar e serializar tokens de segurança.A classe tem um
ReadToken(String)
método que pegará sua string JWT codificada em base64 e retornará umSecurityToken
que representa o JWT.O
SecurityTokenHandler
também tem umValidateToken(SecurityToken)
método que pega seuSecurityToken
e cria umReadOnlyCollection<ClaimsIdentity>
. Normalmente, para o JWT, ele conterá um únicoClaimsIdentity
objeto que possui um conjunto de declarações que representam as propriedades do JWT original.JwtSecurityTokenHandler
define algumas sobrecargas adicionais paraValidateToken
, em particular, ter umaClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)
sobrecarga. OTokenValidationParameters
argumento permite que você especifique o certificado de assinatura de token (como uma lista deX509SecurityTokens
). Ele também tem uma sobrecarga que considera o JWT como um emstring
vez de umSecurityToken
.O código para fazer isso é um pouco complicado, mas pode ser encontrado no código (
TokenValidationHandler
classe) Global.asax.cx no exemplo de desenvolvedor chamado "ADAL - Aplicativo nativo para serviço REST - Autenticação com ACS via caixa de diálogo do navegador", localizado emhttp://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc
Como alternativa, a
JwtSecurityToken
classe possui métodos adicionais que não estão naSecurityToken
classe base , como umaClaims
propriedade que obtém as declarações contidas sem passar pelaClaimsIdentity
coleção. Ele também tem umaPayload
propriedade que retorna umJwtPayload
objeto que permite obter o JSON bruto do token. Depende do seu cenário qual abordagem é mais apropriada.A documentação geral (ou seja, não específica do JWT) para a
SecurityTokenHandler
classe está emhttp://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx
Dependendo do seu aplicativo, você pode configurar o manipulador JWT no pipeline WIF exatamente como qualquer outro manipulador.
Existem 3 amostras em uso em diferentes tipos de aplicação em
http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure% 20AD% 20Developer% 20Experience% 20Team & f% 5B1% 5D.Text = Azure% 20AD% 20Developer% 20Experience% 20Team
Provavelmente, um atenderá às suas necessidades ou, pelo menos, será adaptável a elas.
fonte
Estou apenas me perguntando por que usar algumas bibliotecas para a decodificação e verificação do token JWT.
O token JWT codificado pode ser criado usando o seguinte pseudocódigo
É muito fácil fazer sem nenhuma biblioteca específica. Usando o seguinte código:
A decodificação do token é a versão reversa do código acima. Para verificar a assinatura, você precisará fazer o mesmo e comparar a parte da assinatura com a assinatura calculada.
ATUALIZAÇÃO: para aqueles que têm dificuldade em fazer codificação / decodificação de urlsafe em base64, consulte outra pergunta do SO , e também wiki e RFCs
fonte