「Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
汎用認証サイト(Multi-purpose Authentication Site)の独自仕様部分について説明する。
Idp仕様 †
概要 †
Idpの仕様については概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「ASP.NET Identity」を参照。
カスタマイズ・ポイント †
以下のスイッチで大きな動作変更が可能。
詳しくは「汎用認証サイトのコンフィギュレーション」を参照のこと。
以下のように、主にサインアップ・プロセスに影響を与える。
- RequireUniqueEmail? : true
- UserName? = E-mailアドレス
- インターネット環境の標準の実装はこちら。
- E-mailアドレスでサインアップするため、直ちにE-mailアドレスの確認
(E-mail confirmation)を行うため、サインアップ・プロセスは複雑化する。
- RequireUniqueEmail? : false
- UserName? = 任意文字列
- ユーザストアを管理者が準備するエンプラ向き実装はこちら。
- サインアップで、E-mailアドレスが提供されないので、
サインアップ・プロセスは、UserName?=メアドよりシンプルになる。
しかし、E-mailアドレスの確認(E-mail confirmation)が実質的に不可能。
- サインアップ画面を提供せず、管理者がアカウント(E-mailアドレス)を準備する。
- 若しくは、UserName?とE-mailアドレスの入力が可能なサインアップ画面を提供したり、
- "ユーザ名@サイトのドメイン"でE-mailアドレスを準備するなどとする。
の動作にも影響を与える。
利用するサービス †
- Microsoft
- Google
- Facebook
ユーザ・アカウント †
主要属性 †
永続化 †
- EntityFrameworkをキャンセルしUserStore?クラスで実装。
- UserStoreTypeの設定で、UserStore?クラスの使用するデータストアを変更可能。
- データストアは、メモリとRDBMSをサポート(NoSQLやLDAPのサポートも可能)
- RDBMSへのデータアクセスは、Dapperを使用して実装している。
スキーマ †
DDL †
https://github.com/OpenTouryoProject/MultiPurposeAuthSite/tree/develop/root/files/resource/Sql
編集処理 †
- アカウント編集処理
- 非定型データを使用すればスキーマ変更は不要。
- 設定によってロックダウン可能。
- 編集可能なアカウント属性についてはこちら。
- ユーザ・ロール編集処理
- 管理画面でユーザ・ロールのCRU(属性編集)Dが可能
- 管理画面についての詳細はこちら。
サインアップ・サインイン †
サインアップとE-mailアドレス確認 †
UserName? = E-mailアドレス の場合、
- E-mailアドレスの確認(E-mail confirmation)は、初回サインアップ(レコード生成)後のアカウント(レコード)に対して行なう。
- 初回サインアップ(レコード生成)後に、E-mailアドレスの確認(E-mail confirmation)をしなかった場合、
- サインアップをしようとすると、レコードを再生成後、E-mailアドレスの確認(E-mail confirmation)が再送される。
- サインインをしようとすると、E-mailアドレスの確認(E-mail confirmation)が再送される。
- 初回サインアップ(レコード生成)後、
- E-mailアドレス確認のメールをロストした場合、
- サインアップを繰り返せば、再び、E-mailアドレス確認メールは飛ぶ(レコードが再生成されるのでパスワードも変更される)。
- サインインを繰り返せば、再び、E-mailアドレス確認メールは飛ぶ(レコードが再生成されないのでパスワードは古いまま)。
- パスワードを失念した場合、
- 上記の「サインアップを繰り返す」を行えばサインアップできる。
- 若しくは、パスワード・リセットを行えばサインアップできる。
サインイン・サインアウト †
アカウント編集 †
ユーザ名 †
- アカウント編集でユーザ名を変更
- UserName? = E-mailアドレス の場合、
E-mailアドレスの確認(E-mail confirmation)が必要。
パスワード †
- アカウント編集でパスワードを設定・変更
- 変更
- 設定(外部ログイン後、ローカル・ログオンを可能にする場合)
E-mailアドレス †
- アカウント編集でE-mailアドレスを設定・削除
- UserName? = E-mailアドレス の場合に表示される。
- E-mailアドレスの確認(E-mail confirmation)が必要。
- リンクを実行しない場合、E-mailアドレス設定が正常終了しない。
- リンクを実行した場合、E-mailアドレス設定が正常終了する。
電話番号 †
- アカウント編集で電話番号を設定・削除
- 通知プロバイダのSMSで通知を行い、受信したコードを入力する。
- 誤ったコードを入力した場合、電話番号設定が正常終了しない。
- 正しいコードを入力した場合、電話番号設定が正常終了する。
外部ログインの一覧表示と追加・削除
属性データ(非定型データ) †
- 属性データ(非定型データ)をメンテナンスする。
- JSON形式での情報格納を想定しているので、スキーマ(DDL)変更は不要。
OAuth2データ †
ユーザ毎に、
- client_id
- client_secret
- redirect_uri(code)
- redirect_uri(token)
のデータを設定し、
OAuth2アクセストークンを取得可能。
運用系機能 †
パスワード・リセット †
- 通常のパスワード・リセットのシナリオ。
- パスワードを失念した場合、パスワード・リセットを行う。
- 例外的に以下のシナリオで使用する。
- 初回サインアップ時のパスワードを失念した場合のシナリオ。
- 外部ログイン後、ローカル・ログオンを可能にするシナリオ。
セキュリティ強化機能 †
アカウント・ロックアウト †
指定回数、ログインをミスすると、指定時間ロックアウトされる。
SecurityStamp? †
- アカウント編集(ユーザ属性の変更)後のアクセスがサインアウトされる。
- アカウント編集後にサインアウト・サインインする実装になっている理由はコレ。
2要素認証 †
- 別のブラウザからログイン試行を行う
(2要素認証ではCookieでブラウザを記憶するため)。
- すると通知プロバイダを選択したコードを送信が行われる。
- 選択した通知プロバイダで通知を行い、受信したコードを入力する。
- 誤ったコードを入力した場合、2要素認証が正常終了しない。
- 受信したコードを入力して2要素認証が正常終了する。
- .NET Core版では、TOTPの2FAがサポートされている。
その他、追加の対応 †
STS仕様 †
標準に準拠
外部ログイン仕様 †
概要 †
概ね、ASP.NET Identityに準拠。
カスタマイズ・ポイント †
外部ログイン処理の仕様について。
外部ログイン設定 †
外部ログインと、外部ログイン・サービスを設定する。
- XsrfKey?
XSRF(=CSRF)を防ぐためのstateパラメタの生成に使用される。
- 外部ログイン・サービス
- Microsoft
- Google
- Facebook
- Twitter
外部ログインでサインアップ †
サインアップを外部ログインで行った場合、
- パスワードを持たないアカウントになる。
- この場合、後からパスワードを設定することで、ローカル・ログオンが可能になる。
- アカウント編集画面でパスワード追加する。
- パスワード・リセットを行なう。
- E-mailアドレスの確認(E-mail confirmation)
- 外部ログイン処理で取得したE-mailアドレスは確認しない。
(信頼するIdPのSTSで連携されたE-mailアドレスであるため)
- E-mailアドレスでサインアップして、そのままサインインする。
外部ログインでサインイン †
- ローカル・ログインに外部ログインを重ねるパターンと、
外部ログインに外部ログインを重ねるパターンとがある。
- サインインを外部ログインで行った場合、
- 既存のアカウントにID連携でサインインできる。
- ID連携で必要なクレーム(属性値)を連携して上書きできる。
- なお、UserName?やE-mailなど、ID連携で変更できない属性値もある。
外部ログインの一覧と削除 †
- サインアップ済みの状態から外部ログインの追加 → 削除
外部ログイン削除後のタイミングで、ログアウトしていないのは、
代替のログイン手段を持っているため問題無いということ。
- サインアップせずに、外部ログインの追加 → 削除
- ローカル・ログオンを可能にしていない場合、最後の外部ログインを削除できなくなる。
- 後からパスワードを設定することでローカル・ログオンを有効化すれば外部ログインを削除できる。
外部ログインの詳細 †
ExternalLoginCallback?の条件分岐
- (2) 外部ログインの有・無
- 既存の外部ログインがある → クレームを更新してサインイン(正常終了)
- 既存の外部ログインがない →新規の外部ログインの追加、(3) へ。
- (3) 外部ログインの追加
- 当該ユーザが既にサインアップされている。
→ 外部ログイン、クレームを追加してサインイン(正常終了)
- 当該ユーザが未だサインアップされていない。
→ サインアップ後に外部ログイン、クレームを追加してサインイン(正常終了)
- (2) 外部ログインの有・無
- 既存の外部ログインがある → クレーム更新のみ行う(正常終了)
- 既存の外部ログインがない →新規の外部ログインの追加、(3) へ。
- (3) 外部ログインの追加
- 当該ユーザが既にサインアップされている。
→ 外部ログイン、クレームを追加してサインイン(正常終了)
- 当該ユーザが未だサインアップされていない。
→ このケースはありえない。
- クレームの連携(追加・更新)時に、ユーザ属性を更新するかどうか?
- 案件毎に決定してカスタマイズする。
- 既定では、ユーザ属性の更新はしていない。
管理機能 †
管理者アカウント †
システム管理者アカウントサインインして管理操作を実行できる。
ユーザ・ロール編集処理 †
- システム管理者アカウントのみ操作可能。
(マルチテナント機能は v01-10 で削除した。)
エラーメッセージ †
表示元 †
ASP.NET MVCのModel Bindingの検証機能によるもの。 †
- 既定値
以下のような属性では、既定のエラーメッセージを使用。
- [EmailAddress?]
- [Required(AllowEmptyStrings? = false or truw)]
ASP.NET Identityによるもの。 †
サーバー・サイド実装によるもの。 †
表示先 †
- 表示例
- サマリ領域に表示する場合、
- 入力項目の横に表示する場合、
サーバー・サイドのチェック結果が、サマリ領域(Html.ValidationSummary?)に表示される。
例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Views/Account/Register.cshtml#L45
@Html.ValidationSummary("", new { @class = "text-danger" })
サーバー・サイドのチェック結果が、サマリ領域(Html.ValidationSummary?)に表示される。
例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Views/Account/Register.cshtml#L45
@Html.ValidationSummary("", new { @class = "text-danger" })
使用するパラメタについて、コチラに纏めた。
参考 †
比較 †