Open棟梁 wiki
Multi-AuthSystem?の独自仕様部分について説明する。
Idpの使用について。
概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「ASP.NET Identity」を参照。
ASP.NET Identityや、その他、アプリケーションで使用するパラメタについて。
<!-- SecurityStamp(検証間隔は10秒、本番は長めに設定--> <add key="SecurityStampValidateIntervalFromSeconds" value="10" />
<!--ユーザ名検証(ユーザ名は、E-mail--> <add key="AllowOnlyAlphanumericUserNames" value="false" /> <add key="RequireUniqueEmail" value="true" />
<!--パスワード検証(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" />
<!--ユーザ ロックアウト(5 回入力ミスすると、5分ロックアウト--> <add key="UserLockoutEnabledByDefault" value="true" /> <add key="DefaultAccountLockoutTimeSpanFromSeconds" value="300" /> <add key="MaxFailedAccessAttemptsBeforeLockout" value="5" />
<!-- 二要素認証(2FA:TwoFactorAuthentication)--> <!-- 必要に応じてユーザが有効にするので初期値は false --> <add key="TwoFactorEnabled" value="false" /> <!-- Cookieの有効期限は二週間 24 * 14 = 336 時間 --> <add key="TwoFactorCookieExpiresFromHours" value="336" />
「≒」としたのは、外部ログインの主要プロトコルがOAuth 2.0であって、
今後、OpenID Connectなどの他のプロトコルに置き換えられていく可能性があるため。
概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「ASP.NET Identityの外部ログイン」を参照。
外部ログイン処理の仕様について。
以下のように各、外部ログイン・プロバイダの(OAuth等)の
を設定できる。
<!-- 外部ログインの追加時に 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="・・・" />
クライアント識別子は、外部ログイン・サービスの管理画面から取得する。
合わせてここでRedirectエンドポイントの設定などを行う必要がある。
これは、外部ログイン・サービス毎に設定方法が異なるので注意する。
例えばマイクロソフト・アカウントでは、以下の様な設定を行う。、
https://fqdnname:nnnnn/signin-microsoft
外部ログイン・サービスによっては、
httpやlocalhostをサポートしないことがある。
マイクロソフト・アカウントでは、部分一致をサポートしており、
Redirectエンドポイントの以降のパスはredirect_uriから指定する。
外部ログインは、HttpUnauthorizedResultのActionResult?を返すことで開始する。
redirect_uriはHttpUnauthorizedResult?のコンストラクタから指定できる。
XsrfKey?は、XSRF = CSRFを防ぐためのstateパラメタの生成に使用される。
stateパラメタは暗号化によって生成されるので、XsrfKey?自体が露見することはない。
従って、この値としても、無作為な値を使用する必要はない。
概ね、ASP.NET Identityに準拠。
ASP.NET Identity側の仕様については、「ASP.NET IdentityによるSTS実装」]]」を参照。
ClaimsIdentity?を使用する。以下のようなURN形式をkeyに使用してvalueの追加を行う。
claimsIdentity.AddClaim(new Claim("urn:oauth:auth", client_id));
claimsIdentity.AddClaim(new Claim("urn:oauth:scope", scope));
ここでのクライアントとは、OAuth 2.0 のClientを指しているので注意する。
<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" />
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側エンドポイントだが、Multi-AuthSystem?が保有するセルフRedirectエンドポイントなので、相対パスで良い。
<!-- Redirectエンドポイント --> <!-- - self_code : Authorization Codeグラント種別 --> <add key="OAuthAuthorizationCodeGrantClient" value="/Account/OAuthAuthorizationCodeGrantClient" /> <!-- - self_token : Implicitグラント種別 --> <add key="OAuthImplicitGrantClient" value="/Account/OAuthImplicitGrantClient" />
以下をツールを使用して生成して、登録する。
<!-- クライアント識別子 (client_id, client_secret, redirect_uri) --> <add key="OAuthClientsInformation" value=' { "client_idとしてサイト毎にGUIDの32文字を生成して設定": { "client_secret": "client_secretとしてサイト毎にGUIDの32文字を生成して設定", "redirect_uri_code": "self_code", "redirect_uri_token": "self_token;アプリ間連携用URI", "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;アプリ間連携用URI", "client_name": "hogehoge0" }, ・・・ } ' />
以下のclient_nameのクライアントのRedirectエンドポイントは、
テスト用のRedirectエンドポイントだが、スマホネイティブの認証などで、
サイトを構築せず利用可能。
"client_name": "self_code"
"client_name": "self_token"