Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
ASP.NET Identityは、以下のクレームベース認証のセキュアトークンサービス(STS)のEndpoint追加をサポートしている。
プロトコル †
- Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerProvider?クラスは、
OAuthのセキュアトークンサービス(STS)のEndpoint追加をサポートしており、
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの「非 .NET 環境」と認証連携させることもできる。
OpenID Connectのセキュアトークンサービス(STS)のEndpoint追加は、現時点(2016年)では提供されていない。
以下のようなライブラリもある模様(ただし、個人の成果物)
準備 †
OAuth2.0 Server、Client共に以下からダウンロード可能。
このサンプルは、VS2013・2015で、そのままF5実行可能で非常に便利。
検証 †
ダウンロードしたサンプルを使用して、以下のシナリオの検証ができる。
その他 †
Bearer Tokenを暗号化・復号化する秘密鍵 †
- 認可サーバ(AuthorizationServer?)とリソースサーバ(ResourceServer?)が同じマシン上に無い場合、
Bearer Tokenを暗号化・復号化する秘密鍵を双方のマシン間で一致させる必要がある。
ツール †
machineKeyセクションの生成には、以下のツールが使えそう。
ASP.NET IdentityでRFCに追加されている仕様 †
RFC上の
- 「MUST (しなければならない)」
- 「MUST NOT (してはならない)」
- 「REQUIRED (必須である)」
以外の部分で、強制されている実装を朱書きに設定した。
- client_id
- 引継:認可エンドポイントまで。
- 検証:
- client_id + redirect_uriで、redirectエンドポイントの決定に使用される。
- 認可・Tokenエンドポイント間の一致は強制的+自動検証
- redirect_uri
- 引継:認可エンドポイントまで。
- 検証:
- client_id + redirect_uriで、redirectエンドポイントの決定に使用される。
- client_idのredirectエンドポイントとの部分一致検証処理は自前で実装する。
- 認可・Tokenエンドポイント間の一致は強制的+自動検証
- state
- 引継:認可・Redirectエンドポイントまで自動引継
- 検証:Redirectエンドポイントで自前で実装
- scope
- 引継:
- 認可エンドポイントまで。
- Tokenへの追加は自前で実装(Claimを使用)
- 検証:Tokenからの取得・検証は自前で実装(Claimを使用)
- client_id
- 引継:認可エンドポイントまで。
- 検証:client_id + redirect_uriで、redirectエンドポイントの決定に使用される。
- redirect_uri
- 引継:認可エンドポイントまで。
- 検証:
- client_id + redirect_uriで、redirectエンドポイントの決定に使用される。
- client_idのredirectエンドポイントとの部分一致検証処理は自前で実装する。
- state
- 引継:認可・Redirectエンドポイントまで自動引継
- 検証:自前で実装
- scope
- 引継:
- アクセストークン・レスポンスに含める方法が不明
- Tokenへの追加は自前で実装(Claimを使用)
- 検証:Tokenからの取得・検証は自前で実装(Claimを使用)
RFCに規定のない認証の仕掛け †
- 認証には、(基本的に、)ASP.NET Identityを使用する。
- Bearer Tokenの発行には、ClaimsIdentity?を使用する。
- ASP.NET MVCアプリケーションの認可エンドポイント上
- Cookie認証チケットからClaimsIdentity?を生成できる。
AuthenticateResult ticket = this.AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ApplicationCookie).Result;
ClaimsIdentity identity = (ticket != null) ? ticket.Identity : null;
- 以下の方法でTokenを発行する。
「Authorization Codeグラント種別」では仲介トークンを、
「Implicitグラント種別」ではAccess Tokenを生成する。
this.AuthenticationManager.SignIn(identity);
- OAuthAuthorizationServerProvider?のTokenエンドポイント上
参考(サービスごとの仕様の違い) †
以下が参考になる。
やはり、サービスによって扱いがマチマチなのは、
redirect_uriパラメタとstateパラメタであるもよう。
参考 †
The ASP.NET Site †
このコンテンツは以下の様な構成になっている。
Download the sample code. †
以下から、サンプル・コードをダウンロードできる。
http://code.msdn.microsoft.com/OWIN-OAuth-20-Authorization-ba2b8783/file/114932/1/AuthorizationServer.zip
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
コンソール・アプリケーションで実装。
関連する情報 †
その他 †
実装方法の調査で参照にしたページ。
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.