- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
-[[戻る>ASP.NET Identity]]
* 目次 [#y767ea78]
#contents
*概要 [#x51e7243]
[[ASP.NET Identity]]は、
[[OAuth]]の[[クレームベース認証]]のEndpoint追加をサポートしており、~
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの~
「非 .NET 環境」と認証処理を連携させることもできる。
この処理は、[[ASP.NET SPA]]テンプレートの以下のEndpointに実装されている。
-ASP.NET SPA (JavaScript) の Web API 認証 (ASP.NET Identity) ? Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2014/05/20/asp-net-spa-javascript-web-api-asp-net-identity-html5biz/
--http://localhost:XXXX/Token Endpoint
--http://localhost:XXXX/Account/Authorize Endpoint
---http://localhost:XXXX/任意Resource用のEndpoint
**認証サイト [#l4133d0e]
***構成 [#o5e298b4]
-[[ASP.NET MVC]]アプリケーションとして作成する。
-[[ASP.NET Identity]]を用いて、各 Web アプリのアカウント管理を行う。
-ユーザー情報へのアクセスには、既定の[[Entity Framework]]を使用する。
-ユーザー情報は、既定の LocalDb に格納する。
***準備 [#jcb91f7a]
+Visual Studio 2015 で、新規 ASP.NET Web アプリケーションを作成する。
+「新しい ASP.NET プロジェクト」ダイアログで、以下を選択する。
--テンプレート: [[ASP.NET MVC]]
--認証の変更: 個別のユーザー アカウント
+Visual Studio の「パッケージ マネージャー コンソール」で、以下のコマンドを実行する。
Install-Package Microsoft.AspNet.WebApi
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.AspNet.WebApi.Cors
**連携アプリ [#o744ec42]
**連携サイト(, システム, アプリ) [#o744ec42]
***[[cURLコマンド]] [#y3d89c8f]
http://localhost:XXXX/Token Endpointのシナリオを検証する。
-HTTPClientなどから/Token Endpointにアクセスして連携するシナリオ。
-CORS (Cross-Origin Resource Sharing)への対応が必要。
***JavaScript [#jeb0e69c]
http://localhost:XXXX/Account/Authorize Endpointのシナリオを検証する。
-SPA(Browser+WebAPI)で、WebAPIアクセスを認可するシナリオ。
-CORS (Cross-Origin Resource Sharing)への対応が不要。
* /Token Endpointの検証手順 [#a452ab9e]
以下のブログの内容を参考に検証を行うことができる。
-ASP.NET WebAPI2でAjaxでOAuth認証するよ~
(ついでにTypeScriptとReact) - かずきのBlog@hatena~
http://blog.okazuki.jp/entry/2016/01/15/215901
-asp.net - How do you consume extra parameters~
in OAuth2 Token request within .net WebApi2 application - Stack Overflow~
http://stackoverflow.com/questions/21243996/how-do-you-consume-extra-parameters-in-oauth2-token-request-within-net-webapi2
-c# - Can't get UserManager from OwinContext in apicontroller - Stack Overflow~
http://stackoverflow.com/questions/24001245/cant-get-usermanager-from-owincontext-in-apicontroller
-Simple OAuth Server: Implementing a Simple OAuth Server~
with Katana OAuth Authorization Server Components (Part 1) - Tugberk Ugurlu's Blog~
http://www.tugberkugurlu.com/archive/simple-oauth-server-implementing-a-simple-oauth-server-with-katana-oauth-authorization-server-components-part-1
**前提 [#maa977e7]
ここでは、以下のような前提の検証用アプリケーションを構築する。
+--------+ +----------------+
| 非 |--(A)- Authorization Request ->| ASP.NET |
| . | | Identity |
| N |<-(B)----- Bearer Token -------| |
| E | | |
| T |--(C)----- Bearer Token ------>| | +-----------+
| 環 | | |---| UserStore |
| 境 |<-(D)--- Protected Resource ---| | +-----------+
+--------+ +----------------+
-処理順
>
+ (A) Authorization処理 と Bearer Token発行のEndpointへRequestする。
+ (B) 認証処理後、内部ではClaimsIdentityを生成してSign-inされ、Bearer TokenがResponseされる。
+ (C) Bearer Tokenを持って、Resources用のEndpointにRequestする。
+ (D) Resources用のEndpointからClaim等のリソースがResponseされる。
-ポイント
--Authorization処理 と Bearer Token発行のEndpoint~
http://localhost:XXXX/Token
--Resources用のEndpoint~
http://localhost:XXXX/api/OAuthResource/GetClaim
--連携先のサイトでは、上記のResources用のEndpointから~
取得したクレーム情報を元に、Cookie認証チェットを発行する。
--連携サイト(, システム, アプリ)では、上記のResources用のEndpointから~
取得したクレーム情報を元に、認可を行い、Cookie認証チェットを発行する。
**認証サイト開発 [#q8945633]
コードの提示はGithub登録まで待ってください。
**Web アプリ開発 [#ke366e99]
ここの検証では、[[cURLコマンド]]を使用するため開発不要。
**認証連携の動作検証 [#i6134f32]
[[cURLコマンド]]を使用して認証連携の動作を検証する。
/Token Endpointに対して以下のRequestを出すと、Bearer Tokenが返ってくる。
***処理の概要 [#bf483c68]
-/Token Endpointに対して以下のRequestを出すと、Bearer Tokenが返ってくる。
--POST
--Content-Type: application/x-www-form-urlencoded;
--body:grant_type=password&username=ユーザ名&password=パスワード
-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コマンド]] [#yf1216ba]
Debug ProxyにFiddler等を使用すると尚良。
-Bearer Tokenの取得
--Request (cURLコマンド)
>curl "http://localhost/Token" -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を使用したリソースアクセス
--Request (cURLコマンド)
>curl "http://localhost/api/OAuthResource/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の検証手順 [#p5f5a8e3]
ここでは、
+[[ASP.NET SPA]]テンプレートの動作確認を行い、
+[[ASP.NET MVC]]テンプレートの差分を確認した上で、
+[[OAuth]]のEndpoint追加に必要な実装を抽出し、
+MVCテンプレートに[[OAuth]]のEndpointを追加する手順を書き出し、
+その手順の妥当性を以下の検証手順によって検証した。
**前提 [#cac6a33f]
ここでは、以下のような前提の検証用アプリケーションを構築する。
+--------+ +----------------+
| |--(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 |
+--------+ +----------------+ +-----------+
-処理順
>
+ (A) 認証サイトのForms認証機構へRequestする。
+ (B) 発行されたCookie認証チェットのResponseされる。
+ (C) Cookie認証チェットを持って、[[OAuth]]用のEndpointにRequestする。~
既に認証されているので、内部ではClaimsIdentityを生成してSign-inされる。~
すると、OAuthProviderがBearer Token用のEndpointにRedirectされる。
+ (D) Bearer Token用のEndpointからBearer TokenがResponseされる。
+ (E) Bearer Tokenを持って、Resources用のEndpointにRequestする。
+ (F) Resources用のEndpointからClaim等のリソースがResponseされる。
-ポイント
--[[OAuth]]用のEndpoint~
http://localhost:XXXX/Account/Authorize
--Bearer Token用のEndpoint~
http://localhost:XXXX/Account/ReturnBearerTokenScreen
--Resources用のEndpoint~
http://localhost:XXXX/api/OAuthResource/GetClaim
**認証サイト開発 [#k9408908]
コードの提示はGithub登録まで待ってください。
***ApplicationOAuthProviderの追加 [#z15e0624]
Providersフォルダを作成し、[[OAuth]]のProviderであるApplicationOAuthProviderを追加する。
***Startup.Authで、定義したApplicationOAuthProviderを登録 [#n71f912c]
前述のApplicationOAuthProviderを[[OAuth]]のProviderとして登録する。
***AccountControlleに、Authorizeメソッドを追加 [#q0c1012d]
Authorizeメソッドで認証を行なう。
Authorizeメソッドで認証した後、
+Bearer Tokenを発行する。
+クライアントはBearer Tokenを使用してリソースにアクセスする。
+サーバはリソースへのアクセスを認可できるようになる。
***AccountControlleにReturnBearerTokenScreenメソッドを追加 [#k381df07]
Authorizeメソッド実行後にRedirectされる先のAction MethodとViewを準備する。
-Action Method~
URL に付与された、Bearer Token を取得し、Bearer Tokenを返す。
-View~
通常、Bearer Tokenが露見しないように、Hiddnか何かに埋め込む。
***WebApiConfigの追加 [#q040b99b]
App_Startフォルダに、[[ASP.NET Web API]]の設定を行うためのWebApiConfig.csを追加する。
***Global.Application_Startメソッドで、定義したWebApiConfigを登録 [#k795c063]
Global.asax.csのApplication_Startメソッドで、定義したWebApiConfigの設定を登録。
***OAuthClaimViewModelの追加 [#me6fe947]
Models フォルダに、Claimを返すためのOAuthClaimViewModel.csを追加する。
***OAuthResourceControllerの追加 [#j2264468]
Controller フォルダに、Claimを返すためのOAuthResourceController.csを追加する。~
ここに、Claim等の[[OAuth]]のResourcesを返すための[[ASP.NET Web API]]のメソッドを追加する。
**Web アプリ開発 [#zda88633]
JavaScriptとして実装する。
**認証連携の動作検証 [#n7eec8a2]
次のURLでアクセスする。
http://localhost/Account/Authorize?client_id=self&response_type=token
*参考 [#f733c473]
**Tsmatz [#o09dc264]
-ASP.NET SPA (JavaScript) の Web API 認証 (ASP.NET Identity) – Tsmatz~
https://blogs.msdn.microsoft.com/tsmatsuz/2014/05/20/asp-net-spa-javascript-web-api-asp-net-identity-html5biz/
**かずきのBlog@hatena [#ode84d2f]
-ASP.NET WebAPI2でAjaxでOAuth認証するよ(ついでにTypeScriptとReact)~
http://blog.okazuki.jp/entry/2016/01/15/215901
-HttpClientクラスがリダイレクトをよきに計らってくれるのをどうにかしたい~
http://blog.okazuki.jp/entry/20121225/HttpClientTips
**Bearer Token (rfc6750) [#d65223fc]
**The OAuth 2.0 Authorization Framework [#v698197b]
***RFC 6749 - 4.3. Resource Owner Password Credentials Grant [#a91d9d2e]
-memo: Force.com : REST API 開発 ユーザ名パスワード OAuth 認証~
http://vaindespair.blogspot.jp/2013/01/blog-post_5252.html
--Understanding the Username-Password OAuth Authentication Flow~
Force.com REST API Developer Guide | Salesforce Developers~
https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_understanding_username_password_oauth_flow.htm
-RFC 6749 - The OAuth 2.0 Authorization Framework~
4.3. Resource Owner Password Credentials Grant~
https://tools.ietf.org/html/rfc6749#section-4.3
+----------+
| Resource |
| Owner |
| |
+----------+
v
| Resource Owner
(A) Password Credentials
|
v
+---------+ +---------------+
| |>--(B)---- Resource Owner ------->| |
| | Password Credentials | Authorization |
| Client | | Server |
| |<--(C)---- Access Token ---------<| |
| | (w/ Optional Refresh Token) | |
+---------+ +---------------+
-ASP.NET Identityによる認証サイト = Authorization Server に該当する。
-Clientは、Authorization Serverの情報を元に認可をする連携サイト(, システム, アプリ)。
-Resource OwnerはUserIDやPasswordを保持しているユーザやシステム。
***RFC 6750 - Bearer Token Usage [#d65223fc]
-OAuth 2.0のbearer tokenの最新仕様を調べたらあまり変わってなかった - r-weblife~
http://d.hatena.ne.jp/ritou/20110402/1301679908
--The OAuth 2.0 Authorization Framework: Bearer Token Usage(日本語)~
http://openid-foundation-japan.github.io/rfc6750.ja.html
-RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage~
https://tools.ietf.org/html/rfc6750
+--------+ +---------------+
| |--(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に該当する。
----
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.