「[[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] 以下のように、主に[[サインアップ・プロセス>#rc86b3dc]]に影響を与える。 -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アドレスを準備するなどとする。 -その他、 --[[ユーザ名変更>#o0947cd8]] --[[外部ログイン>#w534c815]] >の動作にも影響を与える。 **利用するサービス [#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 --Passwordの強度は[[コチラの設定>汎用認証サイトのコンフィギュレーション#pca79851]]に従う。 --当然、[[ライブラリにて適切にハッシュ化>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ASPNETIdentity/Manager/CustomPasswordHasher.cs]]されてからUserStoreに保存される。 -その他 --[[スキーマ>#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]]によって動作が大きく異る。 -管理画面についての詳細は[[こちら>#ga313890]]。 **サインアップ・サインイン [#oe564461] ***サインアップとE-mailアドレス確認 [#rc86b3dc] 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アドレス確認メールは飛ぶ(レコードが再生成されないのでパスワードは古いまま)。 --パスワードを失念した場合、 ---上記の「サインアップを繰り返す」を行えばサインアップできる。 ---若しくは、[[パスワード・リセット>#f88a0fb5]]を行えばサインアップできる。 ***サインイン・サインアウト [#l4470148] -通常通りサインアップする。 -[[Passwordの強度>#b725e4d1]]を満たさない場合、エラーとなることを確認する。 ***パスワード・リセット [#f88a0fb5] -パスワードを失念した場合、パスワード・リセットを行う。 -[[Passwordの強度>#b725e4d1]]を満たさない場合、エラーとなることを確認する。 -サインアップ時のE-mailアドレスの確認(E-mail confirmation)前にパスワードを失念した場合にも使用可能。 **アカウント編集 [#sc966644] ***ユーザ名 [#o0947cd8] -アカウント編集でユーザ名を変更 -UserName = E-mailアドレス の場合、~ E-mailアドレスの確認(E-mail confirmation)が必要。 ***パスワード [#u4227d89] -アカウント編集でパスワードを設定・変更 --変更 --設定([[外部ログイン>#w534c815]]後、ローカル・ログオンを可能にする場合) -[[Passwordの強度>#b725e4d1]]を満たさない場合、エラーとなることを確認する。 ***E-mailアドレス [#haeb62dc] -アカウント編集でE-mailアドレスを設定・削除 -UserName = E-mailアドレス の場合に表示される。 -E-mailアドレスの確認(E-mail confirmation)が必要。 --リンクを実行しない場合、E-mailアドレス設定が正常終了しない。 --リンクを実行した場合、E-mailアドレス設定が正常終了する。 ***電話番号 [#p3aec882] -アカウント編集で電話番号を設定・削除 -[[通知プロバイダのSMS>汎用認証サイト(Multi-purpose Authentication Site)#j3aea225]]で通知を行い、受信したコードを入力する。 --誤ったコードを入力した場合、電話番号設定が正常終了しない。 --正しいコードを入力した場合、電話番号設定が正常終了する。 ***[[2要素認証(2FA)>#w7ba6fad]] [#b2ceb7bb] -アカウント編集で[[2要素認証(2FA)>#w7ba6fad]]をON/OFFする。 -[[2要素認証(2FA)>#w7ba6fad]]のプロセスについては[[後述>#w7ba6fad]]する。 ***[[外部ログイン>#w534c815]] [#z8a5ebd4] [[外部ログイン>#w534c815]]の一覧表示と追加・削除 ***[[オンライン決済サービス>汎用認証サイト(Multi-purpose Authentication Site)#qf3fddd8]] [#hb5e1c33] -[[オンライン決済サービスとしては、StripeとPAY.JPを *.config で設定可能>汎用認証サイトのコンフィギュレーション#p10405d7]]。 -設定が有効な場合、クレジット・カード情報などの支払い元情報が設定できる。 -登録したクレジット・カード情報を利用してオンライン決済サービスを使用する。 -[[Debugモード>汎用認証サイトのコンフィギュレーション#v443d7eb]]の場合、オンライン決済サービスで決済されることを確認する。 ***属性データ(非定型データ) [#z9bb4735] -属性データ(非定型データ)をメンテナンスする。 -JSON形式での情報格納を想定しているので、スキーマ(DDL)変更は不要。 ***OAuth2データ [#icfa3463] ユーザ毎に、 -client_id -client_secret -redirect_uri(code) -redirect_uri(token) のデータを設定し、 OAuth2アクセストークンを取得可能。 **運用系機能 [#q853018f] ***パスワード・リセット [#t06f7341] -通常のパスワード・リセットのシナリオ。 -例外的に以下のシナリオで使用する。 --初回サインアップ時のパスワードを失念した場合のシナリオ。 --[[外部ログイン>#w534c815]]後、ローカル・ログオンを可能にするシナリオ。 **セキュリティ強化機能 [#df6f9e87] ***アカウント・ロックアウト [#tdca397b] [[指定回数、ログインをミスすると、指定時間ロックアウトされる。>汎用認証サイトのコンフィギュレーション#p523874d]] ***SecurityStamp [#vbd67fbf] -アカウント編集(ユーザ属性の変更)後のアクセスがサインアウトされる。 -アカウント編集後にサインアウト・サインインする実装になっている理由はコレ。 ***2要素認証 [#w7ba6fad] -アカウント編集で2要素認証をONにする。 -別のブラウザからログイン試行を行う~ (2要素認証ではCookieでブラウザを記憶するため)。 -すると通知プロバイダを選択したコードを送信が行われる。 -選択した通知プロバイダで通知を行い、受信したコードを入力する。 --誤ったコードを入力した場合、2要素認証が正常終了しない。 --受信したコードを入力して2要素認証が正常終了する。 **[[管理機能>#ga313890]] [#teb4f351] *外部ログイン仕様 [#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]]」を参照。 -サインアップ・サインインも可能。 -基本的には、[[UserName = E-mailアドレス>#gbd5af06]] **カスタマイズ・ポイント [#n861c0bc] 外部ログイン処理の仕様について。 ***外部ログイン設定 [#m1ac1110] [[外部ログインと、外部ログイン・サービスを設定する。>汎用認証サイトのコンフィギュレーション#uc4663b1]] -[[RequireUniqueEmailスイッチ>#gbd5af06]] --[[UserName = E-mailアドレス>#gbd5af06]]で動作する。 --[[UserName ≠ E-mailアドレス>#gbd5af06]]での外部ログインとの親和性は低い。 ---通常、サインアップ画面を提供せず、管理者がアカウント(E-mailアドレス)を準備する。 ---殆どのIdPではE-mailを使用しており、オプションで使用しているUserNameがIdP間で一致していないことが多いため。 ---IdP間を跨ぐ場合、UserNameの一意性は保証されないので、結局、E-mailアドレス確認(E-mail confirmation)されたE-mailに頼る必要がある。 -XsrfKey~ XSRF(=CSRF)を防ぐためのstateパラメタの生成に使用される。 -外部ログイン・サービス --Microsoft --Google --Facebook --Twitter ***外部ログインでサインアップ [#cd8169dc] サインアップを外部ログインで行った場合、 -パスワードを持たないアカウントになる。 -この場合、後からパスワードを設定することで、ローカル・ログオンが可能になる。 --アカウント編集画面でパスワード追加する。 --パスワード・リセットを行なう。 -E-mailアドレスの確認(E-mail confirmation) --外部ログイン処理で取得したE-mailアドレスは確認しない。~ (信頼するIdPのSTSで連携されたE-mailアドレスであるため) --E-mailアドレスでサインアップして、そのままサインインする。 ***外部ログインでサインイン [#rcf9978e] -ローカル・ログインに外部ログインを重ねるパターンと、~ 外部ログインに外部ログインを重ねるパターンとがある。 -サインインを外部ログインで行った場合、 --既存のアカウントにID連携でサインインできる。 --ID連携で必要なクレーム(属性値)を連携して上書きできる。 --なお、UserNameやE-mailなど、ID連携で変更できない属性値もある。 ***外部ログインの一覧と削除 [#hbd8d5db] -サインアップ済みの状態から外部ログインの追加 → 削除~ 外部ログイン削除後のタイミングで、ログアウトしていないのは、~ 代替のログイン手段を持っているため問題無いということ。 -サインアップせずに、外部ログインの追加 → 削除~ --ローカル・ログオンを可能にしていない場合、最後の外部ログインを削除できなくなる。 --後からパスワードを設定することでローカル・ログオンを有効化すれば外部ログインを削除できる。 ***外部ログインの詳細 [#g27b9c4f] ExternalLoginCallbackの条件分岐 -AccountController~ https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Controllers/AccountController.cs#L1015 --(1) 外部ログインの成否 ---失敗(異常終了) ---成功、(2) へ。 --(2) 外部ログインの有・無 ---既存の外部ログインがある → クレームを更新してサインイン(正常終了) ---既存の外部ログインがない →新規の外部ログインの追加、(3) へ。 --(3) 外部ログインの追加 ---当該ユーザが既にサインアップされている。~ → 外部ログイン、クレームを追加してサインイン(正常終了) ---当該ユーザが未だサインアップされていない。~ → サインアップ後に外部ログイン、クレームを追加してサインイン(正常終了) -ManageController~ https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Controllers/ManageController.cs#L1295 --(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]]」を参照。 **Access Token [#d98eac8c] ***[[オプション>汎用認証サイトのコンフィギュレーション#ibb02bb6]] [#lc5d4e8d] 以下の動作を設定可能。 -AccessTokenのフォーマットを、 --[[JWT>https://techinfoofmicrosofttech.osscons.jp/index.php?JWT]]形式にするか(true) --ASP.NET Identity形式にするか(false) -Refresh Tokenの機能のロックダウン ***フォーマット [#pd6b84f4] -[[Access TokenのフォーマットにJWTアサーションを採用する場合>#lc5d4e8d]]、 --この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)); **Server側 [#odd02418] ***AuthorizationServer [#w6bfa0f1] -認可エンドポイント --redirect_uriチェック~ https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ASPNETIdentity/TokenProviders/ApplicationOAuthBearerTokenProvider.cs#L93~ ---redirect_uriが存在しない場合、事前登録のredirect_uriを使用する。~ ---redirect_uriが存在する場合、「特定エンドポイント」or「事前登録の前方一致」のみ許可する。 -Tokenエンドポイント --[[Access Tokenの発行方法>#d98eac8c]] ***ResourceServer [#r93ef795] -リソース・アクセス用のWeb APIを提供する。 **Client側 [#y0f2a018] ***スターターのパラメタ [#l2f0bff9] -[[redirect_uri指定>#w6bfa0f1]] -state指定~ AccessTokenのフォーマットがJWT形式の場合に必須(ID Tokenのnonce Claimにstate値を設定するため)。 ***ResourceServerのWeb APIへのアクセス [#s462f278] -/userinfo -ResourceServerリソース・アクセス用のWeb APIにアクセスする場合、~ Access Tokenを"Authorization: Bearer" HTTPヘッダに指定して送信する。 **認証 [#h0c6554b] https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth#wdad8a4e ***クライアント認証 [#g7ed260c] ここでの"クライアント"とは、"ユーザ"の事ではなく、~ [[OAuth>https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth]] 2.0 のClientを指しているので注意する。 -クライアント認証は、Tokenエンドポイントにアクセスする際に行なう。 -ベーシック認証の認証ヘッダを使用してクライアント識別子を送信する。 -クライアント識別子 --client_id ---全てのグラント種別以外で必須 ---GUID(32文字の英数字、URLに指定するので、[{}, -] は無し)を使用。 --client_secret ---Implicitグラント種別以外で必須 ---乱数([[GetPassword.Base64UrlSecret>https://github.com/OpenTouryoProject/OpenTouryo/blob/master/root/programs/C%23/Frameworks/Infrastructure/Public/Util/GetPassword.cs#L55]](32)) ***ユーザ認証 [#k61b5f5a] -使用するグラント種別 --できるだけ、Authorization Codeグラント種別を使用する。~ = response_typeには、"code"(推奨) or "token"を指定する。 --Implicitグラント種別もサポートするが、その場合、 ---[[クライアント識別子>#g7ed260c]]と、[[ユーザ認証>#k61b5f5a]]用Access Tokenの~ 露見のリスクがあることに注意すること(若しくはキャプチャ可能)。 -Token --認証されたユーザに対してAccess Tokenを発行する。 --Access TokenのフォーマットにJWTを使用した場合、 ---ASP.NET Identityに限らずAccess Tokenの利用が可能。 ---JWTアサーションを検証できるため、OAuthの脆弱性の問題を回避可能。 *管理機能 [#ga313890] **管理者アカウント [#ba05d72a] (管理者アカウントで)サインインして管理操作を実行できる。 ***[[マルチテナント化している場合>#j6087e30]] [#yf110a39] -システム管理者アカウント -テナント管理者アカウント~ (サインアップしたアカウント) でのみ操作可能。 ***[[マルチテナント化していない場合>#j6087e30]] [#x0f419d6] システム管理者アカウント でのみ操作可能。 **オブジェクトの所有権 [#c4c422b0] ユーザ・ロールの所有権は、マルチテナント・モードで重要になる。 ***[[マルチテナント化している場合>#j6087e30]] [#h8823a4f] -テナント管理者アカウント --ユーザ ---当該テナントのユーザ --ロール ---当該テナントのロール ---グローバル・ロールの所有権はないが、一覧表示のみ可能にしてある。~ CR(詳細表示)UDは不可能のため、他テナントのユーザが表示されることも無い。 -システム管理者アカウント --ユーザ ---システム全体のユーザ ---テナント管理者アカウントの所有権はあるが、更新(編集・削除)は不可能。 --ロール ---システム全体のロール ---グローバル・ロールの所有権はないが、~ 一覧・詳細表示のみ可能にしてある。更新(編集・削除)は不可能。 ***[[マルチテナント化していない場合>#j6087e30]] [#r3910027] -システム管理者アカウント --ユーザ ---システム全体のユーザ --ロール ---システム全体のロール ---グローバル・ロールの所有権はないが、~ 一覧・詳細表示のみ可能にしてある。更新(編集・削除)は不可能。 **ユーザ・ロール編集処理 [#ue4c3ec1] 管理画面についての詳細は[[こちら>汎用認証サイトのファーストステップガイド (2)#f0c1d26f]]。 ***所有権 [#mdc9531e] 所有権の無いオブジェクトに対する操作ができないことを確認する。 -特に、テナント管理者がGUIDのコピペや直打ちなどを行っても、~ 他テナントのオブジェクトは絶対に操作できないことを確認する。 ***例外 [#ge834113] 所有者はCRUD可能、非所有者はCRUD不可能の例外。 -ユーザ --システム管理者アカウント~ 所有権は自分にしか無いが、更新(編集・削除)は不可能。 --テナント管理者アカウント ---システム管理者アカウント~ 所有権は有るが、更新(編集・削除)は不可能。 ---テナント管理者アカウント~ 所有権は自分にしか無いが、更新(編集・削除)は不可能。 -ロール --グローバル ロール ---システム管理者アカウント~ 所有権は無いが、一覧・詳細表示のみ可能にしてある。更新(編集・削除)は不可能。 ---テナント管理者アカウント~ 所有権は無いが、一覧表示のみ可能にしてある。詳細表示、更新(編集・削除)は不可能。 *エラーメッセージ [#r932c23a] **表示元 [#ee798d72] ***ASP.NET MVCのModel Bindingの検証機能によるもの。 [#m16451b3] -[[ASP.NET MVCのModel Bindingの検証機能>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20MVC%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95#za7f960c]]による単項目チェックを使用。~ (Compare属性など、一部、関連チェック相当の検証機能もある)。 -検証項目と内容については、各画面で使用している[[ViewModel>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/tree/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ViewModels]]を参照のこと。 -エラーメッセージ~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Models/ViewModels/AccountRegisterViewModel.cs --既定値~ 以下のような属性では、既定のエラーメッセージを使用。 ---[EmailAddress] ---[Required(AllowEmptyStrings = false or truw)] --カスタムのエラーメッセージ~ 以下のような属性では、カスタム([[Resourcesファイル>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/tree/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Resources]]である*View.resxに定義されている)のエラーメッセージを使用。 [StringLength( ASPNETIdentityConst.MaxLengthOfPassword, ErrorMessageResourceName = "MaxLengthErrMsg", ErrorMessageResourceType = typeof(Resources.CommonViewModels))] ***ASP.NET Identityによるもの。 [#sbc65d2d] -ASP.NET Identityが返すエラーメッセージ(IdentityResult.Errors)をそのまま利用する。~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Controllers/AccountController.cs#L379 --既にサインアップしている場合 --パスワード要件に合わない場合 ***サーバー・サイド実装によるもの。 [#u70f84f3] -アプリケーションのエラーメッセージを表示する。~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Controllers/AccountController.cs#L220 --ModelState.AddModelErrorで検索する。 --エラーメッセージは、[[Resourcesファイル>https://github.com/OpenTouryoProject/MultiPurposeAuthSite/tree/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Resources]]である*Controller.resxに定義されている。 **表示先 [#r0e2defe] ***[[ASP.NET MVCのModel Bindingの検証機能によるもの。>#m16451b3]] [#z3d7d0e1] -表示位置 --サマリ領域に表示する場合(既定の実装)、 ---Html.ValidationSummaryを使用すれば、~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Views/Account/Register.cshtml#L45 @Html.ValidationSummary("", new { @class = "text-danger" }) ---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> -表示例 --サマリ領域に表示する場合、 #ref(ErrMsg1.png,left,nowrap,サマリ領域に表示したエラーメッセージ) --入力項目の横に表示する場合、 #ref(ErrMsg2.png,left,nowrap,入力項目の横に表示したエラーメッセージ) ***[[ASP.NET Identityによるもの。>#sbc65d2d]] [#yc9c7b31] サーバー・サイドのチェック結果が、サマリ領域(Html.ValidationSummary)に表示される。~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Views/Account/Register.cshtml#L45 @Html.ValidationSummary("", new { @class = "text-danger" }) ***[[サーバー・サイド実装によるもの。>#u70f84f3]] [#ef3d946e] サーバー・サイドのチェック結果が、サマリ領域(Html.ValidationSummary)に表示される。~ 例 : https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/MultiPurposeAuthSite/MultiPurposeAuthSite/Views/Account/Register.cshtml#L45 @Html.ValidationSummary("", new { @class = "text-danger" }) *[[パラメタ化>汎用認証サイトのコンフィギュレーション]] [#fe16f728] -[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]や、 -[[汎用認証サイト>汎用認証サイト(Multi-purpose Authentication Site)]]のアプリケーションで 使用するパラメタについて、[[コチラ>汎用認証サイトのコンフィギュレーション]]に纏めた。