• システム開発に関わる内容をざっくりと書いていく

ざっくりKeyCloakを.netの認証に組み込む例

KeyCloakは、オープンソースの認証・認可プラットフォームで、シングルサインオン(SSO)やOpenID Connect、OAuth2.0のプロトコルに対応している。ここでは、KeyCloakを**.NET APIサーバ**の認証サーバとして組み込む方法を簡単に説明する。

KeyCloakのメリット

KeyCloakを利用することで、SSO(シングルサインオン)が容易に実現でき、複数のアプリケーションやサービス間で一度のログインでアクセスを許可できる。また、OAuth2.0やOpenID Connectに対応しており、セキュアな認証を手軽に導入できる。


KeyCloakを.NET APIサーバに組み込む手順

  1. KeyCloakを準備する
    • KeyCloakはDockerで簡単にセットアップできる。まずはKeyCloakをインストールし、必要な設定を行う。
    • 必要に応じてRealm(認証ドメイン)、クライアント(アプリケーション)、ユーザーを設定する。
    docker run -d -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak
  2. KeyCloakで認証を行い、JWTトークンを取得する
    • ユーザーがログインすると、KeyCloakが**JWT(JSON Web Token)**を発行する。これは、ユーザーの認証状態や権限情報を含むトークンで、後続のリクエストで使用される。
    • ユーザーがログインすると、以下のエンドポイントに対してリクエストを送信してJWTを取得する。
    http POST /auth/realms/{realm}/protocol/openid-connect/token
    • リクエストには、client_idclient_secretusernamepasswordなどの情報を送る。
    bash curl -X POST "http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password&client_id=myclient&client_secret=mysecret&username=myuser&password=mypassword"
    • レスポンスとして、以下のようなJWTトークンが返ってくる:
    json { "access_token": "eyJhbGciOiJIUzI1NiIsIn...", "expires_in": 300, "token_type": "Bearer", "scope": "openid profile" }
  3. AuthorizationヘッダーにJWTを添付してAPIサーバにリクエストを送る
    • 取得したJWTを使って、APIサーバに対するリクエストのAuthorizationヘッダーに添付する。これにより、APIサーバはリクエストが認証されたものかどうかを判断する。
    http GET /api/secure-data Authorization: Bearer eyJhbGciOiJIUzI1NiIsIn...
  4. APIサーバ側でJWTから発行元を取得
    • APIサーバでは、クライアントから送られてきたJWTトークンを解析し、発行元(issuer)を取得する。
    csharp var handler = new JwtSecurityTokenHandler(); var jwtToken = handler.ReadJwtToken(accessToken); var issuer = jwtToken.Issuer; // 発行元の取得
  5. 発行元から公開鍵を取得
    • 発行元(KeyCloakサーバ)から公開鍵を取得して、JWTトークンを検証する。KeyCloakの公開鍵は、OpenID Connectの仕様に基づいて提供されるJWKSエンドポイントから取得できる。
    http GET /auth/realms/{realm}/protocol/openid-connect/certs
  6. 発行元と公開鍵でJWTを検証して認証
    • 取得した公開鍵を使って、JWTトークンが改ざんされていないか、正しい発行元からのものであるかを検証する。認証が成功すれば、ユーザーはAPIサーバのリソースにアクセスできる。
    csharp var validationParameters = new TokenValidationParameters { ValidIssuer = "http://localhost:8080/auth/realms/myrealm", IssuerSigningKey = new SymmetricSecurityKey(publicKey) }; var principal = handler.ValidateToken(accessToken, validationParameters, out var validatedToken);

OpenID Connectのフローのまとめ

  1. KeyCloakでユーザー認証し、JWTトークンを発行。
  2. JWTトークンをAPIサーバに渡し、リクエストを認証。
  3. APIサーバがJWTを検証し、発行元や公開鍵を確認。
  4. JWTトークンが正当であれば、APIサーバがリクエストを認証して処理を行う。

今後の拡張

  • SSO(シングルサインオン)の実現
    KeyCloakを使うことで、複数のアプリケーション間でシングルサインオン(SSO)を実現できる。これにより、ユーザーは一度のログインで、複数のアプリやサービスにアクセスできる。

まとめ

KeyCloakを.NET APIに組み込むことで、OAuth2.0やOpenID Connectを利用したセキュアな認証・認可が簡単に導入できる。特にSSOの実現やJWTを使ったトークンベースの認証は、複数のアプリケーションで共通の認証基盤を構築するために非常に有用である。KeyCloakの設定とAPIサーバの組み込みは比較的シンプルな手順であり、セキュリティを向上させるだけでなく、開発の効率化にも貢献する。