[[Open棟梁>https://github.com/OpenTouryoProject]] wiki -[[戻る>Multi-AuthSystem]] *目次 [#w492a716] #contents *概要 [#p3c82f83] Multi-AuthSystem独自仕様部分について説明する。 *Idp仕様 [#c803a92a] Idpの使用について。 **UserStore [#gd06e168] -EntityFrameworkをキャンセルしUserStoreクラスで実装。 -DBMSはSQL Server or PostgreSQLを使用。 -Open棟梁のB・D層を使用してデータアクセスを実装。 **パラメタ [#pe833de6] ASP.NET Identityや、その他、アプリケーションで使用するパラメタについて。 *外部認証仕様 [#q865b16d] 外部認証の使用について。 -外部認証で取得したe-mail addressは検証しない。 -e-mail addressでサインアップして、そのままサインインする。 -初回のサインアップを外部認証で行った場合、パスワードを持たないアカウントになる。~ この場合、後からパスワードを持ったアカウントとしての登録が不可能になる(★パスワードリセット不可能?)。 *OAuth2.0 Server仕様 [#q3ec8431] ASP.NET Identityの仕様については、「[[ASP.NET Identity追加仕様>https://techinfoofmicrosofttech.osscons.jp/index.php?ASP.NET%20Identity%E3%81%AB%E3%82%88%E3%82%8BSTS%E5%AE%9F%E8%A3%85#z90cfe4c]]」を参照。 **共通 [#se391923] ***クライアント認証 [#u994461a] -クライアント認証には、~ 全ての場合、ベーシック認証の認証ヘッダを使用する。 -クライアント識別子 --GUIDを使用する ---32文字の英数字。 ---URLに指定するので、[{}, -] は無し。 --client_id~ 全てのグラント種別以外で必須 --client_secret ---Implicitグラント種別以外で必須 ---ただし、認証で使用する場合は、Implicitグラント種別でも必須。 ***Server側 [#k813af7a] -AuthorizationServer --認可エンドポイント ---redirect_uriチェックは不要(部分一致をサポートしない完全事前登録制とするため) --Tokenエンドポイント(Access Tokenの発行方法) ---scope=その他の値の場合、scopeパラメタ値をClaimに格納する(通常の動作)。 -ResourceServer --リソース・アクセス用のWebAPIを提供する。 ---"urn:oauth:scope"のClaimがあった場合、scopeの値に適合した範囲のアクセス権で処理を行う。 ***Client側 [#jdcc345f] -パラメタ --redirect_uri指定は不要(部分一致をサポートしない完全事前登録制とするため) --stateの使用を強く推奨する(Access Token露見は、Client側の自己責任のため)。 -ResourceServerリソース・アクセス用のWebAPIにアクセスする場合、 --Access TokenをHTTPヘッダに指定して送信する。 ***Access Tokenに情報を格納する方法 [#l465fe76] ClaimsIdentityを使用する。以下のようなURN形式をkeyに使用してvalueの追加を行う。 -scope=authの場合(Access Tokenが認証用であることを意味する。詳しくは[[下記>#oa657de9]]参照) claimsIdentity.AddClaim(new Claim("urn:oauth:auth", client_id)); -scope=その他の値の場合、 claimsIdentity.AddClaim(new Claim("urn:oauth:scope", scope)); **認証 [#tf864e14] -認証に利用する場合、以下の仕様に準拠する。 -クライアント認証必須、従って、クライアント識別子は全てのグラント種別以外で必須 ***Server側 [#oa657de9] -AuthorizationServer --Tokenエンドポイント(Access Tokenの発行方法) ---scope=authの場合、client_idをClaimに格納し、Access Tokenが認証用であることを明示する。 -ResourceServer --認証専用のWebAPIを提供する。 ---"urn:oauth:auth"のClaimがあった場合、Access Tokenが認証用であることを意味する。 ---この場合、POSTされたクライアント識別子でクライアント認証をした後、~ そのClaim値とclient_idを比較してTokenに問題がないかをチェックする。 ***Client側 [#x001826d] -グラント種別 --できるだけ、Authorization Codeグラント種別を使用する。 --Implicitグラント種別もサポートするが、その場合、~ 認証用Access Tokenとクライアント識別子の露見のリスクがあることに注意すること。 -パラメタ --response_typeには、"code"(推奨) or "token"を指定する。 --認証を行なう場合、scopeパラメタに"auth"を指定する。 -ResourceServerの認証専用のWebAPIにアクセスする場合、 --認証用Access Tokenに加え、前述の[[クライアント識別子>#bd77b31a]]をPOSTで送信する。 ***ResourceServerのWebAPI [#u68a575d] -認証専用のWebAPI --/api/OAuthResourceApi/GetAuthenticatedUsersClaim -リソース・アクセス用のWebAPI --/api/OAuthResourceApi/XXXXX **動作検証 [#jcf369d6] ***Authorization Codeグラント種別 [#w8d19e13] 「http://localhost:XXXXX/home/index」で表示されるAuthorization Codeグラント種別のテスト用linkをclickする。 ***Implicitグラント種別 [#v8c5ac21] 「http://localhost:XXXXX/home/index」で表示されるImplicitグラント種別のテスト用linkをclickする。 ***Resource Owner Password Credentialsグラント種別 [#ka3a0c97] -[[cURLコマンド]]を使用して認証専用WebAPIへのアクセスを検証する。 --認証の拡張仕様の部分は、&color(red){朱書き};にしてある。 --通常のリソース用WebAPIへのアクセス時はこのパラメタの指定は不要。 -処理の概要 --Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。 ---POST ---Authorization: Basic ZZZZZZZZZZ ---> 「クライアントID:クライアント・パスワード」をBase64エンコードしたもの。 ---body : grant_type=password, username=ユーザID, password=ユーザ・パスワード, &color(red){scope=auth}; --Bearer Tokenをヘッダに指定して認証専用のWebAPIにアクセスすると認証情報を取得できる。 ---POST ---Authorization: Bearer XXXXXXXXXX ---body : &color(red){client_id=クライアントID, client_secret=クライアント・パスワード}; -[[cURLコマンド]]~ Debug ProxyにFiddler等を使用すると尚良~ (其の際は、 --proxy オプションを指定する必要がある)。 --Bearer Tokenの取得 ---Request (cURLコマンド) >curl "http://localhost:nnnnn/OAuthBearerToken"-u "クライアントID:クライアント・パスワード" -d "grant_type=password" -d "username=ユーザID" -d "password=ユーザ・パスワード" -d "scope=auth" ---Response (Body) {"access_token":"XXXXXXXXXX","token_type":"bearer","expires_in":nnnnn,"refresh_token":"YYYYYYYYYY"} --Bearer Tokenを使用したOAuthリソースへのアクセス ---Request (cURLコマンド) >curl "http://localhost:nnnnn/api/OAuthResourceApi/GetAuthenticatedUsersClaim" -H "Authorization: Bearer XXXXXXXXXX" -d "client_id=クライアントID" -d "client_secret=クライアント・パスワード" ---Response (Body) {"userName":"XXXXX","email":"XXXXX","phoneNumber":"XXXXX"} ***Client Credentialsグラント種別 [#h00dd765] [[cURLコマンド]]を使用して動作を検証する。 -処理の概要 --Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。 ---POST ---Content-Type: application/x-www-form-urlencoded; ---body:grant_type=client_credentials, client_id=XXXXXX, client_secret=YYYYYY --Bearer Tokenをヘッダに指定してResources用のEndpointにアクセスするとResources情報を取得できる。 ---GET ---Authorization: Bearer XXXXXXXXXX ---Content-Type: application/json; charset=utf-8; -[[cURLコマンド]]~ Debug ProxyにFiddler等を使用すると尚良~ (其の際は、 --proxy オプションを指定する必要がある)。 --Bearer Tokenの取得 ---Request (cURLコマンド) >curl "http://localhost/OAuthBearerToken" -H "Content-Type: application/x-www-form-urlencoded;" -d "grant_type=client_credentials" -d "client_id=XXXXXX" -d "client_secret=YYYYYY" ---Response (Body) {"access_token":"XXXXXXXXXX","token_type":"bearer","expires_in":nnnnn} --Bearer Tokenを使用したOAuthリソースへのアクセス ---Request (cURLコマンド) >curl "http://localhost/api/OAuthResourceApi/GetClaim" -H "Authorization: Bearer XXXXXXXXXX" -H "Content-Type: application/json; charset=utf-8;" ---Response (Body) {"id":"XXXXX","userName":"XXXXX","email":"XXXXX","phoneNumber":"XXXXX"}