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

目次

概要

(前提知識に、OAuth 2.0 の知識を要する)

外部ログインすると、通常、

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

外部ログイン(認証)の拡張仕様

これは、OAuth 2.0「Authorization Codeグラント種別」の拡張仕様になる。

ASP.NET Identity用のMicrosoftアカウントの外部ログイン・ライブラリの場合

動作を分析した所、

となっている。

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

Redirectエンドポイント

仲介コード → Access Token → クレームへの変換処理を行っている模様。

Callbackのエンドポイント

この時点で情報は全て、.AspNet?.ExternalCookie?に同梱されるもよう。
(恐らく、クレームなどの情報の露見を防ぐためと思われる)

遷移元への遷移

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

セキュリティに関する考慮点

以下をライブラリ内で処理することで、セキュリティを高くしている。

ASP.NET Identity用のGoogleアカウントの外部ログイン・ライブラリの場合

Redirectエンドポイント

Callbackのエンドポイント

遷移元への遷移

セキュリティに関する考慮点

Bearer TokenやクレームをJWTフォーマットに変更する

Tokenやクレームに、JWTフォーマットを使用すれば、
改竄、置換、CSRF(XSRF)などを検出することができる。

詳しくはコチラを参照。

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

課題

問題は、クライアント(User-Agentやスマホネイティブ)という仲介者が存在する中で、サーバ間認証をする必要があること。

課題1

User-Agentやスマホネイティブで上記外部ログイン方式に習い、
OAuth 2.0の「Implicitグラント種別」でClientではなく、
"仲介者"であるUser-Agentやスマホネイティブに返したクレームを使って
サーバ認証というのも意味不明な(認証になって無い)仕様なので、

結局、User-Agentやスマホネイティブでも

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

課題2

外部ログインした場合、その後に、

サーバとクライアント(User-Agentやスマホネイティブ)間で認証するための認証チケット(的なモノ)を、
サーバが、(改竄、置換などの攻撃を行う可能性のある)"仲介者"であるクライアントへ発行する必要がある。

解決

JWTを使用すれば、クライアントを経由しても、
安全にサーバ間で認証可能な、認証チケット(的なモノの)を発行できる。

方法

コチラを参照。

Hybrid(Webアプリケーション)の場合

Authorization Codeグラント種別で、
認証チケット(的なモノの → JWTのアサーション)を取得できる。

SPA & WebAPIの場合

Implicitグラント種別だと、アクセストークンが露見するので、
同様に、Authorization Codeグラント種別で、
認証チケット(的なモノの → JWTのアサーション)ダケを取得しても良い。

スマホネイティブ & WebAPIの場合

参考


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


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