TodoApi - ASP.NET コア Blazor WASM、最小限の API、認証を使用した Todo アプリケーション

(Todo application with ASP.NET Core Blazor WASM, Minimal APIs and Authentication )

Created at: 2021-05-04 23:37:57
Language: C#

ASP.NET コアを使用したTodoアプリケーション

ティッカー

これは、次の機能を備えたTodoアプリケーションです。

  • Todo.Web - ASP.NET Core でホストされる Blazor WASM フロントエンド アプリケーション
  • TodoApi - 最小限の API を使用する ASP.NET コア REST API バックエンド

画像

それはショーケース:

  • ブレイザー ウェブアセンブリ
  • 最小限の API
  • データアクセスのためのEntityFrameworkとSQLiteの使用
  • オープンAPI
  • ASP.NET コアアイデンティティによるユーザー管理
  • クッキー認証
  • JWT 認証
  • YARP の IHttpForwarder を使用したフロントエンドアプリケーションサーバーからの要求のプロキシ
  • レート制限
  • REST API の統合テストの作成

前提 条件

。網

  1. .NET 7 をインストールする

データベース

  1. dotnet-ef ツールをインストールします。
    dotnet tool install dotnet-ef -g
  2. フォルダに移動します。
    TodoApi
    1. 実行して、ローカル データベース フォルダーを作成します。
      mkdir .db
    2. 実行してデータベースを作成します。
      dotnet ef database update
  3. dotnet-ef の詳細情報

ティッカー

  1. JWT 生成のキーを初期化するには、TodoApi フォルダーを実行します。

    dotnet user-jwts

    dotnet user-jwts create
    

アプリケーションの実行

アプリケーションを実行するには、Todo.Web/ServerTodoApi の両方を実行します。以下は、両方のアプリケーションを実行するさまざまな方法です。

  • Visual Studio - ソリューションを右クリックして [プロパティ] を選択して、複数のスタートアップ プロジェクトをセットアップします。スタートアップ プロジェクトとして [と] を選択します。

    TodoApi
    Todo.Web.Server

    画像
  • Visual Studio Code - Todo.Web.ServerTodoApi で実行される 2 つのターミナル ウィンドウを開きます。

    dotnet watch run -lp https
    

    これにより、プロファイルを使用して両方のアプリケーションが実行されます。

    https

  • Tye - 次のコマンドを使用してグローバル ツールをインストールします。

    dotnet tool install --global Microsoft.Tye --version 0.11.0-alpha.22111.1
    

    リポジトリのルートで実行し、tye ダッシュボード (通常は http://localhost:8000) に移動して、両方のアプリケーションが実行されていることを確認します。

    tye run

  • Docker Compose - ターミナルを開き、このプロジェクトのルート フォルダーに移動して、次のコマンドを実行します。

    1. dotnet 発行から直接 Docker イメージをビルドします。

      TodoApi

      dotnet publish ./TodoApi/TodoApi.csproj --os linux --arch x64 /t:PublishContainer -c Release
      
    2. dotnet 発行から直接 Docker イメージをビルドします。

      Todo.Web.Server

      dotnet publish ./Todo.Web/Server/Todo.Web.Server.csproj --os linux --arch x64 /t:PublishContainer -c Release --self-contained true
      
    3. 証明書を生成し、ローカルマシンを構成して、docker composeを使用してhttpsサポートを使用してアプリを起動できるようにします。

      Linux コンテナーを使用するウィンドウ

      set PASSWORD YourPasswordHere
      dotnet dev-certs https -ep ${HOME}/.aspnet/https/todoapps.pfx -p $PASSWORD --trust
      

      macOS または Linux

      export PASSWORD=YourPasswordHere
      dotnet dev-certs https -ep ~/.aspnet/https/todoapps.pfx -p $PASSWORD --trust
      
    4. ファイル内の以下の変数を、https 証明書とパスワードと一致するように変更します。

      docker-compose.yml

      • ASPNETCORE_Kestrel__Certificates__Default__Password
      • ASPNETCORE_Kestrel__Certificates__Default__Path
    5. 実行して、アプリtodo-apiとtodo-web-serverに加えて、jaegerとprometheusをスピンアップします。

      docker-compose up -d

    6. Todo Web アプリ https://localhost:5003 に移動します。

随意

API スタンドアロンの使用

Todo REST API はスタンドアロンでも実行できます。TodoApi プロジェクトを実行し、Swagger UI (または任意のクライアント) を使用してさまざまなエンドポイントに要求を行うことができます。

画像

リクエストを実行する前に、ユーザーを作成して認証トークンを取得する必要があります。

  1. 新しいユーザーを作成するには、アプリケーションを実行し、JSON ペイロードをエンドポイントに POST します。

    /users

    {
      "username": "myuser",
      "password": "<put a password here>"
    }
  2. 上記のユーザーのトークンを取得するには、上記で指定したのと同じユーザー名でJWTトークンを作成します。

    dotnet user-jwts

    dotnet user-jwts create -n myuser
    
  3. このトークンを使用して、todo エンドポイントに対して認証された要求を行うことができる必要があります。

  4. ユーザー jwt の詳細

ソーシャル認証

ユーザー名とパスワードに加えて、ソーシャル認証プロバイダーは、この todo アプリケーションと連携するように構成できます。デフォルト Github、Google、およびMicrosoftアカウントをサポートしています。

これらの各プロバイダーを設定する手順については、次の場所を参照してください。

クライアント ID とクライアント シークレットを取得したら、これらのプロバイダーの構成を次のスキーマで追加する必要があります。

{
    "Authentication": {
        "Schemes": {
            "<scheme>": {
                "ClientId": "xxx",
                "ClientSecret": "xxxx"
            }
        }
    }
}

または環境変数を使用する:

Authentication__Schemes__<scheme>__ClientId=xxx
Authentication__Schemes__<scheme>__ClientSecret=xxx

または、ユーザー シークレットを使用します。

dotnet user-secrets set Authentication:Schemes:<scheme>:ClientId xxx
dotnet user-secrets set Authentication:Schemes:<scheme>:ClientSecret xxx

他のプロバイダーはここにあります。 これらは、認証拡張機能にも追加する必要があります。

注: クライアント シークレットを構成に保存しないでください。

外部認証サーバ

ソーシャル認証と同様に、このアプリケーションは外部オープンID接続(OIDC)サーバーもサポートしています。外部認証 ソーシャル認証プロバイダーのように扱われますが、TodoAPIで使用できるアクセストークンも生成されます。これ Todo.Web.Server アプリケーションのソーシャル プロバイダーと追加の認証スキームのように構成する必要があります。 認証サーバーによって発行された JWT トークンを受け入れるように TodoAPI で構成する必要があります。

フローは次のようになります。

画像

認証を構成する方法を次に示します。

{
  "Authentication": {
    "Schemes": {
      "<scheme>": {
      }
    }
  }
}

注: クライアント シークレットを構成に保存しないでください。

認証0

このサンプルでは、Auth0 が OIDC サーバーとして構成されています。次のスキーマで構成できます。

{
  "Authentication": {
    "Schemes": {
      "Auth0": {
        "Audience": "<audience>",
        "Domain": "<domain>",
        "ClientId": "<client id>",
        "ClientSecret": "<client secret>"
      }
    }
  }
}

TodoAPI を構成する例を次に示します。

{
  "Authentication": {
    "Schemes": {
      "Auth0": {
        "ValidAudiences": [ "<your audience here>" ],
        "Authority": "<your authority here>"
      }
    }
  }
}

Auth0 .NET SDK の詳細については、こちらを参照してください

OpenTelemetry

TodoApi は OpenTelemetryを使用してログ、メトリクス、スパンを収集します。

収集されたテレメトリを表示する場合は、次の手順に従います。

メトリック

  1. Dockerでプロメテウスを実行する:
docker run -d -p 9090:9090 --name prometheus -v $PWD/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
  1. Open Prometheus in your browser
  2. Query the collected metrics

Spans

  1. Configure environment variable with the right endpoint URL to enable below , in the file
    OTEL_EXPORTER_OTLP_ENDPOINT
    .AddOtlpExporter
    builder.Services.AddOpenTelemetryTracing
    TodoApi/OpenTelemetryExtensions.cs
  2. Run Jaeger with Docker:
docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 -e COLLECTOR_OTLP_ENABLED=true -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 16686:16686 -p 4317:4317 -p 4318:4318 -p 14250:14250 -p 14268:14268 -p 14269:14269 -p 9411:9411 jaegertracing/all-in-one:latest
  1. Open Jaeger in your browser
  2. View the collected spans

ログ

このアプリは、この目的のためにSerilogを使用しています

structured logging

Serilogを設定するには、SerilogExtensionsクラスを呼び出し、適切なオプションを使用してセクションを追加する必要があります

AddSerilog
Serilog

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    }
  }

ログの収集と検索には、本番環境に基づいて2つの方法があります。

optional
your needs

  • Seq (商用利用では無料ではありません)
  • エラスティックサーチとキバナ(無料)

シークエンス

seqを使用するには、appsettings.jsonのセクションの設定値で有効にする必要があります。

SeqUrl
Serilog

  "Serilog": {
     ...
    "SeqUrl": "http://localhost:5341",
     ...
  },

また、docker-composeファイルでseqサーバーを実行する必要がありますが、seqhttp://localhost:8081 で利用可能になり、そこにログが表示されます。

エラスティックサーチとキバナ

エラスティックサーチとキバナを使用するには、appsettings.json のセクションで設定値を使用して有効にする必要があります。

ElasticSearchUrl
Serilog

  "Serilog": {
     ...
    "ElasticSearchUrl": "http://localhost:9200",
     ...
  }

また、ドッカー作成ファイルでElasticsearchKibanaを実行する必要がありますが、kibana url http://localhost:5601 でログを確認できます。 インデックス名 。

todoapi