1. ホーム
  2. .net

[解決済み] System.IdentityModel.Tokens.Jwt を使用した JWT トークンのデコードとベリファイ

2022-09-08 10:53:20

質問

私はこれまで JWT ライブラリを使って Json Web Token をデコードしていましたが、Microsoft の公式 JWT 実装に切り替えたいと思います。 System.IdentityModel.Tokens.Jwt .

ドキュメントは非常にまばらなので、私がJWTライブラリで行ってきたことをどのように達成するのか理解するのに苦労しています。 JWTライブラリには、base64エンコードされたJWTを受け取り、それをJSONに変換し、デシリアライズするDecodeメソッドがあります。System.IdentityModel.Tokens.Jwt を使用して同様のことを行いたいのですが、かなりの量を調査した後、その方法を理解することができません。

価値あることとして、私はGoogleのIDフレームワークで使用するために、クッキーからJWTトークンを読み込んでいます。

どんな助けでも感謝します。

どのように解決するのですか?

パッケージ内には JwtSecurityTokenHandler というクラスがあり、これは System.IdentityModel.Tokens.SecurityTokenHandler . WIFでは、これはセキュリティトークンをデシリアライズおよびシリアライズするためのコアクラスです。

このクラスは ReadToken(String) メソッドがあり、base64 でエンコードされた JWT 文字列を受け取って SecurityToken を返します。

SecurityTokenHandler もまた ValidateToken(SecurityToken) メソッドがあり、これはあなたの SecurityToken を受け取り ReadOnlyCollection<ClaimsIdentity> . 通常JWTの場合、これには1つの ClaimsIdentity オブジェクトが含まれ、これは元の JWT のプロパティを表す一連のクレームを持っています。

JwtSecurityTokenHandler の追加オーバーロードを定義しています。 ValidateToken であり、特に ClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters) のオーバーロードです。その TokenValidationParameters のリストとして)トークンサイニング証明書を指定することができます。 X509SecurityTokens ). また、このオーバーロードはJWTを string ではなく SecurityToken .

これを行うためのコードはかなり複雑ですが、Global.asax.cxのコード( TokenValidationHandler クラス) にある開発者向けサンプル「"ADAL - Native App to REST service - Authentication with ACS via Browser Dialog"」にあります。

http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc

あるいは JwtSecurityToken クラスには、ベースとなる SecurityToken クラスのような Claims プロパティは ClaimsIdentity コレクションを経由せずに含まれるクレームを取得します。また、このプロパティは Payload を返すプロパティもあります。 JwtPayload オブジェクトを返し、トークンの生の JSON を取得することができます。どのアプローチが最も適切かは、シナリオによって異なります。

の一般的な (すなわち JWT 固有のものではない) ドキュメントを参照してください。 SecurityTokenHandler クラスの一般的なドキュメントは

http://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx

アプリケーションによっては、他のハンドラとまったく同じように、JWTハンドラをWIFパイプラインに構成することができます。

異なるタイプのアプリケーションで使用されている3つのサンプルが、以下のサイトにあります。

http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure%20 AD%20Developer%20Experience%20Team&f%5B1%5D.Text=Azure%20 AD%20Developer%20Experience%20Teamの場合

おそらく、1 つはあなたのニーズに合うか、少なくともそれに適応できるものでしょう。