「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>OAuth]]

* 目次 [#ba45eec0]
#contents

*概要 [#nf08aeca]
前提知識に、[[OAuth]] 2.0 の知識を要する。

>そもそも、[[OAuth]] 2.0 を認証に使用すると、~
「セキュリティ的に問題に成り得る。」と言う[[懸念点>OAuth#add861ca]]が幾つか在った。

OAuthによる外部ログイン(認証)をすると、通常、

[[OAuth]] 2.0 の Authorization Server で認証されたユーザのクレームが~
Redirectエンドポイントに返るが、これは、[[OAuth]] 2.0 自体の仕様ではない。

*外部ログイン(認証)の拡張仕様 [#m5ae941c]
これは、[[OAuth]] 2.0「Authorization Codeグラント種別」の拡張仕様になる。

-通常、[[OAuth]] 2.0では、Redirectエンドポイントには、仲介コードが返り、~
仲介コードをサーバ側でAccess Tokenに変換した後、Resources Serverへアクセスし、~
必要なResources(ここでは認証されたユーザのクレーム)を取り出して返すと言う流れになる。~

-しかし、外部ログインでは、Redirectエンドポイントに直接、このクレームが返る~
(外部ログイン・ライブラリ上で、仲介コード → Access Token → クレームへの変換処理をしている)。

**ASP.NET Identity用のMicrosoftアカウントの外部ログイン・ライブラリの場合 [#jf7626f6]
動作を分析した所、

-実際のRedirectエンドポイントは、~
http://localhost:nnnnn/signin-microsoft

-アプリケーションのCallbackのエンドポイントが、~
/Account/ExternalLoginCallback

となっている。

HTTPSのため、仲介コード → Access Tokenの、Responseを確認できず、~
[[OpenID Connect]]で実装されてる可能性もあると考えたが、~
scopeパラメタに「openid」の値を確認できなかったので、[[OAuth]] 2.0拡張と思われる。

***Redirectエンドポイント [#yd211b3f]
仲介コード → Access Token → クレームへの変換処理を行っている模様。

-GET http://localhost:nnnnn/signin-microsoft?code=AAAAA&state=BBBBB HTTP/1.1

-Cookie:
--ASP.NET_SessionId=XXXXX
--__RequestVerificationToken=YYYYY
--.AspNet.Correlation.Microsoft=ZZZZZ1

***Callbackのエンドポイント [#mc069e8d]
この時点で情報は全て、.AspNet.ExternalCookieに同梱されるもよう。~
(恐らく、クレームなどの情報の露見を防ぐためと思われる)

-GET http://localhost:nnnnn/Account/ExternalLoginCallback HTTP/1.1

-Cookie:
--ASP.NET_SessionId=XXXXX
--__RequestVerificationToken=YYYYY
--.AspNet.ExternalCookie=ZZZZZ2

***遷移元への遷移 [#z6e7095a]
認証後、遷移元へ遷移した後には、外部ログインの形跡は綺麗に消えている。

-GET http://localhost:nnnnn/ HTTP/1.1

-Cookie:
--ASP.NET_SessionId=XXXXX
--__RequestVerificationToken=YYYYY
--.AspNet.TwoFactorRememberBrowser=ZZZZZ3
--.AspNet.ApplicationCookie=ZZZZZ4

***セキュリティに関する考慮点 [#j218c1c3]
以下をライブラリ内で処理することで、セキュリティを高くしている。

-外部ログインを、ライブラリ内部で処理して、
--ユーザの実装ミスによる仲介コード、Access Token等の露見を防いでいる。
--長目のRequestVerificationToken値を使用している。

-Redirectエンドポイント→Callbackのエンドポイント間で、
--仲介コード、Access Token等が露見しないよう、エンドポイントを2段構成にしている。
--エンドポイント間のインターフェイスにCookie(ExternalCookie)を使用し、遷移後、直ちに削除している。

**OAuth 2.0 Multiple Response Type Encoding Practices [#oae281fb]
code token(Hybrid Flow)などの、新しいresponse_typeが追加されている。

(これにより、Token置換攻撃を防ぐなど、安全性を高めている模様)

-Final: OAuth 2.0 Multiple Response Type Encoding Practices~
http://openid.net/specs/oauth-v2-multiple-response-types-1_0.html

-参考
--GoogleのOAuth 2.0実装におけるToken置換攻撃の防ぎ方 - r-weblife~
http://d.hatena.ne.jp/ritou/20120702/1341235859
--OAuth 2.0 の Response Type 全パターン - OAuth.jp~
http://oauth.jp/blog/2015/01/06/oauth2-multiple-response-type/

**Bearer Tokenやクレームを[[JWT]]アサーションに変更する [#yf9cec19]
Tokenやクレームに、[[JWT]]アサーションを使用すれば、改竄、置換、CSRF(XSRF)などを検出することができる。

-[[OAuth]] 2.0ではアクセストークンまで仕様化されていないので[[JWT]]アサーションを利用可能。

-アクセストークンに、[[JWT]]アサーションを使用すれば、改竄、置換、CSRF(XSRF)等に耐える為、Implicitグラント種別でも安全性が高くなる。

-また、[[OpenID Connect]]の[[IDトークン>OpenID Connect#ofb73c59]]を参考にして、[[JWT]]アサーションを発行し、これを検証すれば、認証用途に利用できる。

-参考
--[[ASP.NET Identity]]でアクセストークンを[[JWT]]アサーションに変更できるもよう。
---詳しくは、[[コチラ>ASP.NET IdentityのOAuthによるSTS実装#a0f5b8a7]]を参照。
--モバイルアプリのユーザ認証方法についてまとめてみた - Qiita~
http://qiita.com/ledmonster/items/0ee1e757af231aa927b1
---10 Things You Should Know about Tokens~
9. JSON Web Tokens can be used in OAuth: Bearer Token~
https://auth0.com/blog/ten-things-you-should-know-about-tokens-and-cookies/#token-oauth

*User-Agentやスマホネイティブでの外部ログインについての考察 [#y96989f1]

**課題 [#y4777e16]
問題は、

-クライアント(User-Agentやスマホネイティブ)という改竄、置換などの攻撃を行う可能性のある"仲介者"が存在する中、
-「Implicitグラント種別」(アクセストークンをHTTPでサイト間を経由しクライアントに渡す)を使用して、

サーバ間でSSO認証をする必要があること。

**解決 [#z2e54cac]

***[[OAuth 2.0 Multiple Response Type Encoding Practices>#oae281fb]] [#u8f6ae88]
結局、User-Agentやスマホネイティブでも

-「Authorization Codeグラント種別」で
-サーバ(AuthorizationServerとClient)間で

外部ログインするしか無いのか?

→ code token(Hybrid Flow)などの、新しいresponse_typeが追加された。

***[[Bearer TokenやクレームをJWTアサーションに変更する>#yf9cec19]] [#d566930b]

→ 認証チケットに改竄検知の署名を追加するため[[JWT]]アサーションを使用。

*参考 [#cd0c604f]
**[[WebAPIの認証]] [#h9195579]

**[[OAuth]] [#nb690fce]
***[[JWTとOAuth2.0]] [#z7f010e7]

**[[ASP.NET Identity]] [#nf0fd670]
***[[ASP.NET Identityの外部ログイン]] [#pc0bbd22]
***[[ASP.NET IdentityによるSTS実装]] [#j471d437]
-[[ASP.NET IdentityのOAuthによるSTS実装]]

----
Tags: [[:認証基盤]], [[:ASP.NET Identity]], [[:OAuth]]

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