「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
ユースケースに対応するため、
多様な環境をサポートできる。
ざっくり、リクエスト→認証・認可→ユーザ情報を取得。
+--------+ +--------+ | | | | | |---------(1) AuthN Request-------->| | | | | | | | +--------+ | | | | | | | | | | | End- |<--(2) AuthN & AuthZ-->| | | | | User | | | | RP | | | | OP | | | +--------+ | | | | | | | |<--------(3) AuthN Response--------| | | | | | | |---------(4) UserInfo Request----->| | | | | | | |<--------(5) UserInfo Response-----| | | | | | +--------+ +--------+
OAuth 2.0との違いは、認証拡張機能が追加実装された点にある。
OAuth 2.0に認証結果とプロフィールの受渡し機能を追加。
特定のコンテキストにおいてどのフローを選択すればよいかの指針
| # | Property | Authorization Code Flow | Implicit Flow | Hybrid Flow | 
| 1 | 全てのトークンは Authorization Endpoint から返却される | no | yes | no | 
| 2 | 全てのトークンは Token Endpoint から返却される | yes | no | no | 
| 3 | トークンが User Agent に渡らない | yes | no | no | 
| 4 | Client 認証が可能である | yes | no | yes | 
| 5 | Refresh Token を利用できる | yes | no | yes | 
| 6 | 通信が1往復だけである | no | yes | no | 
| 7 | 殆どの通信がサーバ間通信である | yes | no | varies | 
どのフローを利用するかを決定する response_type 値とフローの対応
| # | response_type value | Flow | 
| 1 | code | Authorization Code Flow | 
| 2 | id_token | Implicit Flow | 
| 3 | id_token token | Implicit Flow | 
| 4 | code id_token | Hybrid Flow | 
| 5 | code token | Hybrid Flow | 
| 6 | code id_token token | Hybrid Flow | 
以下との通信は、TLS を用いなければならない (MUST).
| # | Header Name | Header Value | 
| 1 | Cache-Control | no-store | 
| 21 | Pragma | no-cache | 
OAuth 2.0 からのステップ上の拡張部分は無い。
ただし、
朱書きは、OAuth 2.0 からのステップ上の変更・拡張部分。
The Authorization Code Flow goes through the following steps.
朱書きは、OAuth 2.0 からのステップ上の変更・拡張部分。
The Implicit Flow follows the following steps:
ID トークンと同時に、アクセストークンや認可コードが一緒に発行される。
朱書きは、Authorization Code Flowとの差異。
The Hybrid Flow follows the following steps:
http://openid.net/specs/openid-connect-discovery-1_0.html
メールアドレスやURLからユーザが利用しているIdp(OP)を特定する方法
http://openid.net/specs/openid-connect-registration-1_0.html
(Discoveryで発見したIdp(OP)に、)動的なRP登録を行う方法
追加された仕様についてまとめる。
Client Registrationの際、Tokenエンドポイントにアクセスする際に追加のクライアント認証を登録可能。
(パラメタ名は明記されていないが、ClientAuthentication?的な名称でconfigすると思われる。)
以下のケースでTokenエンドポイントでの認証を行わない場合。
http://openid.net/specs/openid-connect-session-1_0.html
Idp(OP)上でユーザーがログアウトしたときにRP側から検知する方法など、セッション管理の方法
 {
  "userinfo":
   {
    "given_name": {"essential": true},
    "nickname": null,
    "email": {"essential": true},
    "email_verified": {"essential": true},
    "picture": null,
    "http://example.info/claims/groups": null
   },
  "id_token":
   {
    "auth_time": {"essential": true},
    "acr": {"values": ["urn:mace:incommon:iap:silver"] }
   }
 }クライアントアプリケーションは、認証コンテキストクラスを使用して、
ユーザー認証時に満たして欲しい認証コンテキストクラスを指定する。
Authentication Context Class Reference(ACR)識別子。
arcクレームを
要求できる。
WebアプリケーションのClientに当該フローを実装する場合の実装ガイド。
OAuth 2.0 Authorization Code Grantを拡張
OAuth 2.0 Implicit Grantを拡張
WIF Extension for OAuthは古い?
Microsoft.Owin.Security.OpenIdConnect?
STEP 0 は事前準備なので、STEP 1 からが実際の認証・認可のシーケンス。
https://・・・Idp(OP)のAuthorization code取得用のURL・・・?
    response_type=code+id_token
    &client_id={client_id}
    &redirect_uri=・・・RPのURL・・・
    &state=CSRF対策のランダム文字列
    &scope=openid+profile
    &nonce=リプレイアタック対策のランダム文字列| # | パラメタ | 必須 | 説明 | 
| 1 | response_type | ○ | 「code」と「id_token」を指定 | 
| 2 | client_id | ○ | 事前に準備したclient_idの値を指定 | 
| 3 | redirect_uri | ○ | アプリケーションID登録時のコールバックURLに入力したURLを指定 | 
| 4 | state | CSRF対策のランダム文字列を指定 | |
| 5 | scope | ○ | ・openid:ユーザー識別子を取得(必須) ・profile:姓名・生年・性別が取得 ・email:メールアドレスと確認済みフラグを取得 ・address:ユーザー登録住所情報が取得  | 
| 6 | nonce | id_tokenを取得する際は必須 | リプレイアタック対策のランダム文字列を指定 | 
| 7 | display | ユーザのUIを選択: ・page(PC用UI、デフォルト値) ・touch(スマートフォン用UI) ・wap(フィーチャーフォン用UI) ・inapp(ネイティブアプリ用UI)~  | |
| 8 | その他、Idp(OP)独自パラメタ | - | 
http://・・・RPのURL・・・?code=xxxxxxxx&state=CSRF対策のランダム文字列
| # | パラメタ | 説明 | 
| 1 | code | ”code=xxxxxxxx”を取得する。 | 
| 2 | state | ”state=CSRF対策のランダム文字列”が、一致していることを確認する。 | 
| # | 部分 | 説明 | 
| 1 | Header | Authorization: Basic {basicAuth} | 
| 2 | URL | https://・・・Idp(OP)のAccess Token、ID Token取得用のURL・・・?grant_type=authorization_code&code=・・・&redirect_uri=・・・" | 
| # | パラメタ | 必須 | 説明 | 
| 1 | {basicAuth} | ○ | 基本認証を使用したクライアント認証のため、 アプリケーションID(client_id)、シークレット(client_secret)を":"区切りで結合しBase64文字列化  | 
| 2 | grant_type | ○ | authorization_code という固定文字列を指定 | 
| 3 | code | ○ | Authorization codeを指定、リクエスト送信後は使用できなくなる。 | 
| 4 | redirect_uri | ○ | STEP 1 のredirect_uriで指定したURLを入力。 | 
{
    "access_token":"{ヘッダー部}.{ペイロード部}.{シグネチャー部}",
    "token_type":"bearer",
    "expires_in":"3600",
    "refresh_token":"・・・",
    "id_token":"・・・"
}{
    "typ":"JWT",
    "alg":"HS256"
}| # | パラメタ | 説明 | 
| 1 | typ | typ:JWT(JSON Web Token) | 
| 2 | alg | alg:HMAC-SHA256(署名に使用したハッシュ) | 
{
    "iss":"https:\/\/・・・Access Tokenの発行元URL・・・",
    "user_id":"ユーザー識別子",
    "aud":"アプリケーションID(client_id)と一致する値",
    "iat":IDトークンの発行時刻,
    "exp":IDトークンの有効期限,
    "nonce":"STEP 1 のnonceと一致する値"
}| # | 部分 | 説明 | 
| 1 | Header | 'Authorization: Bearer {access_token}' | 
| 2 | URL | URL:https://・・・ユーザ属性情報の発行元URL・・・?schema=openid | 
{
    "user_id":"・・・",
    "name":"・・・",
    "given_name":"・・・",
    "given_name#ja-Kana-JP":"・・・",
    "given_name#ja-Hani-JP":"・・・",
    "family_name":"・・・",
    "family_name#ja-Kana-JP":"・・・",
    "family_name#ja-Hani-JP":"・・・",
    "gender":"male or female",
    "birthday":"YYYY",
    "locale":"ja-JP,etc."
}結果的に、OPからRP識別のための“cient_id”がレスポンスされる。
AzureADに対して、OpenId? Connectを使用して認証する。
https://github.com/OpenTouryoProject/SampleProgram/tree/master/ASPNET/AuthN_AuthZ/OpenID_Connect/
- Azureの管理ポータルにサインイン。
 - Azure Active Directoryのタブを開く。
 - サンプル・アプリケーションを登録するテナント(ドメイン)を開く。
 - [Applications]タブに移動し、ページの下部の[Add]アイコンををクリック。
 - [What do you want to do?]画面で[Add an application my organization is developing]を選択。
 - [Tell us about your application]画面が表示される。
 
- アプリケーションの名前を入力(例:OpenIDConnect_sample)。
 - [Web Application and / or Web API]を選択する。
 - [Next]をクリックする。
 - [App properties]画面が表示される。
 
- サンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)
 
サンプル・プロジェクトのプロパティにある開発サーバのSSL URLプロパティを指定
http://www.codeproject.com/Tips/766918/Visual-Studio-Use-HTTPS-SSL-On-Web-Application-Pro- アプリのID URIを入力(例:https://<your_tenant_name>/OpenIDConnect_sample)
 
'<your_tenant_name>はAzure ADのテナント(ドメイン)名。- [Complete]をクリック。
 
- web.configファイルを開く。
 - FxTenant?にAzure ADのテナント(ドメイン)名を指定(例:xxxxx.onmicrosoft.com)
 - FxClientId? にAzureのポータルから入手することができるClient IDを指定
 
- クライアントIDを取得するには、
 - Azureの管理ポータルにサインイン。
 - Azure Active Directoryのタブを開く。
 - サンプル・アプリケーションを登録したテナント(ドメイン)を開く。
 - [Applications]タブに移動しサンプル・アプリケーションを選択。
 - アプリケーション画面で[ACCESS WEB APIS IN OTHER APPLICATIONS]を選択。
 - Client IDをコピー。
 - FxPostLogoutRedirectUri?にサンプルのサインオンURLを入力(例:https://localhost:xxxxxx/)
 
F5実行でリダイレクトされた先のAzure AD(STS)で認証できることを確認する。
Tags: :認証基盤, :クレームベース認証, :OAuth