2016-03-29 26 views
0

JWT belirteçleri kullanılarak doğrulanmış bir webapi sahibim.C# JwtFormat.Unprotect ile Kimlik Doğrulama Biletinin JWT'ye düşürülmesi

Özel bir JWT koruması kullanarak doğrularım. Bu aşağıdaki gibidir;

private const string AudiencePropertyKey = "as:client_id"; 

private readonly string _issuer = string.Empty; 

public CustomJwtFormat(string issuer) 
{ 
    _issuer = issuer; 
} 

public string Protect(AuthenticationTicket data) 
{ 
    if (data == null) 
    { 
     throw new ArgumentNullException("data"); 
    } 

    Client client = null; 

    string audienceId = data.Properties.Dictionary.ContainsKey(AudiencePropertyKey) ? data.Properties.Dictionary[AudiencePropertyKey] : null; 

    if (string.IsNullOrWhiteSpace(audienceId)) throw new InvalidOperationException("AuthenticationTicket.Properties does not include the client_id"); 

    using (AuthRepository _repo = new AuthRepository()) 
    { 
     client = _repo.FindClient(audienceId); 
    } 

    if (client == null) throw new InvalidOperationException("ClientId does not exist."); 

    string symmetricKeyAsBase64 = client.Secret; 

    var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64); 

    var signingKey = new HmacSigningCredentials(keyByteArray); 

    var issued = data.Properties.IssuedUtc; 
    var expires = data.Properties.ExpiresUtc; 

    var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey); 

    var handler = new JwtSecurityTokenHandler(); 

    var jwt = handler.WriteToken(token); 

    return jwt; 
} 

erişim bir veritabanı tablosu aracılığı ile kontrol edilir, böylece kullanıcı yetkilendirme hizmetinin bir parçası olarak onların clientid genelinde gönderir. istemcinin veritabanında bulunmaması durumunda reddedilir ve bilet bu db girişiyle ilişkilendirilen sır kullanılarak kodlanır ve onlara iade edilir.

Şimdi, veri istekleri üzerine JWT'nin kod çözümüyle uğraşıyorum. Şimdi JWT, jwt.io'da sadece iyi bir kod çözüyor, bu yüzden JWtProtect'i şu andaki bombeli JWT jetonları üzerinde bir mağazaya ihtiyaç duymadan kod çözmenin bir yolu olmalı mı? Görebildiğim kadarıyla JwtProtect, İzin verilen kitleler arasında geçiş yapmak istiyor mu? (Ben bunu db'den yeniden toplayarak yapabilirim ama gerçekten gerekli mi?).

Her türlü yardım veya öneri büyük ölçüde karşılanmaktadır.

Teşekkürler.

cevap

1

JWT belirteci sadece bir base64 dizesidir, onu birden çok şekilde serbestçe çözebilirsiniz.

"Korumayı kaldır" ve bileti doğrulamak istiyorsanız System.IdentityModel.Tokens.SecurityTokenHandler'u kullanabilirsiniz. Bir örnek için this numaralı cevabı kontrol edin

BTW, sadece kişisel bir değerlendirme: güvenlikteki ilk kural "kendi güvenliğinizi yapmayın, ama kütleye bağlı kalmayın". Açık ve kullanılmış bir yolu izleyerek size daha fazla destek sunacağınızı ve önemli bir şeyi unutmayacağınızı veya unutmayacağınızı göreceksiniz.

+1

Luca, bunun için teşekkürler. Taiseer Joudahs (bitoftech.net) eğitimini bir JWT'nin rolleriyle birleştiriyorum. JWT öğreticisi durumunda basitçe bir ortak sırrı kullanmıştır. Her müşteri için benzersiz bir sırrı (böylece kolayca kısıtlanabilir, vb.) Sağlayarak erişimi kontrol etme yeteneğini korumak isterim. Bunu kitleden uzaklaştıkça görüyor musunuz? –