Open棟梁 wiki
目次 †
概要 †
Multi-AuthSystem?独自仕様部分について説明する。
Idp仕様 †
Idpの使用について。
UserStore? †
- EntityFramework?をキャンセルしUserStore?クラスで実装。
- DBMSはSQL Server or PostgreSQLを使用。
- Open棟梁のB・D層を使用してデータアクセスを実装。
パラメタ †
ASP.NET Identityや、その他、アプリケーションで使用するパラメタについて。
外部認証仕様 †
外部認証の使用について。
- 外部認証で取得したe-mail addressは検証しない。
- e-mail addressでサインアップして、そのままサインインする。
- 初回のサインアップを外部認証で行った場合、パスワードを持たないアカウントになる。
この場合、後からパスワードを持ったアカウントとしての登録が不可能になる(★パスワードリセット不可能?)。
OAuth2.0 Server仕様 †
ASP.NET Identityの仕様については、「ASP.NET Identity追加仕様」を参照。
共通 †
クライアント識別子 †
- GUIDを使用する
- 32文字の英数字。
- URLに指定するので、[{}, -] は無し。
- client_id
全てのグラント種別以外で必須
- client_secret
- Implicitグラント種別以外で必須
- ただし、認証で使用する場合は、Implicitグラント種別でも必須。
Server側 †
- AuthorizationServer?
- 認可エンドポイント
- redirect_uriチェックは不要(部分一致をサポートしない完全事前登録制とするため)
- Tokenエンドポイント(Access Tokenの発行方法)
- scope=その他の値の場合、scopeパラメタ値をClaimに格納する(通常の動作)。
- ResourceServer?
- リソース・アクセス用のWebAPIを提供する。
- "urn:oauth:scope"のClaimがあった場合、scopeの値に適合した範囲のアクセス権で処理を行う。
Client側 †
- パラメタ
- redirect_uri指定は不要(部分一致をサポートしない完全事前登録制とするため)
- stateの使用を強く推奨する(Access Token露見は、Client側の自己責任のため)。
- ResourceServer?リソース・アクセス用のWebAPIにアクセスする場合、
- Access TokenをHTTPヘッダに指定して送信する。
Access Tokenに情報を格納する方法 †
ClaimsIdentity?を使用する。以下のようなURN形式をkeyに使用してvalueの追加を行う。
- scope=authの場合(Access Tokenが認証用であることを意味する。詳しくは下記参照)
claimsIdentity.AddClaim(new Claim("urn:oauth:auth", client_id));
- scope=その他の値の場合、
claimsIdentity.AddClaim(new Claim("urn:oauth:scope", scope));
認証 †
- 認証に利用する場合、以下の仕様に準拠する。
- クライアント認証必須、従って、クライアント識別子は全てのグラント種別以外で必須
Server側 †
- 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側 †
- グラント種別
- できるだけ、Authorization Codeグラント種別を使用する。
- Implicitグラント種別もサポートするが、その場合、
認証用Access Tokenとクライアント識別子の露見のリスクがあることに注意すること。
- パラメタ
- response_typeには、"code"(推奨) or "token"を指定する。
- 認証を行なう場合、scopeパラメタに"auth"を指定する。
- ResourceServer?の認証専用のWebAPIにアクセスする場合、
ResourceServer?のWebAPI †
- 認証専用のWebAPI
- /api/OAuthResourceApi?/GetAuthenticatedUsersClaim?
- リソース・アクセス用のWebAPI
- /api/OAuthResourceApi?/XXXXX
動作検証 †
Authorization Codeグラント種別 †
Implicitグラント種別 †
Resource Owner Password Credentialsグラント種別 †
cURLコマンド?を使用して動作を検証する。
- 処理の概要
- Tokenエンドポイントに対して以下のRequestを出すと、Bearer Tokenが返ってくる。
- POST
- Content-Type: application/x-www-form-urlencoded;
- body:grant_type=password, username=ユーザ名, password=パスワード
- 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=password" -d "username=XXXXX" -d "password=YYYYY"
- 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"}
Client Credentialsグラント種別 †
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を使用した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"}