Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

Idp仕様

概要

Idpの仕様については概ね、ASP.NET Identityに準拠。

ASP.NET Identity側の仕様については、「ASP.NET Identity」を参照。

カスタマイズ・ポイント

以下のスイッチで大きな動作変更が可能。

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

RequireUniqueEmailスイッチ

以下のように、主にサインアップ・プロセスに影響を与える。

  • 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

オンライン決済サービス

  • Stripe
  • PAY.JP

通知プロバイダ

  • SMTP
  • SMS (Twilio)

ユーザ・アカウント

主要属性

  • UserId? = GUID

永続化

  • 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アドレス確認メールは飛ぶ(レコードが再生成されないのでパスワードは古いまま)。
  • パスワードを失念した場合、
    • 上記の「サインアップを繰り返す」を行えばサインアップできる。
    • 若しくは、パスワード・リセットを行えばサインアップできる。

サインイン・サインアウト

  • 通常通りサインアップする。
  • Passwordの強度を満たさない場合、エラーとなることを確認する。

アカウント編集

ユーザ名

  • アカウント編集でユーザ名を変更
  • UserName? = E-mailアドレス の場合、
    E-mailアドレスの確認(E-mail confirmation)が必要。

パスワード

  • アカウント編集でパスワードを設定・変更
    • 変更
    • 設定(外部ログイン後、ローカル・ログオンを可能にする場合)
  • Passwordの強度を満たさない場合、エラーとなることを確認する。

E-mailアドレス

  • アカウント編集でE-mailアドレスを設定・削除
  • UserName? = E-mailアドレス の場合に表示される。
  • E-mailアドレスの確認(E-mail confirmation)が必要。
    • リンクを実行しない場合、E-mailアドレス設定が正常終了しない。
    • リンクを実行した場合、E-mailアドレス設定が正常終了する。

電話番号

  • アカウント編集で電話番号を設定・削除
  • 通知プロバイダのSMSで通知を行い、受信したコードを入力する。
    • 誤ったコードを入力した場合、電話番号設定が正常終了しない。
    • 正しいコードを入力した場合、電話番号設定が正常終了する。

2要素認証(2FA)

外部ログイン

外部ログインの一覧表示と追加・削除

オンライン決済サービス

属性データ(非定型データ)

  • 属性データ(非定型データ)をメンテナンスする。
  • JSON形式での情報格納を想定しているので、スキーマ(DDL)変更は不要。

OAuth2データ

ユーザ毎に、

  • client_id
  • client_secret
  • redirect_uri(code)
  • redirect_uri(token)

のデータを設定し、

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

運用系機能

パスワード・リセット

  • 通常のパスワード・リセットのシナリオ。
    • パスワードを失念した場合、パスワード・リセットを行う。
  • 例外的に以下のシナリオで使用する。
    • 初回サインアップ時のパスワードを失念した場合のシナリオ。
    • 外部ログイン後、ローカル・ログオンを可能にするシナリオ。
  • Passwordの強度を満たさない場合、エラーとなることを確認する。

セキュリティ強化機能

アカウント・ロックアウト

指定回数、ログインをミスすると、指定時間ロックアウトされる。

SecurityStamp?

  • アカウント編集(ユーザ属性の変更)後のアクセスがサインアウトされる。
  • アカウント編集後にサインアウト・サインインする実装になっている理由はコレ。

2要素認証

  • アカウント編集で2要素認証をONにする。
  • 別のブラウザからログイン試行を行う
    (2要素認証ではCookieでブラウザを記憶するため)。
  • すると通知プロバイダを選択したコードを送信が行われる。
  • 選択した通知プロバイダで通知を行い、受信したコードを入力する。
    • 誤ったコードを入力した場合、2要素認証が正常終了しない。
    • 受信したコードを入力して2要素認証が正常終了する。

その他、追加の対応

FIDO2.0対応

GDPR対策

外部ログイン仕様

概要

概ね、ASP.NET Identityに準拠。

カスタマイズ・ポイント

外部ログイン処理の仕様について。

外部ログイン設定

外部ログインと、外部ログイン・サービスを設定する。

  • RequireUniqueEmailスイッチ
    • UserName = E-mailアドレスで動作する。
    • UserName ≠ E-mailアドレスでの外部ログインとの親和性は低い。
      • 通常、サインアップ画面を提供せず、管理者がアカウント(E-mailアドレス)を準備する。
      • 殆どのIdPではE-mailを使用しており、オプションで使用しているUserName?がIdP間で一致していないことが多いため。
      • IdP間を跨ぐ場合、UserName?の一意性は保証されないので、結局、E-mailアドレス確認(E-mail confirmation)されたE-mailに頼る必要がある。
  • 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) 外部ログインの追加
    • 当該ユーザが既にサインアップされている。
      → 外部ログイン、クレームを追加してサインイン(正常終了)
    • 当該ユーザが未だサインアップされていない。
      → このケースはありえない。
  • クレームの連携(追加・更新)時に、ユーザ属性を更新するかどうか?
    • 案件毎に決定してカスタマイズする。
    • 既定では、ユーザ属性の更新はしていない。

OAuth 2.0 Server仕様

概要

概ね、ASP.NET Identityに準拠。

については、「ASP.NET IdentityによるSTS実装」を参照。

Access Token

オプション

以下の動作を設定可能。

  • AccessToken?のフォーマットを、
    • JWT形式にするか(true)
    • ASP.NET Identity形式にするか(false)
  • Refresh Tokenの機能のロックダウン

フォーマット

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

Server側

AuthorizationServer?

ResourceServer?

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

Client側

スターターのパラメタ

  • scope指定
  • 特殊なscope
    • auth
      認証用途の場合、認可画面をスキップする。
    • userid
      ユーザの主キー(guid)を連携する場合に指定する。
  • state指定
    AccessToken?のフォーマットがJWT形式の場合に必須
    (ID Tokenのnonce Claimにstate値を設定するため)。
  • nonce指定
    OpenID Connectの場合に必須
    (ID Tokenのnonce Claimにnonce値を設定するため)。

ResourceServer?のWeb APIへのアクセス

  • /userinfo
  • ResourceServer?リソース・アクセス用のWeb APIにアクセスする場合、
    Access Tokenを"Authorization: Bearer" HTTPヘッダに指定して送信する。

認証

https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth#wdad8a4e

クライアント認証

ここでの"クライアント"とは、"ユーザ"の事ではなく、
OAuth 2.0 のClientを指しているので注意する。

  • クライアント認証は、Tokenエンドポイントにアクセスする際に行なう。
  • ベーシック認証の認証ヘッダを使用してクライアント識別子を送信する。
  • クライアント識別子
    • client_id
      • 全てのグラント種別以外で必須
      • GUID(32文字の英数字、URLに指定するので、[{}, -] は無し)を使用。

ユーザ認証

  • 使用するグラント種別
    • できるだけ、Authorization Codeグラント種別を使用する。
      = response_typeには、"code"(推奨) or "token"を指定する。
  • Implicitグラント種別もサポートするが、その場合、
  • Token
    • 認証されたユーザに対してAccess Tokenを発行する。
    • Access TokenのフォーマットにJWTを使用した場合、
      • ASP.NET Identityに限らずAccess Tokenの利用が可能。
      • JWTアサーションを検証できるため、OAuthの脆弱性の問題を回避可能。

OpenID Connect Server仕様

  • OAuth2.0の
    • Authorization Codeグラント種別
    • Implicitグラント種別

を、

  • OpenID Connectの
    • Authorization Code Flow(response_type=code)
    • Implicit Flow((response_type=id_token token, id_token)

に拡張している。

  • OAuth 2.0 Serverと、HTTPModuleの書き換え機能により、
    • AccessToken?に使用するJWTアサーションを編集してID Token化している。
    • なので、AccessToken?フォーマットはJWTのモードで動かす必要がある。

管理機能

管理者アカウント

システム管理者アカウントサインインして管理操作を実行できる。

ユーザ・ロール編集処理

管理画面についての詳細はこちら

所有権

所有権の無いオブジェクトに対する操作ができないことを確認する。

  • 特に、テナント管理者がGUIDのコピペや直打ちなどを行っても、
    他テナントのオブジェクトは絶対に操作できないことを確認する。

例外

所有者はCRUD可能、非所有者はCRUD不可能の例外。

  • ユーザ
    • システム管理者アカウント
      所有権は自分にしか無いが、更新(編集・削除)は不可能。
  • テナント管理者アカウント
    • システム管理者アカウント
      所有権は有るが、更新(編集・削除)は不可能。
    • テナント管理者アカウント
      所有権は自分にしか無いが、更新(編集・削除)は不可能。
  • ロール
    • グローバル ロール
      • システム管理者アカウント
        所有権は無いが、一覧・詳細表示のみ可能にしてある。更新(編集・削除)は不可能。
      • テナント管理者アカウント
        所有権は無いが、一覧表示のみ可能にしてある。詳細表示、更新(編集・削除)は不可能。

エラーメッセージ

表示元

ASP.NET MVCのModel Bindingの検証機能によるもの。

  • 検証項目と内容については、各画面で使用しているViewModelを参照のこと。
  • 既定値
    以下のような属性では、既定のエラーメッセージを使用。
    • [EmailAddress?]
    • [Required(AllowEmptyStrings? = false or truw)]
  • カスタムのエラーメッセージ
    以下のような属性では、カスタム(Resourcesファイルである*View.resxに定義されている)のエラーメッセージを使用。
    [StringLength(
    ASPNETIdentityConst.MaxLengthOfPassword,
    ErrorMessageResourceName = "MaxLengthErrMsg",
    ErrorMessageResourceType = typeof(Resources.CommonViewModels))]

ASP.NET Identityによるもの。

サーバー・サイド実装によるもの。

表示先

ASP.NET MVCのModel Bindingの検証機能によるもの。

  • div-ul-liタグが用意され、ソコにエラーメッセージが表示される。
    <div class="validation-summary-valid text-danger" data-valmsg-summary="true"><ul><li style="display:none"></li></ul></div>
  • 入力項目の横に表示する場合、
    • Html.ValidationMessageFor?を使用すれば、
      @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
      @Html.ValidationMessageFor(m => m.Password, new { @class = "text-danger" })
  • 入力項目の横にspanが用意され、ソコにエラーメッセージが表示される。
    <input class="form-control" data-val="true" data-val-length="パスワード の長さは 100 文字以下である必要があります。" data-val-length-max="100" data-val-required="パスワード フィールドが必要です。" id="Password" name="Password" type="password" />
    <span class="field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span>
  • 表示例
    • サマリ領域に表示する場合、
      サマリ領域に表示したエラーメッセージ
    • 入力項目の横に表示する場合、
      入力項目の横に表示したエラーメッセージ

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

パラメタ化

使用するパラメタについて、コチラに纏めた。

参考

GDPR対策


添付ファイル: fileErrMsg2.png 45件 [詳細] fileErrMsg1.png 44件 [詳細] fileErrMsg.png 23件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-30 (月) 16:47:17 (79d)