- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁>https://github.com/OpenTouryoProject]] wiki
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。
-[[戻る>Multi-AuthSystem]]
*目次 [#dcb3fd61]
#contents
*概要 [#nc044def]
Multi-AuthSystemの独自仕様部分について説明する。
*Idp仕様 [#f22a150e]
Idpの使用について。
**概要 [#wd87156a]
概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「[[ASP.NET Identity>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity]]」を参照。
**カスタマイズポイント [#ka88ee84]
***ユーザアカウント [#k6db9b9b]
-UserId = e-mail address = UserNameとする。
-Passwordの強度は[[下記の設定>#o1461750]]に従う。
***UserStore [#i2673e47]
-EntityFrameworkをキャンセルしUserStoreクラスで実装。
-DBMSはSQL Server or PostgreSQLを使用。
-Open棟梁のB・D層を使用してデータアクセスを実装。
**スキーマ [#v25455ef]
***DDL [#qae35401]
***編集処理 [#d2f64093]
**パラメタ化 [#r1e165ea]
ASP.NET Identityや、その他、アプリケーションで使用するパラメタについて。
***SecurityStamp [#jbf899e3]
<!-- SecurityStamp(検証間隔は10秒、本番は長めに設定-->
<add key="SecurityStampValidateIntervalFromSeconds" value="10" />
***ユーザ名と、その検証 [#sa21d6af]
<!--ユーザ名検証(ユーザ名は、E-mail-->
<add key="AllowOnlyAlphanumericUserNames" value="false" />
<add key="RequireUniqueEmail" value="true" />
***パスワード検証 [#o1461750]
<!--パスワード検証(8文字以上の大文字・小文字、数値、記号-->
<add key="RequiredLength" value="8" />
<add key="RequireNonLetterOrDigit" value="true" />
<add key="RequireDigit" value="true" />
<add key="RequireLowercase" value="true" />
<add key="RequireUppercase" value="true" />
***ユーザ ロックアウト [#d2e5eeb0]
<!--ユーザ ロックアウト(5 回入力ミスすると、5分ロックアウト-->
<add key="UserLockoutEnabledByDefault" value="true" />
<add key="DefaultAccountLockoutTimeSpanFromSeconds" value="300" />
<add key="MaxFailedAccessAttemptsBeforeLockout" value="5" />
***二要素認証 [#l00dc60b]
<!-- 二要素認証(2FA:TwoFactorAuthentication)-->
<!-- 必要に応じてユーザが有効にするので初期値は false -->
<add key="TwoFactorEnabled" value="false" />
<!-- Cookieの有効期限は二週間 24 * 14 = 336 時間 -->
<add key="TwoFactorCookieExpiresFromHours" value="336" />
*外部ログイン仕様 [#x776e104]
**概要 [#f65ac880]
概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「[[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]]」を参照。
**カスタマイズ・ポイント [#e9fe9083]
外部ログイン処理の仕様について。
***外部ログイン・サービス [#h32fa513]
-Microsoft
-Google
-Facebook
-Twitter
***e-mail検証 [#idf3eb5e]
-外部ログイン処理で取得したe-mail addressは検証しない。
-e-mail addressでサインアップして、そのままサインインする。
***外部ログインでサインアップ [#z90095f1]
-サインアップを外部ログインで行った場合、パスワードを持たないアカウントになる。
-この場合、後からパスワードリセットを行なうことでPasswordを設定できる。
**パラメタ化 [#p283d193]
以下のように各、外部ログイン・プロバイダの
-有効化・無効化
-クライアント認証のための[[クライアント識別子>#a5eeec1b]]
を設定できる。
<!-- 外部ログインの追加時に XSRF の防止 -->
<add key="XsrfKey" value="(サイト毎にで変更する、公開しないこと)" />
<!--外部ログイン(MicrosoftAccountAuthentication)-->
<add key="MicrosoftAccountAuthentication" value="true" />
<add key="MicrosoftAccountAuthenticationClientId" value="・・・" />
<add key="MicrosoftAccountAuthenticationClientSecret" value="・・・" />
<!--外部ログイン(GoogleAuthentication)-->
<add key="GoogleAuthentication" value="true" />
<add key="GoogleAuthenticationClientId" value="・・・" />
<add key="GoogleAuthenticationClientSecret" value="・・・" />
<!--外部ログイン(FacebookAuthentication)-->
<add key="FacebookAuthentication" value="true" />
<add key="FacebookAuthenticationClientId" value="・・・" />
<add key="FacebookAuthenticationClientSecret" value="・・・" />
***設定値の取得方法など [#q0df534d]
[[クライアント識別子>#a5eeec1b]]は、外部ログイン・サービスの管理画面から取得する。
合わせてここでRedirectエンドポイントの設定などを行う必要がある。~
これは、外部ログイン・サービス毎に設定方法が異なるので注意する。
例えばマイクロソフト・アカウントでは、以下の様な設定を行う。、
https://fqdnname:nnnnn/signin-microsoft
外部ログイン・サービスによっては、httpやlocalhostをサポートしないことがある。
***XsrfKey [#ac657ea9]
-asp.net mvc 5 - What is the XsrfKey used for and should I set the XsrfId to something else? - Stack Overflow~
http://stackoverflow.com/questions/32121504/what-is-the-xsrfkey-used-for-and-should-i-set-the-xsrfid-to-something-else
XsrfKeyは、XSRF = CSRFを防ぐためのstateパラメタの生成に使用される。~
stateパラメタは暗号化によって生成されるので、XsrfKey自体が露見することはない。~
従って、この値としても、無作為な値を使用する必要はない。
*OAuth 2.0 Server仕様 [#jc794866]
**概要 [#m5d1767f]
概ね、ASP.NET Identityに準拠。
-ASP.NET Identity側の仕様
-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]]」を参照。
**共通 [#x3169086]
***Server側 [#m3bdee3f]
-AuthorizationServer
--認可エンドポイント
---redirect_uriチェックは不要(部分一致をサポートしない完全事前登録制とするため)
--Tokenエンドポイント(Access Tokenの発行方法)
---scope=その他の値の場合、scopeパラメタ値をClaimに格納する(通常の動作)。
-ResourceServer
--リソース・アクセス用のWebAPIを提供する。
---"urn:oauth:scope"のClaimがあった場合、scopeの値に適合した範囲のアクセス権で処理を行う。
***Client側 [#r1ee86fd]
-パラメタ
--redirect_uri指定は不要(部分一致をサポートしない完全事前登録制とするため)
--stateの使用を強く推奨する(Access Token露見は、Client側の自己責任のため)。
-ResourceServerリソース・アクセス用のWebAPIにアクセスする場合、
--Access TokenをHTTPヘッダに指定して送信する。
***Access Tokenへの情報格納方法 [#ua3f247e]
ClaimsIdentityを使用する。以下のようなURN形式をkeyに使用してvalueの追加を行う。
-"scope=auth"の場合(Access Tokenが[[ユーザ認証>#wc68d5c6]]用であることを意味する。
claimsIdentity.AddClaim(new Claim("urn:oauth:auth", client_id));
-"scope=その他の値"の場合、
claimsIdentity.AddClaim(new Claim("urn:oauth:scope", scope));
**クライアント認証 [#g36cdbd4]
ここでのクライアントとは、ユーザではなく、[[OAuth>https://techinfoofmicrosofttech.osscons.jp/index.php?OAuth]] 2.0 のClientを指しているので注意する。
-認可エンドポイントでは、クライアント認証ではなく、Redirectエンドポイントの検証を行う。
-クライアント認証は、Tokenエンドポイントにアクセスする際に行なう。
-ベーシック認証の認証ヘッダを使用して[[クライアント識別子>#a5eeec1b]]を送信する。
***クライアント識別子 [#a5eeec1b]
-GUIDを使用する
--32文字の英数字。
--URLに指定するので、[{}, -] は無し。
-client_id~
全てのグラント種別以外で必須
-client_secret
--Implicitグラント種別以外で必須
--ただし、[[ユーザ認証>#wc68d5c6]]で使用する場合は、Implicitグラント種別でも必須。
**ユーザ認証 [#wc68d5c6]
-ユーザ認証に利用する場合、以下の拡張仕様に準拠する。
-[[クライアント識別子>#a5eeec1b]]は全てのグラント種別で必須となる。
***Server側 [#ccacfafd]
-AuthorizationServer
--Tokenエンドポイント(Access Tokenの発行方法)
---scope=authの場合、client_idをClaimに格納し、Access Tokenがユーザ認証用であることを明示する。
-ResourceServer
--ユーザ認証専用のWebAPIを提供する。
---"urn:oauth:auth"のClaimがあった場合、Access Tokenがユーザ認証用であることを意味する。
---この場合、POSTされた[[クライアント識別子>#a5eeec1b]]でクライアント認証をした後、~
そのClaim値とclient_idを比較してTokenに問題がないかをチェックする。
***Client側 [#x687be6c]
-グラント種別
--できるだけ、Authorization Codeグラント種別を使用する。
--Implicitグラント種別もサポートするが、その場合、~
ユーザ認証用Access Tokenと[[クライアント識別子>#a5eeec1b]]の露見のリスクがあることに注意すること。
-パラメタ
--response_typeには、"code"(推奨) or "token"を指定する。
--ユーザ認証を行なう場合、scopeパラメタに"auth"を指定する。
-ResourceServerのユーザ認証専用のWebAPIにアクセスする場合、
--ユーザ認証用Access Tokenに加え、前述の[[クライアント識別子>#a5eeec1b]]をPOSTで送信する。
***ResourceServerのWebAPI [#q45fd27c]
-認証専用のWebAPI
--/api/OAuthResourceApi/GetAuthenticatedUsersClaim
-リソース・アクセス用のWebAPI
--/api/OAuthResourceApi/XXXXX
**パラメタ化 [#t2745f68]
***共通設定 [#l76fce40]
<add key="EquipOAuthServer" value="true" />
<add key="OAuthIssuerId" value="IssuerId:サイト毎にGUIDの32文字を生成して設定" />
<add key="AllowOAuthInsecureHttpEndpoints" value="true" />
<add key="OAuthAuthorizeEndpointCanDisplayErrors" value="true" />
<add key="OAuthAccessTokenExpireTimeSpanFromMinutes" value="360" />
***Server側エンドポイント [#ea36e6a5]
Multi-AuthSystemが保有するServer側エンドポイントなので、相対パスで良い。
<!-- 認可エンドポイント -->
<add key="OAuthAuthorizeEndpoint" value="/Account/OAuthAuthorize" />
<!-- Tokenエンドポイント -->
<add key="OAuthBearerTokenEndpoint" value="/OAuthBearerToken" />
<!-- ResourceServerエンドポイント -->
<add key="OAuthAuthenticateAPI" value="/api/OAuthResourceApi/Authenticate" />
<add key="OAuthAuthorizedUserClaimAPI" value="/api/OAuthResourceApi/GetAuthorizedUserClaim" />
***Client側エンドポイント [#e0e7e9ba]
Client側エンドポイントだが、Multi-AuthSystemが保有する[[テスト用セルフRedirectエンドポイント>#aad531ea]]なので、相対パスで良い。
<!-- テスト用セルフRedirectエンドポイント -->
<!-- - test_self_code : Authorization Codeグラント種別 -->
<add key="OAuthAuthorizationCodeGrantClient" value="/Account/OAuthAuthorizationCodeGrantClient" />
<!-- - test_self_token : Implicitグラント種別 -->
<add key="OAuthImplicitGrantClient" value="/Account/OAuthImplicitGrantClient" />
***[[クライアント識別子>#a5eeec1b]] [#ic5d0bd8]
以下をツールを使用して生成して、登録する。
-"client_name": "hogehoge0"以降の[[クライアント識別子>#a5eeec1b]]がユーザのサイトのもの。
-それ以前の[[クライアント識別子>#a5eeec1b]]は、[[テスト用セルフRedirectエンドポイント>#aad531ea]]テスト用のクライアント識別子。
<!-- クライアント識別子 (client_id, client_secret, redirect_uri) -->
<add key="OAuthClientsInformation" value='
{
"client_idとしてサイト毎にGUIDの32文字を生成して設定": {
"client_secret": "client_secretとしてサイト毎にGUIDの32文字を生成して設定",
"redirect_uri_code": "test_self_code",
"redirect_uri_token": "test_self_token",
"client_name": "TestUser"
},
"client_idとしてサイト毎にGUIDの32文字を生成して設定": {
"client_secret": "client_secretとしてサイト毎にGUIDの32文字を生成して設定",
"redirect_uri_code": "http://hogehoge0/aaa",
"redirect_uri_token": "http://hogehoge0/bbb",
"client_name": "hogehoge0"
},
・・・
}
' />
**テスト用セルフRedirectエンドポイント [#aad531ea]
***test_self_code [#f4feb0c0]
-Authorization Codeグラント種別を検証するRedirectエンドポイント。
-用途はテスト用(本番用には使用しないこと)
--Access TokenやRefresh Tokenを含むHTMLをreturnする。~
(あくまで検証用であり、本番ではTokenをreturnしないこと)
--サーバ側でResourceServerにアクセスした結果を含むHTMLをreturnする。
***test_self_token [#yffc7bb2]
-Implicitグラント種別を検証するRedirectエンドポイント。
-用途はテスト用(本番用には使用しないこと)
--Access Tokenを含むHTML+JavaScriptをreturnする。
--User-Agentやスマホネイティブは、~
このAccess Tokenを使用してResourceServerにアクセスできる。