Skip to content

MS_OpenIDOAuth

nishi_74322014 edited this page Aug 4, 2026 · 1 revision

OpenID / OAuth / OpenID Connect

概要

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の認証 の補足も参照。

用語

OpenID

用語 内容
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

OAuth

用語に関しては、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 Connect

  • 認証に関しては、OpenID Authentication 2.0 の置き換えであるため、
    OpenID Authentication 2.0 の用語を使用する。
  • ただし、実装に関しては、OAuth 2.0 の拡張なので、OAuth 2.0 の用語も使用する。

Financial API (FAPI)

金融グレードのセキュリティ プロファイル。Financial API (FAPI)(MS_FAPI.md

詳細

OpenID

OpenID 財団の登録商標。代表的な使用例として、

  • OpenID Authentication 2.0
  • OpenID Connect
  • OpenID Foundation

などがある。

補足(最新化): OpenID Authentication 2.0 は 2014 年に非推奨となり、 主要プロバイダ(Google、Yahoo 等)はサポートを終了した。 「URL を ID にする」という発想は普及せず、 OpenID Connect が事実上の後継である。 現在「OpenID」と言えば OpenID Connect を指すと考えてよい。

OAuth 2.0

グラント種別(フロー)は用途で選ぶ。

グラント種別 用途 現在の評価
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 前提の記述は、 この観点で読み替えること。

OpenID Connect

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;
});

参考


Tags: IT国際標準, 認証基盤, クレームベース認証, クラウド

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally