2016-02-29 2 views
2

Я пытаюсь сделать нечеткое доказательство концепции, которая проверяет токен json-сети в C#. В настоящее время я пытаюсь использовать Json Web Token Handler для библиотеки Microsoft.NET, но я изо всех сил пытаюсь заставить его работать. Документация ограничена, и большинство сообщений в Интернете либо выдают токены, либо проверяют токены симметрично. Я смог симметрично проверить токен с использованием общей библиотеки JWT, как описано в this post, но предоставленное там решение не обрабатывает асимметричную проверку, основанную на способе написания функции декодирования.Проверка JWT асимметрично в C#

Вот код, я работаю с:

var jwtHandler = new JwtSecurityTokenHandler(); 

var certificate = new X509Certificate2(certpath, "password", X509KeyStorageFlags.Exportable); 
var privateKey = certificate.PrivateKey as RSACryptoServiceProvider; 
if (privateKey == null) 
{ 
    throw new Exception("Not an RSA private key"); 
} 
var cspBlob = privateKey.ExportCspBlob(true); 
var pk = Convert.ToBase64String(cspBlob); 

//This code also works instead of the above code, I believe 
//var privateKey = certificate.Export(X509ContentType.Pfx); 

var tokenValidationParameters = new TokenValidationParameters() 
{ 
    ValidAudience = "exampleAudience", 
    ValidIssuer = "exampleIssuer",      
    IssuerSigningToken = pk 
}; 

//The token passed in here is a string version of the token 
//I have tried both a JWTSecurityToken token and just a string version 
ClaimsPrincipal claimsPrincipal = jwtHandler.ValidateToken(asymmetricToken, tokenValidationParameters); 
if (claimsPrincipal != null) 
{ 
    // Valid 
    Console.Write("Valid!"); 
} 

Я получаю пару ошибок, а именно в разделе tokenValidationParameters и лексемы метода Validate. Я просто не знаю, как эти функции работают в отношении моего сценария. Какие параметры проверки необходимо установить? Кроме того, я вижу на msdn page, что есть перегруженный метод, который принимает параметры маркера и проверки, но я получаю ошибку компиляции, указывающую, что ни одна версия этого метода не принимает 2 параметра.

Наконец, кто-нибудь знает, действительно ли этот код будет работать для асимметричной проверки, или метод ValidateToken на JWTHandler работает только для симметричной проверки?

Любая помощь вообще будет оценена по достоинству. Благодарю.

ответ

2

Я нашел решение своего вопроса и просто хотел поделиться. Я закончил использование библиотеки JWT, которую я использовал для симметричной проверки. Я наткнулся на this issue и обнаружил, что они разветвили библиотеку и включили код для асимметричной проверки. Код реализации можно найти here.

кода, который я использовал, чтобы импортировать свой сертификат .pfx и проверить маркер:

var certificate = new X509Certificate2(certpath, "password", X509KeyStorageFlags.Exportable); 
var privateKey = certificate.Export(X509ContentType.Pfx); 

string payload = JWT.Decode(tokenString, privateKey); 
+2

В асимметричных сценариях не является JWTs подписи подтверждена с помощью открытого ключа? Я немного смущен, почему образец кода передает privateKey в метод Decode? – r590

+0

У меня такой же вопрос. сервер аутентификации, сгенерированный JWT, владеет частным ключом. И этот JWT будет использоваться для вызова другого сервера приложений, может ли публичный ключ быть размещен на сервере приложений и для проверки этого JWT? –

Смежные вопросы