2013-08-14 22 views
17

Web-belirtimi imzalama ve şifreleme ile sağlamalıyım. Yani, makecert.exe ile oluşturulan bazı sertifikaları kullanıyorumJWT güvenlik belirteci nasıl şifrelenir?

var tokenHandler = new JwtSecurityTokenHandler(); 
var tokenDescriptor = new SecurityTokenDescriptor 
{ 
     Subject = new ClaimsIdentity(new[] 
     { 
      new Claim(ClaimTypes.Name, owner.Name), 
      new Claim(ClaimTypes.Role, owner.RoleClaimType), 
      new Claim("custom claim type", "custom content") 
     }), 
     TokenIssuerName = "self", 
     AppliesToAddress = "http://www.example.com", 
     Lifetime = new Lifetime(now, now.AddSeconds(60 * 3)), 
     EncryptingCredentials = new X509EncryptingCredentials(new X509Certificate2(cert)), 
     SigningCredentials = new X509SigningCredentials(cert1) 
}; 
var token = (JwtSecurityToken)tokenHandler.CreateToken(tokenDescriptor);    
var tokenString = tokenHandler.WriteToken(token); 

: Ben kod sonraki satırları yazdım. Sonra başka JwtSecurityTokenHandler ile belirteç dize okuyun:

var tokenHandlerDecr = new JwtSecurityTokenHandler(); 
var tok = tokenHandlerDecr.ReadToken(tokenString); 

Ve belirteç içeriği (I ayıklayıcı altında tok değişkeninde json görebilir) şifreli değildir. Neyi yanlış yapıyorum? Jeton verileri nasıl şifrelenir?

cevap

5

Anlayışım, Microsoft'un JWT uygulamasının şu anda şifrelemeyi desteklememesidir (yalnızca imzalama).

+0

Eğer öyleyse, gerçekten takdir ediyorum. –

+0

Bu uzantıyı inceledim ve doğru gibi görünüyorsun - şifreleme henüz desteklenmiyor. Teşekkürler! –

+0

Bu hala geçerli mi? –

13

Bu eski bir yazıyı biliyorum, ancak birisi hala cevabı arıyorsa cevabımı ekliyorum.

Bu sorun, Microsoft.IdentityModel.Tokens version 5.1.3 adresinde ele alınmıştır. Simgeyi şifrelemek için şifreleme kimlik bilgilerini kabul eden CreateJwtSecurityToken işlevinde aşırı yüklü bir yöntem var. Alıcı, imzayı doğrulamazsa ve olduğu gibi JWT'yi okumaya çalışırsa, talepler boştur. kod parçacığı aşağıdadır: burada

using Microsoft.IdentityModel.Tokens; 
using System.IdentityModel.Tokens.Jwt; 

const string sec = "ProEMLh5e_qnzdNUQrqdHPgp"; 
const string sec1 = "ProEMLh5e_qnzdNU"; 
var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec)); 
var securityKey1 = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec1)); 

var signingCredentials = new SigningCredentials(
    securityKey, 
    SecurityAlgorithms.HmacSha512); 

List<Claim> claims = new List<Claim>() 
{ 
    new Claim("sub", "test"), 
}; 

var ep = new EncryptingCredentials(
    securityKey1, 
    SecurityAlgorithms.Aes128KW, 
    SecurityAlgorithms.Aes128CbcHmacSha256); 

var handler = new JwtSecurityTokenHandler(); 

var jwtSecurityToken = handler.CreateJwtSecurityToken(
    "issuer", 
    "Audience", 
    new ClaimsIdentity(claims), 
    DateTime.Now, 
    DateTime.Now.AddHours(1), 
    DateTime.Now, 
    signingCredentials, 
    ep); 


string tokenString = handler.WriteToken(jwtSecurityToken); 

// Id someone tries to view the JWT without validating/decrypting the token, 
// then no claims are retrieved and the token is safe guarded. 
var jwt = new JwtSecurityToken(tokenString); 

Ve jetonu şifresini/doğrulamak için kodunuz: Bu konuyla ilgili bazı bağlantılar sağlamak beni eğer

using Microsoft.IdentityModel.Tokens; 
using System.IdentityModel.Tokens.Jwt; 

const string sec = "ProEMLh5e_qnzdNUQrqdHPgp"; 
const string sec1 = "ProEMLh5e_qnzdNU"; 
var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec)); 
var securityKey1 = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec1)); 

// This is the input JWT which we want to validate. 
string tokenString = string.Empty; 

// If we retrieve the token without decrypting the claims, we won't get any claims 
// DO not use this jwt variable 
var jwt = new JwtSecurityToken(tokenString); 

// Verification 
var tokenValidationParameters = new TokenValidationParameters() 
{ 
    ValidAudiences = new string[] 
    { 
     "536481524875-glk7nibpj1q9c4184d4n3gittrt8q3mn.apps.googleusercontent.com" 
    }, 
    ValidIssuers = new string[] 
    { 
     "https://accounts.google.com" 
    }, 
    IssuerSigningKey = securityKey, 
    // This is the decryption key 
    TokenDecryptionKey = securityKey1 
}; 

SecurityToken validatedToken; 
var handler = new JwtSecurityTokenHandler(); 

handler.ValidateToken(tokenString, tokenValidationParameters, out validatedToken); 
+0

için cevabımı görün. Jetonu onaylarken anahtarı geçme seçeneği olmadığından nasıl jetonu çözebilirim? –

+1

@SangSuantak TokenValidationParameters'da TokenDecryptionKey özelliği vardır. Doğrulayıcı, belirtecin şifresini çözmek için dahili olarak bu özelliği kullanır. Cevabımı, güncelleme için – Amey

+0

şifreleme kısmını eklediğim için güncelledim –