2016-03-29 3 views
0

私はJWTトークンを使って認証されたwebapiを持っています。C#でJWTを認証チケットに復号するJwtFormat.Unprotect

カスタムJWT保護を使用して検証します。これは次のとおりです。

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; 
} 

アクセスはデータベーステーブルを介して制御されるため、ユーザーは認証サービスの一部としてクライアントIDを送信します。クライアントIDがデータベースに存在しない場合は拒否され、チケットはこのdbエントリに関連付けられたシークレットを使用してエンコードされ、返されます。

今、私はデータリクエストでJWTのデコードに苦労していますか?今ではJWTはjwt.ioでうまくデコードしていますので、JWTトークンにストアを必要とせずにJwtProtectを使ってデコードする必要があると思いますか?私が見る限り、JwtProtectは許可された視聴者を通過させたいと思っていますか? (私はこれをすべてデータベースから取り除くことで可能かもしれませんが、本当に必要ですか?)

何か助けや助言がよろしくです。

ありがとうございました。

答えて

1

JWTトークンはbase64文字列です。自由に複数の方法でデコードできます。

チケットの保護を解除し、チケットの有効性を確認する場合は、System.IdentityModel.Tokens.SecurityTokenHandlerを使用できます。

たとえば、thisの回答を確認します。

ところで、ただの個人的な配慮:セキュリティの第1のルールは「自分のセキュリティを作るのではなく、大量に固執する」ことです。あなたは、明確かつ使用された道をたどることで、より多くのサポートを提供し、重要なものを混乱させたり、忘れたりしないことがわかります。

+1

Luca、ありがとう。私は、Taiseer Joudahs(bitoftech.net)のチュートリアルとJWTの役割を組み合わせたものです。 JWTチュートリアルの場合は、単純に共通の秘密を使用しました。クライアントごとに固有の秘密を持つことでアクセスを制御する機能を維持したいと思います(簡単に制限できるなど)。 –