Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

ASP.NET Identityは、

プロトコル

OAuth

OAuthクレームベース認証のEndpoint追加をサポートしており、
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの
「非 .NET 環境」と認証処理を連携させることもできる。

この処理は、ASP.NET SPAテンプレートの以下のEndpointに実装されている。  

URLは変更可能。上記は既定値。

OpenId Connect?

OpenId Connect?のサーバー実装は、現時点(2016年)では提供されていない。

認証サイト

構成

準備

  1. Visual Studio 2015 で、新規 ASP.NET Web アプリケーションを作成する。
  2. 「新しい ASP.NET プロジェクト」ダイアログで、以下を選択する。
    • テンプレート: ASP.NET MVC
    • 認証の変更: 個別のユーザー アカウント
  3. Visual Studio の「パッケージ マネージャー コンソール」で、以下のコマンドを実行する。
    Install-Package Microsoft.AspNet.WebApi
    Install-Package Microsoft.AspNet.WebApi.Owin
    Install-Package Microsoft.AspNet.WebApi.Cors

連携サイト(, システム, アプリ)

cURLコマンド

http://localhost:XXXX/Token Endpointのシナリオを検証する。

JavaScript

http://localhost:XXXX/Account/Authorize Endpointのシナリオを検証する。

/Token Endpointの検証手順

以下のブログの内容を参考に、
Resource Owner Password Credentialsグラント種別」のシナリオの検証を行うことができる。

前提

ここでは、以下のような前提の検証用アプリケーションを構築する。

 +--------+                               +----------------+
 |  非    |--(A)- Authorization Request ->|  ASP.NET       |
 |  .     |                               |  Identity      |
 |  N     |<-(B)----- Bearer Token -------|                |
 |  E     |                               |                |
 |  T     |--(C)----- Bearer Token ------>|                |   +-----------+
 |  環    |                               |                |---| UserStore |
 |  境    |<-(D)--- Protected Resource ---|                |   +-----------+
 +--------+                               +----------------+
  1. (A) Authorization処理 と Bearer Token発行のEndpointへRequestする。
  2. (B) 認証処理後、内部ではClaimsIdentity?を生成してSign-inされ、Bearer TokenがResponseされる。
  3. (C) Bearer Tokenを持って、Resources用のEndpointにRequestする。
  4. (D) Resources用のEndpointからClaim等のリソースがResponseされる。

認証サイト開発

コードの提示はGithub登録まで待ってください。

Web アプリ開発

ここの検証では、cURLコマンドを使用するため開発不要。

認証連携の動作検証

cURLコマンドを使用して認証連携の動作を検証する。

処理の概要

cURLコマンド

Debug ProxyにFiddler等を使用すると尚良
(其の際は、 --proxy オプションを指定する必要がある)。

/Account/Authorize/ Endpointの検証手順

ここでは、以下の手順で作成した検証手順を使用して、
Implicitグラント種別」のシナリオの検証を行うことができる。

  1. ASP.NET SPAテンプレートの動作確認を行なった後、
  2. ASP.NET MVCテンプレートの差分を確認した上で、
  3. OAuthに必要な実装を抽出し、
  4. ASP.NET MVCテンプレートにOAuthのEndpointを追加する手順を書き出し、
  5. その手順の妥当性を以下の検証手順によって検証した。

前提

ここでは、以下のような前提の検証用アプリケーションを構築する。

 +--------+                               +----------------+
 |        |--(A)- Authorization Request ->|                |
 |        |                               |                |
 |        |<-(B)-- Authorization Grant ---|                |
 |        |                               |                |
 |  非    |                               |                |
 |  .     |                               |                |
 |  N     |--(C)-- Authorization Grant -->|  ASP.NET       |
 |  E     |                               |  Identity      |
 |  T     |<-(D)----- Bearer Token -------|  Token認証機能 |
 |  環    |                               |                |
 |  境    |                               |                |
 |        |                               |                |
 |        |--(E)----- Bearer Token ------>|                |
 |        |                               |                |   +-----------+
 |        |<-(F)--- Protected Resource ---|                |---| UserStore |
 +--------+                               +----------------+   +-----------+
  1. (A) 認証サイトのForms認証機構へRequestする。
  2. (B) 発行されたCookie認証チェットのResponseされる。
  3. (C) Cookie認証チェットを持って、OAuth用のEndpointにRequestする。
    既に認証されているので、内部ではClaimsIdentity?を生成してSign-inされる。
    すると、OAuthProvider?がBearer Token用のEndpointにRedirectされる。
  4. (D) Bearer Token用のEndpointからBearer TokenがResponseされる。
  5. (E) Bearer Tokenを持って、Resources用のEndpointにRequestする。
  6. (F) Resources用のEndpointからClaim等のリソースがResponseされる。

認証サイト開発

コードの提示はGithub登録まで待ってください。

ApplicationOAuthProvider?の追加

Providersフォルダを作成し、OAuthのProviderであるApplicationOAuthProvider?を追加する。

Startup.Authで、定義したApplicationOAuthProvider?を登録

前述のApplicationOAuthProvider?OAuthのProviderとして登録する。

AccountControlle?に、Authorizeメソッドを追加

Authorizeメソッドで認証を行なう。

Authorizeメソッドで認証した後、

  1. Bearer Tokenを発行する。
  2. クライアントはBearer Tokenを使用してOAuthリソースにアクセスする。
  3. サーバはOAuthリソースへのアクセスを認可できるようになる。

AccountControlle?ReturnBearerTokenScreen?メソッドを追加

Authorizeメソッド実行後にRedirectされる先のAction MethodとViewを準備する。

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リソースにアクセスする。

その他

セキュリティに関する考察

Resource Owner Password Credentialsグラント種別

HTTPSはホスト名の部分だけ情報として渡し、
以後のパスやクエリストリング情報は暗号化される。

従ってGETでも一応安全だが、

という問題がある。

従って、このグラント種別では、

などが必要になると考える。

IISならW3Cログの出力をカスタマイズできる。

参考

Tsmatz

かずきのBlog@hatena

The OAuth 2.0 Authorization Framework

RFC 6749 - 4.3. Resource Owner Password Credentials Grant

RFC 6750 - Bearer Token Usage

 +--------+                               +---------------+
 |        |--(A)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(B)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)-- Authorization Grant -->| Authorization |
 | Client |                               |     Server    |
 |        |<-(D)----- Access Token -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(F)--- Protected Resource ---|               |
 +--------+                               +---------------+

ASP.NET Identityによる認証サイト
= 上記図中のResource Owner, Authorization Server, Resource Serverに該当する。

OAuth 2.0のフロー定義

OAuth 2.0仕様には4つのフローが定義されている。
これらのフローのタイプを「グラント種別」と呼ばれる。

以下の様な「グラント種別」がある模様。

Authorization Codeグラント種別

Note: The lines illustrating steps (A), (B), and (C) are broken into two parts as they pass through the user-agent.

Implicitグラント種別

Note: The lines illustrating steps (A) and (B) are broken into two parts as they pass through the user-agent.

Resource Owner Password Credentialsグラント種別

Client Credentialsグラント種別


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.


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