私は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は許可された視聴者を通過させたいと思っていますか? (私はこれをすべてデータベースから取り除くことで可能かもしれませんが、本当に必要ですか?)
何か助けや助言がよろしくです。
ありがとうございました。
Luca、ありがとう。私は、Taiseer Joudahs(bitoftech.net)のチュートリアルとJWTの役割を組み合わせたものです。 JWTチュートリアルの場合は、単純に共通の秘密を使用しました。クライアントごとに固有の秘密を持つことでアクセスを制御する機能を維持したいと思います(簡単に制限できるなど)。 –