「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>汎用認証サイト(Multi-purpose Authentication Site)]]

*目次 [#j24adbab]
#contents

*概要 [#i84718cb]
[[汎用認証サイト(Multi-purpose Authentication Site)]]の独自仕様部分について説明する。

*Idp仕様 [#f550c2de]
**概要 [#p07e3d3b]
Idpの仕様については概ね、ASP.NET Identityに準拠。

ASP.NET Identity側の仕様については、「[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]」を参照。

**カスタマイズ・ポイント [#n3b708da]
以下のスイッチで大きな動作変更が可能。

詳しくは「[[汎用認証サイトのコンフィギュレーション]]」を参照のこと。

***[[Multi-tenantスイッチ>汎用認証サイトのコンフィギュレーション#s67e789e]] [#j6087e30]

***[[RequireUniqueEmailスイッチ>汎用認証サイトのコンフィギュレーション#g813e54f]] [#gbd5af06]

**利用するサービス [#a92c7f68]
***[[外部ログイン>#w534c815]] [#saead825]
-Microsoft
-Google
-Facebook

***[[オンライン決済サービス>汎用認証サイト(Multi-purpose Authentication Site)#qf3fddd8]] [#mf9d3a00]
-Stripe
-PAY.JP

***[[通知プロバイダ>汎用認証サイト(Multi-purpose Authentication Site)#j3aea225]] [#i20fcfb1]
-SMTP
-SMS (Twilio)

**ユーザ・アカウント [#xa20a1e2]
***主要属性 [#b725e4d1]
-UserId = GUID

-[[UserNameはスイッチ次第>#gbd5af06]]
--基本は、E-mailアドレス
--スイッチ変更により、任意の文字列を使用可能。

-Password
--当然、[[ライブラリにて適切にハッシュ化>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ASPNETIdentity/Manager/CustomPasswordHasher.cs]]されてからUserStoreに保存される。
--強度は[[コチラの設定>汎用認証サイトのコンフィギュレーション#pca79851]]に従う。

-その他
--[[スキーマ>#e472fd55]]を参照。

***永続化 [#d378ad48]
-[[EntityFramework>https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework]]をキャンセルしUserStoreクラスで実装。
-[[UserStoreTypeの設定>汎用認証サイトのコンフィギュレーション#y8c5ea41]]で、UserStoreクラスの使用するデータストアを変更可能。
--データストアは、メモリとRDBMSをサポート(NoSQLやLDAPのサポートも可能)
--RDBMSへのデータアクセスは、Dapperを使用して実装している。

**スキーマ [#e472fd55]
***DDL [#ge5c13dd]
https://github.com/OpenTouryoProject/MultiPurposeAuthSite/tree/develop/root/files/resource/Sql

***アカウント編集処理 [#hfcc91ec]
-非定型データを使用すればスキーマ変更は不要。
-[[設定>汎用認証サイトのコンフィギュレーション#b233454c]]によってロックダウン可能。
-編集可能なアカウント属性については[[こちら>#sc966644]]。

***ユーザ・ロール編集処理 [#zcb2a047]
-管理画面でユーザ・ロールのCRU(属性編集)Dが可能
-[[Multi-tenantの設定>#j6087e30]]によって動作が大きく異る。
-管理画面についての詳細は[[こちら>#ue4c3ec1]]。

**サインアップ・サインイン [#oe564461]

***サインアップとE-mailアドレス確認 [#rc86b3dc]
-E-mailアドレスの確認(E-mail confirmation)は、~
初回サインアップ後のレコードに対して行なう。

-E-mailアドレスの確認(E-mail confirmation)をしなかった場合、~
--サインアップをしようとすると、サインアップ済みの旨が表示される。
--E-mailアドレス確認は、初回サインアップ後のレコード(ユーザID・PWD)に対して行なう。

-初回サインアップ後、
--E-mailアドレス確認のメールをロストした場合、~
サインインを繰り返せば、再び、E-mailアドレス確認メールは飛ぶ。
--パスワードを失念した場合、[[パスワード・リセット>#f88a0fb5]]を行えばサインアップできる。

***サインイン・サインアウト [#l4470148]
通常通り。

***パスワード・リセット [#f88a0fb5]
-パスワードを失念した場合
-サインアップ時のパスワードを失念した場合にも使用可能。

**アカウント編集 [#sc966644]
***パスワード [#u4227d89]
-変更
-設定([[外部ログイン>#w534c815]]後、ローカル・ログオンを可能にする場合)

***電話番号 [#p3aec882]
-編集(設定・削除)が可能
-[[通知プロバイダのSMS>汎用認証サイト(Multi-purpose Authentication Site)#j3aea225]]を使用。

***[[2要素認証 (2FA) >#w7ba6fad]] [#b2ceb7bb]
[[2要素認証 (2FA) >#w7ba6fad]]のON/OFF

***[[外部ログイン>#w534c815]] [#z8a5ebd4]
[[外部ログイン>#w534c815]]の一覧表示と追加・削除

***[[オンライン決済サービス>汎用認証サイト(Multi-purpose Authentication Site)#qf3fddd8]] [#hb5e1c33]
クレジット・カードの登録

***属性データ(非定型データ) [#z9bb4735]

***OAuth2データ [#icfa3463]
ユーザ毎に、
-client_id
-client_secret
-redirect_uri(code)
-redirect_uri(token)

のデータを設定し、

OAuth2アクセストークンを取得可能。

**2要素認証 [#w7ba6fad]

***有効化 [#q5586e1b]
アカウント編集にて有効化

***他のブラウザでテスト [#red3542c]
-有効化した後は、他のブラウザでテストする。
-2要素認証はCookieを使用しているため、ブラウザ単位で行う。

**運用系機能 [#q853018f]

***アカウント・ロックアウト [#tdca397b]
指定回数、ログインをミスすると、指定時間ロックアウトされる。

***パスワード・リセット [#t06f7341]
-通常のパスワード・リセットのシナリオ。

-例外的に以下のシナリオで使用する。
--初回サインアップ時のパスワードを失念した場合のシナリオ。
--[[外部ログイン>#w534c815]]後、ローカル・ログオンを可能にするシナリオ。

***SecurityStamp [#vbd67fbf]
-アカウント編集後にサインアウトされる。
-アカウント編集後にサインアウト・サインインする実装になっている理由はコレ。

***ユーザ・ロール編集処理 [#ue4c3ec1]
管理画面についての詳細は[[こちら>汎用認証サイトのファーストステップガイド (2)#f0c1d26f]]。

*外部ログイン仕様 [#w534c815]

**概要 [#x9ecc92c]
概ね、[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]に準拠。

[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]側の仕様については、「[[ASP.NET Identityの外部ログイン>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity%E3%81%AE%E5%A4%96%E9%83%A8%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3]]」を参照。

**カスタマイズ・ポイント [#n861c0bc]
外部ログイン処理の仕様について。

***外部ログイン・サービス [#m1ac1110]
-Microsoft
-Google
-Facebook
-Twitter

***外部ログインでサインアップ [#cd8169dc]
サインアップを外部ログインで行った場合、
-パスワードを持たないアカウントになる。
-この場合、後からパスワードを設定することで、ローカル・ログオンが可能になる。
--管理画面でパスワード追加する。
--パスワード・リセットを行なう。

-E-mailアドレスの確認(E-mail confirmation)
--外部ログイン処理で取得したE-mailアドレスは確認しない。
--E-mailアドレスでサインアップして、そのままサインインする。

***外部ログインでサインイン [#rcf9978e]
-サインインのみ外部ログインで行った場合、
--既存のアカウントに認証連携でサインインできる。
--認証連携で必要なクレーム(属性値)を連携して上書きできる。
--UserNameやE-mailなど、変更できない属性値もある。

-外部ログイン追加、サインアップ、サインインの成・否は既定の動作のため省略。

***外部ログインの一覧と削除 [#hbd8d5db]
-サインアップ済みの状態から外部ログインの追加 → 削除~
外部ログイン削除後のタイミングで、ログアウトしていないのは、~
代替のログイン手段を持っているため問題無いということ。

-サインアップせずに、外部ログインの追加 → 削除~
--ローカル・ログオンを可能にしていない場合、最後の外部ログインを削除できなくなる。
--パスワード追加でローカル・ログオンを有効化すれば外部ログインを削除できる。

***外部ログインの詳細 [#g27b9c4f]
ExternalLoginCallbackの条件分岐


-AccountController
--(1) 外部ログインの成否
---失敗(異常終了)
---成功、(2) へ。

--(2) 外部ログインの有・無
---既存の外部ログインがある → クレームを更新してサインイン(正常終了)
---既存の外部ログインがない →新規の外部ログインの追加、(3) へ。

--(3) 外部ログインの追加
---当該ユーザが既にサインアップされている。~
→ 外部ログイン、クレームを追加してサインイン(正常終了)
---当該ユーザが未だサインアップされていない。~
→ サインアップ後に外部ログイン、クレームを追加してサインイン(正常終了)

-ManageController
--(1) 外部ログインの成否
---失敗(異常終了)
---成功、(2) へ。

--(2) 外部ログインの有・無
---既存の外部ログインがある → クレーム更新のみ行う(正常終了)
---既存の外部ログインがない →新規の外部ログインの追加、(3) へ。

--(3) 外部ログインの追加
---当該ユーザが既にサインアップされている。~
→ 外部ログイン、クレームを追加してサインイン(正常終了)
---当該ユーザが未だサインアップされていない。~
→ このケースはありえない。

-クレームの連携(追加・更新)時に、ユーザ属性を更新するかどうか?
--案件毎に決定してカスタマイズする。
--既定では、ユーザ属性の更新はしていない。

*[[OAuth>https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth]] 2.0 Server仕様 [#td27d2c1]

**概要 [#k234ea79]
概ね、[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]に準拠。

-[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]側の仕様
-[[OAuth>https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth]]を拡張した認証の仕様

については、「[[ASP.NET IdentityによるSTS実装>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity%E3%81%AB%E3%82%88%E3%82%8BSTS%E5%AE%9F%E8%A3%85]]」を参照。

**共通 [#c15cd000]

***Server側 [#odd02418]
-AuthorizationServer
--認可エンドポイント
---redirect_uriチェックは不要(部分一致をサポートしない完全事前登録制とするため)
--Tokenエンドポイント(Access Tokenの発行方法)
---scope=その他の値の場合、scopeパラメタ値をClaimに格納する(通常の動作)。

-ResourceServer
--リソース・アクセス用のWeb APIを提供する。

***Client側 [#y0f2a018]
-パラメタ
--redirect_uri指定は不要(部分一致をサポートしない完全事前登録制とするため)
--state指定は必須(ID Tokenのnonce Claimにコレを設定する)。

-ResourceServerリソース・アクセス用のWeb APIにアクセスする場合、
--Access TokenをHTTPヘッダに指定して送信する。

***Access Token [#d98eac8c]
-Access Tokenのフォーマットには[[JWT>https://techinfoofmicrosofttech.osscons.jp/index.php?JWT]]アサーションを使用する。
--この[[JWT>https://techinfoofmicrosofttech.osscons.jp/index.php?JWT]]アサーションには、OpenID Connectと同様のID Tokenを含める。
--Access TokenはOAuthAuthorizationServerOptions.AccessTokenFormatに設定した、モジュールで生成される。

-AccessTokenFormatモジュールとの情報の受け渡しには、
--[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]の仕組みに準拠し、ClaimsIdentityを使用する。
--ClaimsIdentityには、以下のようなURN形式の文字列をkeyに使用して、~
OAuthAuthorizationServer側からvalueの追加を行う(以下はscopeの値を設定する例)。
 claimsIdentity.AddClaim(new Claim("urn:oauth:scope", xxxxx));

**クライアント認証 [#g7ed260c]
ここでのクライアントとは、ユーザではなく、[[OAuth>https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth]] 2.0 のClientを指しているので注意する。

-認可エンドポイントでは、クライアント認証ではなく、Redirectエンドポイントの検証を行う。
-クライアント認証は、Tokenエンドポイントにアクセスする際に行なう。
-ベーシック認証の認証ヘッダを使用して[[クライアント識別子>#hd5f827d]]を送信する。

***クライアント識別子 [#hd5f827d]
-GUIDを使用する
--32文字の英数字。
--URLに指定するので、[{}, -] は無し。

-client_id~
全てのグラント種別以外で必須
-client_secret
--Implicitグラント種別以外で必須
--ただし、[[ユーザ認証>#k61b5f5a]]で使用する場合は、Implicitグラント種別でも必須。

**ユーザ認証 [#k61b5f5a]

***Server側 [#jdc096e3]
-Access TokenにOpenID Connectと同様のID Token([[JWT>https://techinfoofmicrosofttech.osscons.jp/index.php?JWT]]アサーション)を含める。

-ApplicationOAuthBearerTokenProviderの実装
--ValidateClientRedirectUriのオーバーライド
---
--xxxxx
---xxxxxxxxxx

-[[クライアント識別子>#hd5f827d]]は全てのグラント種別で必須となる。

***Client側 [#hc71d0be]
-グラント種別
--できるだけ、Authorization Codeグラント種別を使用する。
--Implicitグラント種別もサポートするが、その場合、~
[[ユーザ認証>#k61b5f5a]]用Access Tokenと[[クライアント識別子>#hd5f827d]]の露見のリスクがあることに注意すること。
--従って、できるだけ、[[JWT>https://techinfoofmicrosofttech.osscons.jp/index.php?JWT]]アサーションをClient側で検証することが推奨される。

-パラメタ
--response_typeには、"code"(推奨) or "token"を指定する。

-ResourceServerの[[ユーザ認証>#k61b5f5a]]専用のWebAPIにアクセスする場合、
--[[ユーザ認証>#k61b5f5a]]用Access Tokenに加え、前述の[[クライアント識別子>#hd5f827d]]をPOSTで送信する。

***ResourceServerのWebAPI [#f23f0dde]
-/api/OAuthResourceApi/GetUserClaim

*[[パラメタ化>汎用認証サイトのコンフィギュレーション]] [#fe16f728]
-[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]や、
-[[汎用認証サイト>汎用認証サイト(Multi-purpose Authentication Site)]]のアプリケーションで

使用するパラメタについて、[[コチラ>汎用認証サイトのコンフィギュレーション]]に纏めた。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS