-
Notifications
You must be signed in to change notification settings - Fork 0
MS_OpenIDOAuth
-
TOP > インフラストラクチャ > 認証基盤 > クレームベース認証
- OpenID / OAuth / OpenID Connect
- SAML / WS-FED
- STS系ミドルウェア
OpenID / OAuth / OpenID Connect について。
中央集権型でない、分散 ID 認証システムのオープン仕様。 ブラウザベースの認証 API の標準化から始まった。
トークン(クレーム)として、
- OpenID — 紹介状(OpenID Token)を受け取るか?
- OAuth / OpenID Connect — 合鍵(Bearer Token)を受け取るか?
の違いがある。
補足(最初に押さえるべき区別): この 3 つは目的が異なる。 ここを混同すると設計を誤る。
仕様 何をするものか 状態 OpenID Authentication 2.0 認証。分散した URL ベースの ID 廃止(2014 年に OIDC へ) OAuth 2.0 認可。API へのアクセスを委譲する 現役(RFC 6749 → 2.1 へ) OpenID Connect OAuth 2.0 の上に認証を載せた仕様 現役・第一候補 よくある誤りは「OAuth 2.0 で認証する」ことである。 アクセス トークンは「誰であるか」を語らないため、 これを根拠にログインさせると トークン置換攻撃(別アプリ向けのトークンを持ち込まれる)が成立しうる。 認証が必要なら OpenID Connect の ID トークンを使う。 WebAPIの認証 の補足も参照。
| 用語 | 内容 |
|---|---|
| End User | Consumer に対して自分の Identity の認証を要求しようとするユーザ。Consumer に紹介状(OpenID Token)を送る IdP に加入する必要がある |
| User-Agent | End User が所有する Web ブラウザ。特別なプラグインや JavaScript は不要 |
| Consumer | End User が入力した ID を使用し、IdP に対して認証要求する Web サービス。OpenID 2.0 から Relying Party (RP) に名称変更 |
| Identifier | End User が所有する URL。OpenID 2.0 からは XRI という URI を拡張した形式 |
| Claimed Identifier | End User が自分で所有していると主張する、Consumer によってまだ確認されていない Identifier |
| Verified Identifier | Consumer が End User の所有と認めた Identifier |
| User-Supplied Identifier | OpenID 2.0 から。End User によって RP に提示される Identifier |
| Identify Provider (IdP) | Claimed Identifier の暗号化された証明(紹介状)を発行。OpenID 2.0 から OpenID Provider (OP) とも |
- OpenID では、STS 相当が独立しておらず、当該機能が RP と IdP 内に同梱されている。
- OpenID 2.0 から追加された OP 用語: OP Identifier / OP EndPoint URL / OP-Local Identifier
用語に関しては、OpenID と ≒。
| 用語 | 内容 |
|---|---|
| Resource Owner(OAuth 1.0 では User) | Client にアクセス権限の付与を行うユーザ自身 |
| User-Agent | End User が所有する Web ブラウザ |
| OAuth Client(OAuth 1.0 では OAuth Consumer) | OAuth Server が提供する API を利用する側のサービス |
| OAuth Server(OAuth 1.0 では OAuth Service Provider) | OAuth をサポートした API を提供しているサービス |
OAuth 2.0 から、OAuth Service Provider は更に以下の 2 つに分類される。
- Authorization Server — 認証・認可のサーバー機能(Access Token の発行)
- Resource Server — Access Token を受けてリソースアクセスを提供する
- 認証に関しては、OpenID Authentication 2.0 の置き換えであるため、
OpenID Authentication 2.0 の用語を使用する。 - ただし、実装に関しては、OAuth 2.0 の拡張なので、OAuth 2.0 の用語も使用する。
金融グレードのセキュリティ プロファイル。Financial API (FAPI)(MS_FAPI.md)
OpenID 財団の登録商標。代表的な使用例として、
- OpenID Authentication 2.0
- OpenID Connect
- OpenID Foundation
などがある。
補足(最新化): OpenID Authentication 2.0 は 2014 年に非推奨となり、 主要プロバイダ(Google、Yahoo 等)はサポートを終了した。 「URL を ID にする」という発想は普及せず、 OpenID Connect が事実上の後継である。 現在「OpenID」と言えば OpenID Connect を指すと考えてよい。
グラント種別(フロー)は用途で選ぶ。
| グラント種別 | 用途 | 現在の評価 |
|---|---|---|
| Authorization Code | Web アプリ、SPA、モバイル | 標準。PKCE 必須 |
| Client Credentials | サーバ間(ユーザ不在) | 現役 |
| Refresh Token | アクセス トークンの更新 | 現役 |
| Device Authorization | TV・CLI など入力が貧弱な端末 | 現役(RFC 8628) |
| Implicit | 旧・SPA 向け | 非推奨 → OAuth 2.1 で廃止 |
| Resource Owner Password Credentials (ROPC) | ID/パスワードを直接渡す | 非推奨 → OAuth 2.1 で廃止 |
補足(最新化): OAuth 2.0 は Security BCP(RFC 9700) と OAuth 2.1(策定中)で整理された。 要点は次のとおり。
- Implicit グラントの廃止
アクセス トークンが URL フラグメントに乗り、履歴やログに残るため。 SPA も Authorization Code + PKCE を使う。- ROPC の廃止
アプリがユーザのパスワードを扱う設計自体が誤り。多要素認証もできない。- PKCE を全クライアントで必須化
元は公開クライアント(ネイティブ アプリ)向けだったが、 認可コード横取り対策として一律必須になった。- redirect_uri の完全一致
前方一致やワイルドカードはオープン リダイレクトの温床。ASP.NET Web API に残る Implicit 前提の記述は、 この観点で読み替えること。
OAuth 2.0 に、認証のための ID トークン(JWT 形式)と UserInfo エンドポイントを追加したもの。
| 要素 | 内容 |
|---|---|
scope=openid |
これを含めると OIDC として振る舞う |
| ID トークン | 認証結果。iss / sub / aud / exp / nonce を含む |
| UserInfo エンドポイント | 追加のユーザ属性を取得する |
| Discovery |
/.well-known/openid-configuration で設定を自動取得 |
jwks_uri |
署名検証用の公開鍵(JWK Set)を公開 |
補足(検証の要点): ID トークンの検証では、 JWT の共通項目に加えて
nonceの確認が必要である。 認可要求時に生成したnonceが ID トークンに含まれることを確かめることで、 リプレイを防ぐ。stateは CSRF 対策、nonceはトークンのリプレイ対策で、役割が異なる。
- STS 系ミドルウェアの選択は STS系ミドルウェア を参照。
- ASP.NET での実装は
ASP.NET Identity、
ASP.NET IdentityのOAuth2によるSTS実装(
MS_ASPNETIdentitySTSOAuth2.md)を参照。
補足: ASP.NET Core で RP(クライアント) を実装するなら
Microsoft.AspNetCore.Authentication.OpenIdConnectを使う。 Discovery・鍵の自動取得・state/nonceの管理まで面倒を見てくれるので、 自前でフローを組まないこと。builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie() .AddOpenIdConnect(options => { options.Authority = "https://login.microsoftonline.com/{tenant}/v2.0"; options.ClientId = "..."; options.ResponseType = "code"; // Authorization Code options.UsePkce = true; options.SaveTokens = true; });
- クレームベース認証
- SAML / WS-FED
- JWT
- トークン
- PPID
- WebAPIの認証
- RFC 6749 - The OAuth 2.0 Authorization Framework
- RFC 9700 - Best Current Practice for OAuth 2.0 Security
- OpenID Connect Core 1.0(日本語訳)
- Differences Between OAuth 1 and 2 - OAuth 2.0 Servers
Tags: IT国際標準, 認証基盤, クレームベース認証, クラウド
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。