Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
ASP.NET Identityは、以下のクレームベース認証のセキュアトークンサービス(STS)のEndpoint追加をサポートしている。
プロトコル †
- OAuthAuthorizationServerProvider?では、OAuthのセキュアトークンサービス(STS)のEndpoint追加をサポートしており、
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの「非 .NET 環境」と認証処理を連携させることもできる。
OpenID Connectのセキュアトークンサービス(STS)のEndpoint追加は、現時点(2016年)では提供されていない。
認証・認可サーバ †
準備 †
- Visual Studio 2015 で、新規 ASP.NET Web アプリケーションを作成する。
- 「新しい ASP.NET プロジェクト」ダイアログで、以下を選択する。
- Visual Studio の「パッケージ マネージャー コンソール」で、以下のコマンドを実行する。
Install-Package Microsoft.AspNet.WebApi
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.AspNet.WebApi.Cors
構成 †
- ASP.NET MVCアプリケーションとして作成する。
- ASP.NET Identityを用いて、各 Web アプリのアカウント管理を行う。
- ユーザー情報へアクセスする処理は、カスタムのUserStore?クラスへ実装する。
- UserStore?クラスは、データベース(SQL Server, PostgreSQL, etc.)にユーザー情報を格納する。
クライアント・アプリ開発 †
- HTTPClientなどからTokenエンドポイントにアクセスして連携するシナリオ。
- グラント種別
Webアプリケーション †
- 「Implicitグラント種別」のシナリオを検証する。
- SPA(Browser+WebAPI)で、WebAPI(OAuthリソース)へのアクセスを認可。
- ここでは、クライアント・アプリを認証・認可サーバに同梱させてしまう。
Tokenエンドポイントの検証手順 †
エンドポイント一覧 †
認証・認可サーバ開発 †
コードの提示はGithub登録まで待ってください。
クライアント・アプリ開発 †
ここの検証では、cURLコマンドを使用するため開発不要。
認証連携の動作検証 †
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"}
- 処理の概要
- 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"}
認可エンドポイントの検証手順 †
エンドポイント一覧 †
認証・認可サーバ開発 †
コードの提示はGithub登録まで待ってください。
クライアント・アプリ †
コードの提示はGithub登録まで待ってください。
Webアプリケーション †
認証連携の動作検証 †
その他 †
ASP.NET IdentityでRFCに追加されている仕様 †
- 「MUST (しなければならない)」
- 「MUST NOT (してはならない)」
- 「REQUIRED (必須である)」
以外の部分で、強制されている実装を朱書きに設定した。
- client_id
- 引継:OK
- 検証:
- クライアント認証は自前
- Endpoint間の一致は自動検証
- redirect_uri
- 引継:OK
- 検証:
- client_idとの部分一致などは自前
- Endpoint間の一致は自動検証
Bearer Tokenを暗号化・復号化する秘密鍵 †
- 認可サーバ(AuthorizationServer?)とリソースサーバ(ResourceServer?)が同じマシン上に無い場合、
Bearer Tokenを暗号化・復号化する秘密鍵を双方のマシン間で一致させる必要がある。
- machineKeyセクションの生成には、以下のツールが使えそう。
参考 †
The ASP.NET Site †
このコンテンツは以下の様な構成になっている。
Create an Authorization Server †
- このAuthorization ServerはOAuthの4つのフローをサポートしている。
- Authorization Code Grant Client
- Implicit Grant Client
- Resource Owner Password Credentials Grant Client
- Client Credentials Grant Client
- OAuthAuthorizationServerProvider?の実装
- ValidateClientRedirectUri?
(Authorization Code, Implicitグラント種別)
- ValidateClientAuthentication?
(Resource Owner Password Credentials, Client Credentialsグラント種別)
- GrantResourceOwnerCredentials?
(Resource Owner Password Credentialsグラント種別)
- GrantClientCredetails?
(Client Credentialsグラント種別)
- AuthorizeEndpoint?の実装
(Authorization Code, Implicitグラント種別)
Creating a Resource Server †
アクセストークンによって保護されたResource ServerのEndpointを作成。
Create OAuth 2.0 Clients †
.NETクライアント・アプリからHTTPアクセスする際のライブラリとしては、DotNetOpenAuth.OAuth2を使用している。
- Authorization Code Grant Client
WebApplication?として実装。
- Resource Owner Password Credentials Grant Client
コンソール・アプリケーションで実装。
- Client Credentials Grant Client
コンソール・アプリケーションで実装。
関連する情報 †
その他 †
実装方法について参照したページ。
Tsmatz †
Tags: :ASP.NET, :ASP.NET MVC, :ASP.NET SPA, ASP.NET Web API, :ASP.NET Identity
Special thanks go to mg-san for his support.