Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
ASP.NET Identityは、以下のクレームベース認証のセキュアトークンサービス(STS)のEndpoint追加をサポートしている。
プロトコル †
- OAuthAuthorizationServerProvider?では、OAuthのセキュアトークンサービス(STS)のEndpoint追加をサポートしており、
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの「非 .NET 環境」と認証処理を連携させることもできる。
URLは変更可能。上記は既定値。
OpenID Connectのセキュアトークンサービス(STS)のEndpoint追加は、現時点(2016年)では提供されていない。
認証サイト †
構成 †
- ASP.NET MVCアプリケーションとして作成する。
- ASP.NET Identityを用いて、各 Web アプリのアカウント管理を行う。
- ユーザー情報へアクセスする処理は、カスタムのUserStore?クラスへ実装する。
- UserStore?クラスは、データベース(SQL Server, PostgreSQL, etc.)にユーザー情報を格納する。
準備 †
- 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
連携サイト(, システム, アプリ) †
http://localhost:XXXX/Token Endpointのシナリオを検証する。
- HTTPClientなどから/Token Endpointにアクセスして連携するシナリオ。
- 自サイト内に閉じないため、CORS (Cross-Origin Resource Sharing)への対応が必要。
http://localhost:XXXX/Account/Authorize Endpointのシナリオを検証する。
- SPA(Browser+WebAPI)で、WebAPI(OAuthリソース)へのアクセスを認可するシナリオ。
- 自サイト内に閉じるため、CORS (Cross-Origin Resource Sharing)への対応が不要。
/Token Endpointの検証手順 †
以下のブログの内容を参考に、
のシナリオの検証を行うことができる。
前提 †
- 連携サイト(, システム, アプリ)では、上記のResources用のEndpointから
取得したクレーム情報を元に、認可を行い、Cookie認証チェットを発行する。
認証サイト開発 †
コードの提示はGithub登録まで待ってください。
Web アプリ開発 †
ここの検証では、cURLコマンドを使用するため開発不要。
認証連携の動作検証 †
cURLコマンドを使用して認証連携の動作を検証する。
- 処理の概要
- /Token Endpointに対して以下の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 Endpointに対して以下の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"}
/Account/Authorize Endpointの検証手順 †
ここでは、以下の手順で作成した検証手順を使用して、
「Implicitグラント種別」のシナリオの検証を行うことができる。
- ASP.NET SPAテンプレートの動作確認を行なった後、
- ASP.NET MVCテンプレートの差分を確認した上で、
- OAuthに必要な実装を抽出し、
- ASP.NET MVCテンプレートにOAuthのEndpointを追加する手順を書き出し、
- その手順の妥当性を以下の検証手順によって検証した。
前提 †
認証サイト開発 †
コードの提示はGithub登録まで待ってください。
ApplicationOAuthProvider?の追加 †
Providersフォルダを作成し、OAuthのProviderであるApplicationOAuthProvider?を追加する。
Startup.Authで、定義したApplicationOAuthProvider?を登録 †
前述のApplicationOAuthProvider?をOAuthのProviderとして登録する。
AccountControlle?に、Authorizeメソッドを追加 †
Authorizeメソッドで認証を行なう。
Authorizeメソッドで認証した後、
- Bearer Tokenを発行する。
- クライアントはBearer Tokenを使用してOAuthリソースにアクセスする。
- サーバはOAuthリソースへのアクセスを認可できるようになる。
AccountControlle?にReturnBearerTokenScreen?メソッドを追加 †
Authorizeメソッド実行後にRedirectされる先のAction MethodとViewを準備する。
- Action Method
URL に付与された、Bearer Token を取得し、Bearer Tokenを返す。
- View
通常、Bearer Tokenが露見しないように、Hiddnか何かに埋め込む。
WebApiConfig?の追加 †
App_Startフォルダに、ASP.NET Web APIの設定を行うためのWebApiConfig?.csを追加する。
Global.Application_Startメソッドで、定義したWebApiConfig?を登録 †
Global.asax.csのApplication_Startメソッドで、定義したWebApiConfig?の設定を登録。
OAuthClaimViewModel?の追加 †
Models フォルダに、Claimを返すためのOAuthClaimViewModel?.csを追加する。
OAuthResourceController?の追加 †
Controller フォルダに、Claimを返すためのOAuthResourceController?.csを追加する。
ここに、Claim等のOAuthのResourcesを返すためのASP.NET Web APIのメソッドを追加する。
Web アプリ開発 †
JavaScriptとして実装する。
コードの提示はGithub登録まで待ってください。
認証連携の動作検証 †
次のURLでアクセスするだけでよい。
http://localhost/Account/Authorize?client_id=self&response_type=token
/Account/Authorize Endpointに到達する前に、Forms認証されるため、
/Account/Authorize Endpointでは、Forms認証のクレデンシャルを使用して認証し、
Tokenを発行→OAuthリソースにアクセスする。
参考 †
Tsmatz †
かずきのBlog@hatena †
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?
(すべてのグラント種別)
- 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
コンソール・アプリケーションで実装。
関連する情報 †
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.