認証プロセスの記録にjwtを使用したネット
認証・オーソライズとは
例を挙げる
パスを持っている人しか入れない地域があり、見知らぬ人が直接入ろうとすると警備員に止められ、まずパスを申請してからでないと入れないとする。
相似形認証・認証システム
もしある人が私の秘密のインターフェースの一つにアクセスしたい場合、まずあなたが誰であるかを知る必要があります。あなたが誰であるかを把握する過程が認証であり、もし私があなたが誰であるかを把握できなければ、あなたは見知らぬ人であり、認証は失敗する。
あなたが誰だかわからないなら、あなたは見知らぬ人で認証は失敗です。認証によってあなたが誰であるかがわかるだけなので、認証によって私の機密のインターフェイスにアクセスできるとは限らないが、あなたが私のインターフェイスにアクセスできるかどうかはわからないので、認証は必要である。
認証とは、認証に基づいてインターフェースへのアクセス権があるかどうかを確認し、許可された場合のみアクセスを許可することです。
jwtワークフロー
jwtポリシーベース認証・認証システムにおいて
トークンを持つ人だけがアクセスできる機密性の高いインターフェイス
次のような仕組みになっています。
まず、認証サーバーにトークンを要求し、サーバーがあなたをチェックし、チェックが成功したらトークンを与えます。
その後、インターフェイスにアクセスするたびに、サーバーからトークンを持ってきて、あなたが認証され、インターフェイスにアクセスできることを証明し、解放されるようになります
トークンの生成方法
トークンは、サーバーで生成される
ユーザーがトークンを要求するとき、ユーザーは自分に関するいくつかの情報をサーバーに持ち込みます
サーバーはその鍵を持って、ユーザーの情報を何らかの暗号化アルゴリズムに基づいて暗号化し、ユーザー用のトークンを生成する。
JWT三部作
jwtのトークは、ヘッダ暗号、ペイロード暗号、署名の3つの部分から構成されています。
ヘッダー
ヘッダーには、次の2つのメッセージが含まれます。
1. 暗号化アルゴリズムの宣言
2. タイプを宣言する
こんな感じで。
"alg": "HS256 "です。
"typ "です。"JWT"
}
ペイロード
ユーザー名などの個人情報など、いくつかのカスタム情報を保持します。
注:トークンは平文に復号化できるため、パスワードなどの機密情報は保存しないでください。
署名
サーバーがヘッダーとペイロードをその鍵で暗号化した結果
jwtがデータを改ざんされないことを保証する方法
サーバーはトークンを復号してヘッダー、ペイロード、署名を取得し、独自の鍵を用いてヘッダーとペイロードを暗号化し、暗号化結果と復号した署名が等しいかどうかを確認する。等しければ、データは改竄されていない。等しくない場合は、データは改竄されている
サーバーの鍵は公開されていないので、署名は偽造できないと考えられる、つまり、サーバーが認識するトークンを得るために、他の誰もヘッダーとペイロードを暗号化することはできない
.net webapiのデモ
簡単のために、ここでは認証のみを行い、ログインしたユーザーがすべてのインターフェイスにアクセスできることを意味します。
Starup.csで認証を有効にし、ポリシーをjwtで指定します。
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => ;
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidAudience = "xxx",
ValidIssuer = "xxx",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4")),
};
});
認証ミドルウェアの利用も必要
画像
認証を必要とするインターフェイスやコントローラに、特性[Authorize]を追加します。
また、ログインロジックを実装し、テスト用のGetインターフェイスを用意する必要があります
Controllerのコードは
Authorization;
Mvc;
Mvc; using Microsoft.Extensions.Logging;
Mvc; using Microsoft;
Tokens; using System;
Mvc; using Microsoft;
Tokens; using System.IdentityModel;
Jwt; using System;
Security.Claims;
Text; using System;
Tasks;
Tasks; namespace JwtTest.
Tasks; namespace JwtTest.
[ApiController]
[Route("[controller]/[action]")]
[Authorize]
public class WeatherForecastController : ControllerBase
{
[HttpGet]
public ActionResult Get()
{
return Ok("ok");
}
[HttpPost]
[AllowAnonymous]
public ActionResult Login([FromBody] LoginViewModel loginViewModel)
{
//Verify that the user name and password are correct, if wrong, no subsequent operation
{
//Verify logic is omitted here
}
//if the verification is successful, the code will continue to run to generate the token
//claims is some information about the user, this information will be put in the payload, because the token can be decrypted, so do not put the password in
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, loginViewModel.Name)
};
// specify the key needed to generate the token
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("bc47a26eb9a59406057dddd62d0898f4"));
// Specify the key and algorithm to be used for the digital signature
SigningCredentials credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//generate token
JwtSecurityToken token = new JwtSecurityToken(issuer: "xxx",
audience: "xxx",
claims: claims,
notBefore: DateTime.Now, //token effective time
Now.AddMinutes(5), //token validity time
signingCredentials: credentials);
return Ok(new JwtSecurityTokenHandler().WriteToken(token));
}
}
}
テストを実施するために
ログインせずに直接Getにアクセスすると、401を報告します。
画像
Loginにアクセスすると、トークンが返されます。
Getに正常にアクセスするためには、このトークンを持参する必要がありますが、このトークンを使ってどのようにリクエストを行うのでしょうか?
postmanの力を借りて
Getインターフェースへのパスを入力します。
Authorization typeをBearer Tokenに設定し、生成されたトークンを右側に貼り付けます。
アクセス成功
画像
概要
ここでは、jwtを使ったネット認証の記事を紹介しています。もっと関連するjwtを使った.net認証のコンテンツは、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。
関連
-
.netcoreプロジェクトでIStartupFilterを使用するためのチュートリアル
-
pythonでpillowをインストールする3つの方法
-
.NET 6:.NETのロギングコンポーネントlog4netを使用する。
-
NETガベージコレクション GC診断ツール dotnet-gcmon 使用方法
-
ASP.NET CoreでURLを設定する5つの方法
-
30分でわかるコング経由の.NETゲートウェイ
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
swagger uiをasp.net coreに統合する原理
-
再起動を伴わないNET5の設定変更は自動的に反映される
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
.NET開発サーバー アプリケーション管理ツール
-
Net Core HttpClient処理 レスポンス圧縮の詳細
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
ASP.NET Core Web API チュートリアル プロジェクト構成図
-
.NET 6における暗黙の名前空間参照
-
ASP.NET Coreで複数のサービス実装クラスをインジェクトする方法
-
非同期タスクキャンセルと監視のネット実装
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
-
ajaxでポップアップアラートボックス