2016-08-02 54 views
0

PHPを使用して作成したJWTトークンを.NETアプリケーション(フレームワークバージョン4.5.1)で使用する必要があります。トークンは、次のコード(https://github.com/lcobucci/jwtライブラリに依存している)を使用して、PHPで生成されます。.NETでPHPで作成されたJWTトークンの検証/検証

use Lcobucci\JWT\Builder; 
use Lcobucci\JWT\Signer\Hmac\Sha256; 

$tokenBuilder = new Builder(); 
$tokenSigner = new Sha256(); 

$token = (string)$tokenBuilder 
    ->setIssuer('localhost:8081') 
    ->setAudience('myaudience') 
    ->setIssuedAt(time()) 
    ->setExpiration(time() + 86400) 
    ->sign($tokenSigner, '710VWV0zby') 
    ->getToken(); 

return $token; 

を私はC#でトークン罰金を読むことができましたが、検証し、検証する方法を見つけ出すために激しく苦労していますトークン署名。

TokenValidationParameters validationParameters = new TokenValidationParameters 
{ 
    ValidateIssuer = true 
}; 

var tokenHandler = new JwtSecurityTokenHandler(); 

// THIS IS TO TEST IF TOKEN CAN BE READ 
/*var jwtToken = tokenHandler.ReadJwtToken(token); 

HttpContext.Current.Response.Write(jwtToken.Issuer);*/ 

SecurityToken validatedToken = null; 
try 
{ 
    tokenHandler.ValidateToken(token, validationParameters, out validatedToken); 
} 
catch (Exception) 
{ 
    HttpContext.Current.Response.Write("Invalid! :("); 
} 

if (validatedToken != null) { 
    HttpContext.Current.Response.Write("Valid! :)"); 
} 

私のコードでは、SHA-256キーがどこにも言及されていないとすれば、署名は検証できません。私は、TokenValidationParametersに何らかの形でそれを組み込む必要があると仮定しています.SigningTokenが1になると推測していますが、HMAC SHA 256キーを指定する場所を実際にはわかりません。

答えて

1

トークンの作成に使用していたエクスポート証明書が必要です。たとえば、.pem形式のファイルにすることができます。その後COMENTS検証のため

string _CERTIFICATE = @" DD5NYXRyaXg0Ml9mNThlMzdkLWU2ZjktNGU0Yi05MzVlLTNhMDFi 
          NzU2N2I5YjAeFw0xNjEyMzExNTE1MjNaFw00MjAxMDcxNTE1MjNaMEkxRzBFBgNVBAMMPk1hdHJp 
          eDQyX0FDU19SZWx5aW5nUGFydHlfZmY1OGUzN2QtZTZmOS00ZTRiLTkzNWUtM2EwMWI3NTY3Yjli 
          MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAho5G6pY9QJs/945aQ1w8oiF/17ZNGsNY 
          ul5G/+TprN7KfgzT9u+A588f4Z4B8z5QJlwIUeH33iuRcV0AIHd9MnEKR56IdOLLlNWNPvRAG5FJ 
          Wt4XPlaG+bE/oyuqxqpQM1KJ0iN74K/WLXM8ZdQlq7gTgtLS+icZH3i2arC8rdobh3zRk1wbUVXn 
          kjR4CASy+07LZwbVVp2g3pOsuy5AWBURIynQ7z3zj+u7NMF42htLOEzISl3Qb3BMOoXFMm93UGwp 
          B/Ae+zpWFWeh6190ipcUMXoAOfdh9VZUZX9C7OI/3plOiwKUvwfBQyLR8C/4uiTcCTp1i8fS0bta 
          jkPhdQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA3fmwEgej+BhB7dkw+0TWEDiIC9cXR4uW7kElM 
          7+L7ARmUYVpAx05Z8oarsR0zm1u3ZYR00y3eLhw5RcXN6hC5jb5HYSQZERdqlzvS6bU6xJ57H7tC 
          KuPADkYmuPnRM/cdMKPeSG3ZHnHcTgJx62hFloPWbGPr9VLVp4R4coUgtuZMtlFvXamjpCNYSpob 
          N9wzk36r/4c+Nd/n+4DwqIaVzgEXHXkOUtOZhTYh7SG5WJVUSep5cIq3SBGzLn8oXCjiqn72zJ7C 
          vn5/ekaC1nzMDMcga5qWQNdLd/rXt65ZMbB/JhM+Ee9TIvmrrDXlvRh2cv7GtoTtPYEbIdVvrF+W"; 

を招くことなく、その証明書から

public static RSACryptoServiceProvider CreateRsaCryptoProviderFromX509Certificate() 
    { 
     byte[] certData = Convert.FromBase64String(_CERTIFICATE); 
     X509Certificate2 x509Cert = new X509Certificate2(); 
     x509Cert.Import(certData); 
     var x509PublicKeyXml = x509Cert.PublicKey.Key.ToXmlString(false); 

     RSACryptoServiceProvider RsaProvider = new RSACryptoServiceProvider(); 
     RsaProvider.FromXmlString(x509PublicKeyXml); 
     return RsaProvider; 
    } 
の.pemファイルから_CERTIFICATEストアデータ

をデータを使用して暗号プロバイダを作成トークンハンドラ、検証パラメータを作成し、cryptoprovider

でトークンを検証します
 public static bool ValidateJwt(string jwt) 
    { 
     JwtSecurityTokenHandler securityTokenHandler = new JwtSecurityTokenHandler(); 
     RSACryptoServiceProvider rsa = CreateRsaCryptoProviderFromX509Certificate(); 

     TokenValidationParameters validationParameters = new TokenValidationParameters() 
     { 
      ValidAudience ="urn:6c23aaa7-6da8-4941-98b0-62f63cd146", 
      ValidIssuer = "https://accounts.issuer.com", 
      IssuerSigningKey = new RsaSecurityKey(rsa) 
     }; 
     SecurityToken token; 
     ClaimsPrincipal claimsPrincipal = securityTokenHandler.ValidateToken(jwt, validationParameters, out token); 

     return claimsPrincipal.IsInRole("Admin"); 
    } 
関連する問題