- 追加された行はこの色です。
- 削除された行はこの色です。
[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。
-[[戻る>ASP.NET Identity]]
* 目次 [#i42bb417]
#contents
*概要 [#x3f02a0a]
[[ASP.NET Identity]]は、以下の[[クレームベース認証]]のセキュアトークンサービス(STS)のEndpoint追加をサポートしている。
[[ASP.NET Identity]]のSTS実装のサポート状況
**プロトコル [#z3d3c75d]
***[[OAuth]] 2.0 [#w9606fd6]
-OAuthAuthorizationServerProviderでは、[[OAuth]]のセキュアトークンサービス(STS)のEndpoint追加をサポートしており、~
これにより、Java、JavaScript、Perl、PHP、Python、Rubyなどの「非 .NET 環境」と認証処理を連携させることもできる。
*詳細 [#ufa4ac8d]
**[[ASP.NET IdentityのOAuth2によるSTS実装]] [#t880b797]
[[OAuth]] 2.0の[[基本4フロー>OAuth#c8a23ceb]]のセキュアトークンサービス(STS)機能をサポートしている。
-この処理は、[[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
*拡張 [#j102829c]
以下のように、「[[OAuth 2.0 拡張]]」や「[[OpenID Connect]]」拡張も可能。
>URLは変更可能。上記は既定値。
**[[ASP.NET IdentityのOAuth2拡張によるSTS実装]] [#w25bde9c]
**[[ASP.NET IdentityのOIDCによるSTS実装]] [#f4df076e]
-なお、[[OAuth]] 2.0は認可のプロトコルなので、認証の目的で使用する場合は[[セキュリティ>#c75e8910]]に注意が必要になる。
***[[OpenID Connect]] [#cd0c97cc]
[[OpenID Connect]]のセキュアトークンサービス(STS)のEndpoint追加は、現時点(2016年)では提供されていない。
-https://github.com/jchannon/katanaproject/tree/master/src/Microsoft.Owin.Security.OpenIdConnect
-https://github.com/jchannon/katanaproject/tree/master/src/Microsoft.Owin.Security.OAuth
**認証サイト [#h7b76293]
***構成 [#x822a240]
-[[ASP.NET MVC]]アプリケーションとして作成する。
-[[ASP.NET Identity]]を用いて、各 Web アプリのアカウント管理を行う。
-ユーザー情報へアクセスする処理は、カスタムのUserStoreクラスへ実装する。
-UserStoreクラスは、データベース(SQL Server, PostgreSQL, etc.)にユーザー情報を格納する。
***準備 [#d240d6f2]
+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
**連携サイト(, システム, アプリ) [#o40edf90]
***[[cURLコマンド]] [#nd05e06c]
[[http://localhost:XXXX/Token Endpoint>#zd7b2804]]のシナリオを検証する。
-HTTPClientなどから/Token Endpointにアクセスして連携するシナリオ。
-自サイト内に閉じないため、CORS (Cross-Origin Resource Sharing)への対応が必要。
***JavaScript [#o67fc248]
[[http://localhost:XXXX/Account/Authorize Endpoint>#ua532943]]のシナリオを検証する。
-SPA(Browser+WebAPI)で、WebAPI(OAuthリソース)へのアクセスを認可するシナリオ。
-自サイト内に閉じるため、CORS (Cross-Origin Resource Sharing)への対応が不要。
* /Token Endpointの検証手順 [#zd7b2804]
以下のブログの内容を参考に、
-「[[Resource Owner Password Credentialsグラント種別>OAuth#i2483bc0]]」
-「[[Client Credentialsグラント種別>OAuth#ka6e3a8f]]」
のシナリオの検証を行うことができる。
-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
**前提 [#xe03ec6c]
ここでは、以下のような前提の検証用アプリケーションを構築する。
+--------+ +----------------+
| 非 |--(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認証チェットを発行する。
**認証サイト開発 [#e784dfce]
コードの提示はGithub登録まで待ってください。
**Web アプリ開発 [#vdcf702a]
ここの検証では、[[cURLコマンド]]を使用するため開発不要。
**認証連携の動作検証 [#jcf369d6]
[[cURLコマンド]]を使用して認証連携の動作を検証する。
***[[Resource Owner Password Credentialsグラント種別>OAuth#i2483bc0]] [#ka3a0c97]
-処理の概要
--/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"}
***[[Client Credentialsグラント種別>OAuth#ka6e3a8f]] [#h00dd765]
-処理の概要
--/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の取得
---Request (cURLコマンド)
>curl "http://localhost/OAuthBearerToken" -H "Content-Type: application/x-www-form-urlencoded;" -d "grant_type=client_credentials" -d "client_id=XXXXXX" -d "client_secret=YYYYYY"
---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"}
* /Account/Authorize Endpointの検証手順 [#ua532943]
ここでは、以下の手順で作成した検証手順を使用して、~
「[[Implicitグラント種別>OAuth#h347a7c6]]」のシナリオの検証を行うことができる。
+[[ASP.NET SPA]]テンプレートの動作確認を行なった後、
+[[ASP.NET MVC]]テンプレートの差分を確認した上で、
+[[OAuth]]に必要な実装を抽出し、
+[[ASP.NET MVC]]テンプレートに[[OAuth]]のEndpointを追加する手順を書き出し、
+その手順の妥当性を以下の検証手順によって検証した。
**前提 [#d1cbf5ad]
ここでは、以下のような前提の検証用アプリケーションを構築する。
+--------+ +----------------+
| |--(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
**認証サイト開発 [#c21960e5]
コードの提示はGithub登録まで待ってください。
***ApplicationOAuthProviderの追加 [#p7230d13]
Providersフォルダを作成し、[[OAuth]]のProviderであるApplicationOAuthProviderを追加する。
***Startup.Authで、定義したApplicationOAuthProviderを登録 [#ne9dff79]
前述のApplicationOAuthProviderを[[OAuth]]のProviderとして登録する。
***AccountControlleに、Authorizeメソッドを追加 [#kbfc7121]
Authorizeメソッドで認証を行なう。
Authorizeメソッドで認証した後、
+Bearer Tokenを発行する。
+クライアントはBearer Tokenを使用してOAuthリソースにアクセスする。
+サーバはOAuthリソースへのアクセスを認可できるようになる。
***AccountControlleにReturnBearerTokenScreenメソッドを追加 [#o906f348]
Authorizeメソッド実行後にRedirectされる先のAction MethodとViewを準備する。
-Action Method~
URL に付与された、Bearer Token を取得し、Bearer Tokenを返す。
-View~
通常、Bearer Tokenが露見しないように、Hiddnか何かに埋め込む。
***WebApiConfigの追加 [#f8401f40]
App_Startフォルダに、[[ASP.NET Web API]]の設定を行うためのWebApiConfig.csを追加する。
***Global.Application_Startメソッドで、定義したWebApiConfigを登録 [#p01544d0]
Global.asax.csのApplication_Startメソッドで、定義したWebApiConfigの設定を登録。
***OAuthClaimViewModelの追加 [#rb31aea0]
Models フォルダに、Claimを返すためのOAuthClaimViewModel.csを追加する。
***OAuthResourceControllerの追加 [#hcd30f84]
Controller フォルダに、Claimを返すためのOAuthResourceController.csを追加する。~
ここに、Claim等の[[OAuth]]のResourcesを返すための[[ASP.NET Web API]]のメソッドを追加する。
**Web アプリ開発 [#we1f472c]
JavaScriptとして実装する。
コードの提示はGithub登録まで待ってください。
**認証連携の動作検証 [#a85aac65]
次のURLでアクセスするだけでよい。
http://localhost/Account/Authorize?client_id=self&response_type=token
/Account/Authorize Endpointに到達する前に、Forms認証されるため、~
/Account/Authorize Endpointでは、Forms認証のクレデンシャルを使用して認証し、~
Tokenを発行→OAuthリソースにアクセスする。
*参考 [#k32a6edf]
-OAuthAuthorizationServerProvider クラス (Microsoft.Owin.Security.OAuth)~
https://msdn.microsoft.com/ja-jp/library/microsoft.owin.security.oauth.oauthauthorizationserverprovider.aspx
**Tsmatz [#i87cb2b3]
-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 [#p632449f]
-ASP.NET WebAPI2でAjaxでOAuth認証するよ(ついでにTypeScriptとReact)~
http://blog.okazuki.jp/entry/2016/01/15/215901
-HttpClientクラスがリダイレクトをよきに計らってくれるのをどうにかしたい~
http://blog.okazuki.jp/entry/20121225/HttpClientTips
**The ASP.NET Site [#e91aecfc]
-OWIN OAuth 2.0 Authorization Server~
https://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server
このコンテンツは以下の様な構成になっている。
***Create an Authorization Server [#ub84ef28]
-このAuthorization ServerはOAuthの4つのフローをサポートしている。
--Authorization Code Grant Client
--Implicit Grant Client
--Resource Owner Password Credentials Grant Client
--Client Credentials Grant Client
-サーバーの設定と実装
--OWIN Startup classでの設定
--OAuthAuthorizationServerProviderの実装
---ValidateClientRedirectUri~
(Authorization Code, Implicitグラント種別)
---ValidateClientAuthentication~
(すべてのグラント種別)
---GrantResourceOwnerCredentials~
(Resource Owner Password Credentialsグラント種別)
---GrantClientCredetails~
(Client Credentialsグラント種別)
--AuthorizeEndpointの実装~
(Authorization Code, Implicitグラント種別)
***Creating a resource server [#ld778043]
アクセストークンによって保護されたresource serverのendpointを作成。
***Create OAuth 2.0 Clients [#y247ad21]
.NETクライアントからHTTPアクセスする際のライブラリとしては、[[DotNetOpenAuth.OAuth2>https://www.nuget.org/packages/DotNetOpenAuth.OAuth2.Client]]を使用している。
-Authorization Code Grant Client~
WebApplicationとして実装。
-Implicit Grant Client~
JavaScriptで実装。
-Resource Owner Password Credentials Grant Client~
コンソール・アプリケーションで実装。
-Client Credentials Grant Client~
コンソール・アプリケーションで実装。
***関連する情報 [#tc543bde]
-The ASP.NET Forums
--OWIN and Authorization Code Grant Flow - Always Bad Request (Invalid Grant)~
https://forums.asp.net/t/1975505.aspx?OWIN+and+Authorization+Code+Grant+Flow+Always+Bad+Request+Invalid+Grant+
-Stack Overflow
--MVC 5 application - implement OAuth Authorization code flow~
http://stackoverflow.com/questions/25845420/mvc-5-application-implement-oauth-authorization-code-flow
--asp.net - Authorization_code grant flow on Owin.Security.OAuth: returns invalid_grant~
http://stackoverflow.com/questions/24515211/authorization-code-grant-flow-on-owin-security-oauth-returns-invalid-grant
-その他
--AuthServerTests.cs | Source Browser~
http://sourcebrowser.io/Browse/jchannon/katanaproject/tests/FunctionalTests/Facts/Security/AuthServer/AuthServerTests.cs#207
**[[OAuth2.0のセキュリティについて。>OAuth#v33a7e19]] [#c75e8910]
----
Tags: [[:ASP.NET]], [[:ASP.NET MVC]], [[:ASP.NET SPA]], [[[[ASP.NET Web API]]]], [[:ASP.NET Identity]]
Tags: [[:.NET開発]], [[:ASP.NET]], [[:ASP.NET MVC]], [[:ASP.NET SPA]], [[ASP.NET Web API]], [[:ASP.NET Identity]], [[:認証基盤]], [[:セキュリティ]]
Special thanks go to mg-san for his support.