「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>Multi-AuthSystem]] *目次 [#pd845b45] #contents *概要 [#ee98709c] Multi-AuthSystemの動作検証手順のメモする。 *Idp [#ab958dd9] **基本 [#v56f28c7] ***サインアップとアカウント確認 [#f1df8ba0] -アカウント確認は初回サインアップ後のレコードに対して行なう。 -サインアップを繰り返せば確認メールは飛ぶが、~ アカウント確認は、初回サインアップ後のレコードに対して行なう。 -初回サインアップ時のパスワードを失念した場合は、パスワード・リセットを行なう。 ***サインイン・サインアウト [#d48b0127] 通常通り。 ***アカウント編集 [#caf04244] -パスワード --変更 --設定(外部ログイン後、ローカルログオンをする場合) -電話番号(→SMS) -[[二要素認証 (2FA) のON/OFF>#jad3e687]] -[[外部ログイン>#abb9437a]]の一覧と削除 -,etc. (任意項目を追加可能) **二要素認証 [#n514b715] ***有効化 [#jad3e687] アカウント編集にて有効化 ***他のブラウザでテスト [#rc29a943] -有効化した後は、他のブラウザでテストする。 -二要素認証はCookieを使用しているため、ブラウザ単位で行う。 **運用 [#id35e3f1] ***アカウント・ロックアウト [#s8a2ba55] 指定回数、ログインをミスすると、指定時間ロックアウトされる。 ***パスワード・リセット [#tfbdc203] -通常のパスワード・リセットのシナリオ。 -例外的に以下のシナリオで使用する。 --初回サインアップ時のパスワードを失念した場合のシナリオ。 --ローカルログオンを設定するシナリオ。 ***SecurityStamp [#n61abdc9] -アカウント編集後にサインアウトされる。 -アカウント編集後にサインアウト・サインインする実装になっている理由はコレ。 **管理者画面 [#qebfe8a9] -データ量が多い場合に耐えられない実装になっている(ページング実装無し)。 ***ユーザ編集・削除 [#x0c2831f] -マルチテナント対応済み。 -現時点で、編集可能なユーザ属性が少ない(現状、Name = E-mailのみ編集可能) ***ロール編集・削除 [#i0b648a6] -マルチテナント対応済み。 *外部ログイン [#abb9437a] **ExternalLoginCallbackの条件分岐 [#a1c25645] ***(1)外部ログインの成否 [#r4461a5c] -失敗(異常終了) -成功、(2)へ。 ***(2)外部ログインの有・無 [#o30222af] -既存の外部ログインがある→そのままサインイン(正常終了) -既存の外部ログインがない→新規の外部ログインの追加、(3)へ。 ***(3)外部ログインの追加 [#g8ab4fa9] -当該ユーザが既にサインアップされている。~ → 外部ログインを追加してサインイン(正常終了) -当該ユーザが未だサインアップされていない。~ → サインアップ後に外部ログインを追加してサインイン(正常終了) #外部ログイン追加、サインアップ、サインインの成・否は既定の動作のため省略。 **外部ログイン追加→削除のテストケース [#g85cf676] ***サインアップ済みの状態から外部ログインの追加→削除 [#ke781924] 外部ログイン削除後のタイミングで、ログアウトしていないのは、~ 代替のログイン手段を持っているため問題無いということ。 ***サインアップせずに、外部ログインの追加→削除 [#x9af9e36] -サインアップしていない場合に、最後の外部ログインを削除できなくなる。 -パスワード追加、パスワードリセットで、ローカルログオンを有効化すれば外部ログインを削除できる。 *OAuth 2.0 Server [#i7db0ba2] OAuthで認証・認可した後、WebAPIへアクセスするまでの手順を使用して検証を行なう。 **Authorization Codeグラント種別 [#w8d19e13] 「http://localhost:nnnnn/home/index」で表示されるAuthorization Codeグラント種別のテスト用linkをclickする。 **Implicitグラント種別 [#v8c5ac21] 「http://localhost:nnnnn/home/index」で表示されるImplicitグラント種別のテスト用linkをclickする。 **Resource Owner Password Credentialsグラント種別 [#ka3a0c97] cURLコマンドする。 ***処理の概要 [#md5764f5] -Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。 --POST --Authorization: Basic ZZZZZZZZZZ ---> 「クライアントID:クライアント・パスワード」をBase64エンコードしたもの。 --body : grant_type=password, username=ユーザID, password=ユーザ・パスワード, scope=XXXXX; -Bearer Tokenをヘッダに指定してWebAPIにアクセスすると情報を取得できる。 --XXXX --Authorization: Bearer XXXXXXXXXX ***cURLコマンド [#e3bf933b] Debug ProxyにFiddler等を使用すると尚良(其の際は、 --proxy オプションを指定する必要がある)。 -Bearer Tokenの取得 --Request (cURLコマンド) >curl "http://localhost:nnnnn/OAuthBearerToken"-u "クライアントID:クライアント・パスワード" -d "grant_type=password" -d "username=ユーザID" -d "password=ユーザ・パスワード" -d "scope=XXXXX" --Response (Body) {"access_token":"XXXXXXXXXX","token_type":"bearer","expires_in":nnnnn,"refresh_token":"YYYYYYYYYY"} -Bearer Tokenを使用したOAuthリソースへのアクセス --Request (cURLコマンド) >curl "http://localhost:nnnnn/api/OAuthResourceApi/GetUserClaim" -H "Authorization: Bearer XXXXXXXXXX" --Response (Body) {"userName":"XXXXX","email":"XXXXX","phoneNumber":"XXXXX"} **Client Credentialsグラント種別 [#h00dd765] cURLコマンドする。 ***処理の概要 [#qc919bfc] -Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。 --POST~ Authorization: Basic ZZZZZZZZZZ ---> 「クライアントID:クライアント・パスワード」をBase64エンコードしたもの。 --body:grant_type=client_credentials, scope=XXXXX; -Bearer Tokenをヘッダに指定してWebAPIにアクセスすると情報を取得できる。 --XXXXX --Authorization: Bearer XXXXXXXXXX ***cURLコマンド [#bf249746] Debug ProxyにFiddler等を使用すると尚良(其の際は、 --proxy オプションを指定する必要がある)。 -Bearer Tokenの取得 --Request (cURLコマンド) >curl "http://localhost:nnnnn/OAuthBearerToken" -u "クライアントID:クライアント・パスワード" -d "grant_type=client_credentials" -d "scope=XXXXX" --Response (Body) {"access_token":"XXXXXXXXXX","token_type":"bearer","expires_in":nnnnn,"refresh_token":"YYYYYYYYYY"} -Bearer Tokenを使用したOAuthリソースへのアクセス --Request (cURLコマンド) >curl "http://localhost:63359/api/OAuthResourceApi/GetUserClaim" -H "Authorization: Bearer XXXXXXXXXX" --Response (Body) {"userName":"XXXXX","email":"XXXXX","phoneNumber":"XXXXX"}