[[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]
***クライアント識別子 [#bd77b31a]
-GUIDを使用する
--32文字の英数字。
--URLに指定するので、[{}, -] は無し。
***クライアント認証 [#u994461a]
-クライアント認証には、~
全ての場合、ベーシック認証の認証ヘッダを使用する。

-client_id~
-クライアント識別子
--GUIDを使用する
---32文字の英数字。
---URLに指定するので、[{}, -] は無し。

--client_id~
全てのグラント種別以外で必須
-client_secret
--Implicitグラント種別以外で必須
--ただし、認証で使用する場合は、Implicitグラント種別でも必須。
--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グラント種別もサポートするが、その場合、
--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コマンド]]を使用して動作を検証する。
-[[cURLコマンド]]を使用して認証専用WebAPIへのアクセスを検証する。
--認証の拡張仕様の部分は、&color(red){朱書き};にしてある。
--通常のリソース用WebAPIへのアクセス時はこのパラメタの指定は不要。

-処理の概要
--Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。
---POST
---Content-Type: application/x-www-form-urlencoded;
---body:grant_type=password, username=ユーザ名, password=パスワード
---Authorization: Basic ZZZZZZZZZZ ---> 「クライアントID:クライアント・パスワード」をBase64エンコードしたもの。
---body : grant_type=password, username=ユーザID, password=ユーザ・パスワード, &color(red){scope=auth};

--Bearer Tokenをヘッダに指定してResources用のEndpointにアクセスするとResources情報を取得できる。
---GET
--Bearer Tokenをヘッダに指定して認証専用のWebAPIにアクセスすると認証情報を取得できる。
---POST
---Authorization: Bearer XXXXXXXXXX
---Content-Type: application/json; charset=utf-8;
---body : &color(red){client_id=クライアントID, client_secret=クライアント・パスワード};

-[[cURLコマンド]]~
Debug ProxyにFiddler等を使用すると尚良~
(其の際は、 --proxy オプションを指定する必要がある)。
--Bearer Tokenの取得
---Request (cURLコマンド)
 >curl "http://localhost/OAuthBearerToken" -H "Content-Type: application/x-www-form-urlencoded;" -d "grant_type=password" -d "username=XXXXX" -d "password=YYYYY"
 >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}
 {"access_token":"XXXXXXXXXX","token_type":"bearer","expires_in":nnnnn,"refresh_token":"YYYYYYYYYY"}

--Bearer Tokenを使用したOAuthリソースへのアクセス
---Request (cURLコマンド)
 >curl "http://localhost/api/OAuthResourceApi/GetClaim" -H "Authorization: Bearer XXXXXXXXXX" -H "Content-Type: application/json; charset=utf-8;"
 >curl "http://localhost:nnnnn/api/OAuthResourceApi/GetAuthenticatedUsersClaim" -H "Authorization: Bearer XXXXXXXXXX" -d "client_id=クライアントID" -d "client_secret=クライアント・パスワード"

---Response (Body)
 {"id":"XXXXX","userName":"XXXXX","email":"XXXXX","phoneNumber":"XXXXX"}
 {"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"}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS