1. ホーム
  2. Web プログラミング
  3. ASP.NET
  4. 実用的なヒント

認証プロセスの記録にjwtを使用したネット

2022-01-14 07:15:42

認証・オーソライズとは

例を挙げる

パスを持っている人しか入れない地域があり、見知らぬ人が直接入ろうとすると警備員に止められ、まずパスを申請してからでないと入れないとする。

相似形認証・認証システム

もしある人が私の秘密のインターフェースの一つにアクセスしたい場合、まずあなたが誰であるかを知る必要があります。あなたが誰であるかを把握する過程が認証であり、もし私があなたが誰であるかを把握できなければ、あなたは見知らぬ人であり、認証は失敗する。

あなたが誰だかわからないなら、あなたは見知らぬ人で認証は失敗です。認証によってあなたが誰であるかがわかるだけなので、認証によって私の機密のインターフェイスにアクセスできるとは限らないが、あなたが私のインターフェイスにアクセスできるかどうかはわからないので、認証は必要である。

認証とは、認証に基づいてインターフェースへのアクセス権があるかどうかを確認し、許可された場合のみアクセスを許可することです。

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の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。