ASP.NET Core

Kestrelで証明書ストアの証明書を指定してHTTPSを構成

appsettings.jsonに書くだけで構成できた。 learn.microsoft.com ちなみにASP.NET Core 2.1でも使えた。 { "Kestrel": { "Endpoints": { "Http": { "Url": "http://*:8080" }, "Https": { "Url": "https://*:8081", "Certificate": { "Subject": "証明書のサ…

アクセストークンを URLクエリパラメーターでも渡せるようにする

アクセストークンを Authorize ヘッダーではなく、URL クエリパラメーターで渡したい。 認証では Microsoft.AspNetCore.Authentication.JwtBearer を使っていて、何か方法があるのではと調べてみたら、案外簡単に実現できた。 var builder = WebApplication.…

DI コンテナに登録済みのサービスを装飾する

調査目的で、ASP.NET Core MVC とかが DI コンテナに登録したサービスに処理を挟み込みたいことがある。そんな時は、下記のようなクラスと拡張メソッドを用意。 internal class Decorator<TService> { public TService Instance { get; set; } public Decorator(TServi</tservice>…

ASP.NET Core の CORS で許可するオリジンを動的に決定する

例えば REST API を提供していて、ブラウザ上から JavaScript で呼び出せるように、CORS 対応したい。でも、許可するのは登録してもらったオリジンだけにしたい。そんなとき。 Microsoft.AspNetCore.Cors.Infrastructure.ICorsPolicyProvider を実装したクラ…

IdentityServer4 でアクセストークンの署名と検証に証明書を使う方法

証明書はあらかじめ用意しておく。 openssl なり何なり使って、自己署名証明書を作成するなら↓みたいな感じ。 #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" PRIVATE_PEM=$DIR/private.pem PUBLIC_PEM=$DIR/public.pem P…

ASP.NET Core MVC で軽量 DDD

1人でフロントエンドとバックエンドの両方を開発していたら、DDD と軽量 DDD の区別が付かないような状況になってきた。個人的には軽量 DDD 上等。ただ、アーキテクチャに関して言えば、クリーンアーキテクチャはやり過ぎ感あるので、シンプルなレイヤーアー…

Kestrel デフォルトのエンドポイントのままセルフホストしてハマった

Kestrel のエンドポイントは、デフォルトだと http://localhost:5000;https://localhost:5001。デフォルトのままでいいやと、Windows Server 2016 の VM で Windows サービスとしてセルフホストしたら、VM 外からアクセスできなくてハマった。 VM 内から htt…

ASP.NET Core アプリを Windows サービスでホストする場合はカレントディレクトリの変更を忘れてはいけない

大人の事情で、ASP.NET Core アプリを Microsoft.AspNetCore.Hosting.WindowsServices を使って Windows サービスでホストしていたんだけど、カレントディレクトリの変更は不要と思ってコードを省略したら、ヒドイ目にあった。 public class Program { publi…

ASP.NET Core で gRPC と MVC の両方に対応できるか試した

はじめに ASP.NET Core で gRPC と gRPC-Web を 1 つのアプリでホストできることは確認した。 tnakamura.hatenablog.com gRPC と MVC はどうだろうか?試してみた。 gRPC サーバーに Web API を追加 GreeterController using Microsoft.AspNetCore.Mvc; name…

ASP.NET Core で gRPC と gRPC-Web の両方に対応できるか試した

はじめに Grpc.AspNetCore.Web を使えば、プロキシを別に立てる必要なく、ASP.NET Core のパイプラインに gRPC-Web を組み込める。 gRPC-Web を組み込んだ場合に、gRPC-Web だけではなく通常の gRPC も使えるのか、気になったので試してみた。 gRPC サーバー…

IdentityServer4 メモ

IdentityServer4 でいろいろ試したときのメモ。当時のバージョンは 4.1.1。 www.nuget.org IdentityServer4 の「Interactive Applications with ASP.NET Core」で ProfileService が呼ばれるタイミング 以下の順番で呼ばれていた Account/Login ProfileServi…

ASP.NET Core Identity で主キーに値オブジェクトを使う方法

はじめに ドメイン駆動設計のパターンの一つである値オブジェクトを実践するようになってから、ASP.NET Core Identity でユーザーの ID の型 が string なことに恐怖を感じるようになった。ユーザー ID を表す値オブジェクトじゃないと安心してコード書けな…

Swashbuckle.AspNetCore.Cli と OpenAPI Generator を使って Web API のクライアントを生成する

はじめに Swashbuckle.AspNetCore を使うことで、ASP.NET Core MVC で実装した Web API に Swagger UI を組み込める。 docs.microsoft.com Web API の動作確認をする程度ならこれで十分だけど、せっかく Swagger/OpenAPI を使うなら、クライアントのソースコ…

https にリダイレクトすると Authorization ヘッダーが失われる

はじめに HttpClient を使って http で Authorization ヘッダー付きのリクエストを送信し、https にリダイレクトされると、https のリクエストには Authorization ヘッダーが付かない。 以下、実験コード。 Web API HTTP リクエストのヘッダーをログに出力し…

認証スキームの異なる複数の JWT Bearer 認証を構成してみた

はじめに ASP.NET Core で JWT Bearer 認証を使うときに Startup.ConfigureServices で呼び出す AddJwtBearer は、 任意の authenticationScheme を指定できる。 となると、authenticationScheme さえ重複しなければ複数回呼び出しても問題ない、はず。 気に…

ProxyKit を使ってリバースプロキシを実装する

はじめに ASP.NET Core で実装した Web API の前段にリバースプロキシを置く必要がありそう。 しかも、そのリバースプロキシはデータベースにある情報を使ってリクエストの振り分けを行わなければならないため、 プログラマブルなリバースプロキシが求められ…

.NET Framework 4.8 で動いている Web API を .NET Core 3.1 で動いている IdentityServer4 で保護する

はじめに 大人の事情によって .NET Framework 4.8 で動かさざるをえない ASP.NET Core 2.2 製 Web API を、OAuth2.0 か OpenID Connect に対応させる必要があり、IdentityServer4 を使う予定でいた。 その IdentityServer4 は 5/1 時点で v3.1.3 が最新。も…

コードファースト ASP.NET Core gRPC でのインターセプター利用

はじめに protobuf-net.Grpc を使ってコードファーストに ASP.NET Core gRPC サービスを実装する場合でも、 ASP.NET Core の JWT Bearer 認証ミドルウェアを使うことができそうだ、 というところまで前回確認できた。 tnakamura.hatenablog.com Authorizatio…

コードファースト ASP.NET Core gRPC での JWT Bearer 認証の利用

はじめに ASP.NET Core gRPC は ASP.NET Core のミドルウェアをサポートしているけど、 protobuf-net.Grpc を使ってコードファーストで実装する場合でも、 JWT Bearer 認証が使えるか試してみた。 Shared プロジェクトを作成 毎度おなじみの、 クライアント…

コードファースト ASP.NET Core gRPC でのヘッダーの利用

はじめに WCF では OperationContext の IncomingMessageHeaders と OutgoingMessageHeaders を使って、 カスタムヘッダーをクライアントから送ったり、サーバーから返したりできた。 tnakamura.hatenablog.com gRPC には Metadata という同じような機能があ…

ASP.NET Core MVC のモデルバインドで null が明示的に渡されたものかどうか判断したい

はじめに ASP.NET Core MVC のモデルバインドで、 JSON をバインドした後にモデルのプロパティの値が null だったとして、 デフォルト値の null なのか、 それともクライアント側から明示的に null を渡されたのか判断したい。 そして、null を設定できるプ…

コードファースト ASP.NET Core gRPC ストリーミング編

はじめに 先日、WCF から gRPC に移行するときの手段として、.proto ファイルを書くのではなく、protobuf-net.Grpc を使って C# のコードから gRPC のクライアントとサーバーを動的に生成する方法を紹介した。コードファースト ASP.NET Core gRPC と命名。 t…

コードファースト ASP.NET Core gRPC

この記事は、C# その2 Advent Calendar 2019 の二日目の記事です qiita.com はじめに コードファーストで開発したい protobuf-net.Grpc コードファースト ASP.NET Core gRPC をやってみる .NET Core ライブラリ作成 NuGet パッケージ追加 データコントラクト…

ASP.NET Core アプリを Windows コンテナのプロセス分離モードで動かす実験

はじめに ASP.NET Core アプリをコンテナ化したいけど、 .NET Framework の資産を捨てられないので、 ランタイムに .NET Framework を選択し、 Docker + Windows コンテナで行くことに。 手始めに、ASP.NET Core アプリをコンテナ化して、 Windows コンテナ…

HTTP.sys でポート共有

Microsoft Docs によると、HTTP.sys はポート共有をサポートしていると書いてある。 docs.microsoft.com ただ肝心のやり方が載ってない。 見つけられないだけかも? だけど推測はできる。 おそらく、重複しない URL プレフィックスを指定してやればいいんだ…

再戦 ASP.NET Core MVC vs. WCF

はじめに 以前 ASP.NET Core MVC と WCF のベンチマークを比較したことがあって、 そのときは WCF の方がかなり速いなぁ、という結果だった。 ASP.NET Core MVC が思いのほか遅いのが気になったけど、それに関しては当時調べず。 tnakamura.hatenablog.com …

ASP.NET Core のホステッドサービスとして WCF サービスを動かす

ASP.NET Core には HostedService という機能があって、 バックグラウンドタスクなんかを実装するのに使えたりする。 docs.microsoft.com 上のドキュメントでは、そのものずばりバックグラウンドタスクを実装しているわけだけど、 WCF サービスも実行できる…

GraphQL.NET の DataLoader

GraphQL でネストしたデータを取得するクエリを発行するとき、 N+1 問題を回避するために、 ネストしたデータの先読み込みか遅延読み込みを行う必要がある。 先読み込みの場合は、クエリのリゾルバ内で Entity Framework Core の Include を使って実装できる…

GraphQL.NET でのページネーション

GraphQL でコレクションデータの取得やページネーションを実現する場合、 Relay 由来の Connection や Edge といったインタフェースを定義するのが定石になっているみたい。 GraphQL.NET はそれらをサポートしていて、ConnectionType や EdgeType といった型…

HTTP.sys でホストした Web API で Windows 認証と JWT Bearer 認証を共存させる

ASP.NET Core MVC で実装した Web API を HTTP.sys でホストすることで、利用に Windows 認証が必要な Web API を実現できた。 tnakamura.hatenablog.com これでひと段落と思いきや、JWT Bearer 認証もサポートする必要が出てきたので、HTTP.sys でホストし…