windows phone アプリに認証と認可を実装する v1.0
TRANSCRIPT
1
Windows Phone アプリケーション 開発支援セミナー~ 認証と認可の仕組み実装する
日本マイクロソフト株式会社エバンジェリスト
安納 順一http://blogs.technet.com/junichia/
twitter @junichia
2011 年 8 月 19 日第 01 版
2
いきなりですが 意味 わかりますか?
利用者 アプリケーション Twitter
アプリ利用開始
Request Token を要求Redirect
認証 / 認可の画面を要求
Access Token 要求
認証 / 認可を完了
Access Token 発行
API 呼び出し
認証 / 認可 画面表示
CallBack url に Redirect
API
Request Token 発行
3
本日の内容
• 企業内システム と ソーシャルアプリの思想の違いから発生する、認証および認可の考え方とアーキテクチャの違いについて理解しましょう
• Windows Azure AppFabric ACS が Windows Phone アプリに与えるインパクトを理解しましょう
• IAM テクノロジーに萌えましょう
4
Agenda
1. 認証と認可を取り巻くトレンド– 企業システムとソーシャルアプリの違い– 何を認可するのか?
2. Windows Phone への実装– Twitter を使用するためのコーディング例
• OAuth 1.0a への対応– Windows Azure AppFabric ACS を使用したコーディング例
• 複数 IdP への一括対応
3. まとめ
5
登場人物と相関図
サービス( Twitter, Facebook 等)
サービスに保存されている個人情報
個人情報にアクセスしたいアプリ
サービスの利用者アプリを使いたい人
利用している
使いたいアクセスしたい
自分のもの
6
認証と認可を取り巻くトレンドここを理解すること
7
認証と認可
• 認証:本人であることを確認• 認可:アクセス権を与えること
認証 認可
どんなシステムにも「認証」と「認可」はつきまとう
「認可」に関するプロトコルが注目を浴びている
8
なぜ「認可」に注目が?
• システム間の連携(主に SSO )– アイデンティティ・フェデレーション– クレームベース セキュリティ
• クラウドへの移行– 社内ディレクトリサービスの活用– ソーシャルな IdP の活用
• ソーシャルアプリの台頭– 個人情報の保護
SAML
OAuth
9
OAuth と SAML の違い
システム管理者
要求「情報が欲しい!」
応答「氏名、メアド ... 」
利用者(情報の持ち主)
• いずれも認可をするためのプロトコル• 認可プロセスの中に(必然的に)認証が含まれる• OAuth :「 API へのアクセス」を「利用者が」認可する• SAML :「情報の送出」を「管理者が」認可する• 現在は SAML 対応製品のほうが細かな制御ができる
SAML
OAuthユーザーの情報
承認
承認
アプリケーション
IdP事前に
環境設定
その都度
10
企業内システムとソーシャルアプリの違い
• 企業内システム– システム間で「信頼」が担保されている
– アプリケーションを認証する必要は無い
– 認証と認可の対象は「利用者」
• SNS および ソーシャルアプリ– システム間の「信頼」は担保されていない
– 信頼関係のない者同志の認証と認可が必須• 「サービス」と「人」
• 「サービス」と「アプリ」
• 「人」と「アプリ」
• 「情報」と「アプリ」
登場人物が多い!
11
なぜ ソーシャルアプリ は複雑なのか
広範囲な漏えいからの保護
主にシステム / 管理者企業システム
ソーシャルアプリ 主にシステム
特定アプリへの情報公開
情報の持ち主
「システム」と「情報」と「アプリ」の持ち主が異なるアプリは「人」の認可を受けて、初めて「情報」にアクセス可能
12
アプリから情報へのアクセスを認可する方法 ①
アクセス
自分のものU
serID
Passw
ord
アプリに ID と Password を渡してしまう• アプリは信頼できる?• パスワードが変わったら?
13
アプリから情報へのアクセスを認可する方法 ②
アクセス
自分のものLv
1
認可
情報にアクセスするための 「 API へのアクセス権」を与える利用者は自身の判断でいつでもアクセス権をはく奪できる
API
( Lv
1)API
( Lv
2)API
( Lv
3)
14
Identity&Service Provider( Twitter/Facebook/Google 等)
“API へのアクセスを認可する” とは?
氏名を閲覧
メールアドレスを閲覧
投稿を閲覧
各種特権
つながりを閲覧
近況を投稿
API Lv1
アプリ
属性の主体(持ち主)
つながりを編集
外部のアプリケーションに対し、各種情報にアクセスするための API の利用を認可する仕組み
① アプリ登録
③ API にアクセス
② アクセス認可
ユーザー情報
API Lv2
API Lv3
API Lv4
15
TWITTER クライアントを作成するWindows Phone への実装
16
Twitter ~ OAuth 1.0a の場合
利用者 アプリケーション Twitter
アプリ利用開始
Request Token を要求Redirect
認証 / 認可の画面を要求
Access Token 要求
認証 / 認可を完了
Access Token 発行
API 呼び出し
認証 / 認可 画面表示
CallBack url に Redirect
API
Request Token 発行
/request_token
/authorize
/Access_token
17
Facebook ~ OAuth 2.0 の場合
利用者 アプリケーション Facebook
アプリ利用開始
認証 / 認可画面へ Redirect
Access Token 要求
認証 / 認可を完了
Access Token 発行
API 呼び出し
認証 / 認可 画面表示
CallBack url に Redirect
API
認可コードを発行
18
Twitter アプリ サンプルコードBLOG にプロジェクトをアップロードしておきます(参考)Building a ‘real’ Windows Phone 7 Twitter App Part 2 - oAuth http://samjarawan.blogspot.com/2010/09/building-real-windows-phone-7-twitter_18.html※Phone アプリを一から勉強するのに最適!
使用している OAuth ライブラリ• Hammock.dll ( hammock.codeplex.com )
19
Twitter ( OAuth 1.0a )での認可に必要な情報
ConsumerKey = "NsO5AFDsI0mzKD---------";
ConsumerKeySecret = "wE8aiRp1cbj4bb7wAf8onWbOQXhc--------";
RequestTokenUri = "https://api.twitter.com/oauth/request_token";
AuthorizeUri = "https://api.twitter.com/oauth/authorize";
AccessTokenUri = "https://api.twitter.com/oauth/access_token";
CallbackUri = "http://www.bing.com";
(参考) https://dev.twitter.com/docs/api/開発者サイトにアプリを登録すると提示される
20
OAuth 1.0a のポイント• Request Token と Access Token– Request Token
: Access Token を取得するためのトークン– Access Token
: API にアクセスするためのトークン
• Callback Url– OAuth 1.0a では必須– 最終的に戻したいアプリケーションの URL– デスクトップアプリの場合はダミー URL を入れて、
リダイレクトをキャンセル※xAuth ではデスクトップアプリに対応
21
ちなみに OpenID とは?
• 認証のためのプロトコル• どの OpenID Provider ( OP )の ID を使用しても RP にログオンできる• OP と RP の信頼は必須ではない(必要であれば RP で独自に実装する)• OAuth 2.0 ベースの OpenID Connect のリリースも控えている
OP
OP
OPOP
OP
RPRP
RP
SSO
22
OpenID と OAuth の違い
お勧め:非技術者のための OAuth 認証 (?) と OpenID の違い入門 http://www.sakimura.org/2011/05/1087/
by 崎村さん( OpenID Foundation )
• OpenID はユーザー認証のためのプロトコル• RP ごとに ID/Password が異なる不便を回避• どの OP で認証しても RP にアクセスできる
• OAuth は API へのアクセス認可のためのプロトコル• アプリケーションやWEB サイトに、ユーザー ID と
パスワードを渡す必要が無い
23
Twitter の場合
OAuth を「認証」に使うことの危険性
OAuth は「 API アクセスを認可」するためのプロトコル
認可された API は使い放題!家の鍵を預けるようなもの(崎村氏)
ここまでの権限が本当に必要?
24
複数 IDP に対応させるWindows Phone への実装
25
インターネットには IdP がいっぱい
26
個別に対応すると大変 ...orz
RESTful Web Service
Application
Access Tokenここで複数 IdPに対
応
Access Token の正当性に不安改ざんされているかも!?
Windows Live
Yahoo!
AD FS 2.0
IdP
OpenID
27
Windows Azure AppFabric ACS を使うと ...
RESTful Web Service
Windows Live
Yahoo!
AD FS 2.0
Application
IdP
Windows Azure AppFabric ACS
信頼
信頼
OpenID
AccessToken
Request Token
アプリは AppFabric ACS にだけ対応すればよい
28
Windows Azure AppFabric Access Control Service V2
サポートされているプロトコル• OAuth WRAP 2.0• WS-Federation• WS-Trust• OAuth 2.0 (Draft 13)• OpenID 2.0
トークンフォーマット• Simple Web Token ( SWT )• SAML 1.1/2.0
既成の Identity Provider との Passive な連携• Windows Live ID/ Google/ Facebool/ Yahoo!(.com)/ OpenID• Active Directory Federation Service 2.0
クラウド上に用意された STSアプリケーションのコードを変更することなく、新たな Identity Provider と連携することができる
29
コーディング例• Windows Azure Toolkit for Windows Phone 7
└ WindowsPhoneCloud.ACS
詳細な使用方法を BLOG にまとめますのでお待ちを
30
WindowsPhoneCloud.ACS で使われているオリジナルライブラリ
• AspProviders: Windows Azure Tables 用の ASP.NET Providers (Membership, Roles, Profile and Session State Store)
• System.Data.Services.Client: Windows Phone 用の OData client library (http://odata.codeplex.com)。 Azure Tables へのアクセスで使用。
• WindowsPhoneCloud.StorageClient: Windows Phone 用の Windows Azure Storage Client library .
• DPE.OAuth: Microsoft DPE OAuth2 library.
• SL.Phone.Federation: Microsoft Silverlight ACS sign in control.
• Notification Services (MPNS): Tile, Toast, and Raw.
• WindowsPhone.Recipes.Push.Messages: Push Notification Server Side Helper Library, a part of the Windows Phone 7 Push Recipe, that provides an easy way to send all three types of push notification messages that are currently supported by Microsoft Push
Windows Phone では WIF ( Windows Identity Foundation )がサポートされていないため、とても便利!
31
WP7CloudApp5.Phone
WP7CloudApp5.Web
WindowsPhoneCloud.ACS がやってること
REST(OData)
Windows Azure AppFabric ACS
信頼
信頼
クレーム変換ルール
Simple Web
Token
OAuth Wrap
REST
Windows Live
Yahoo!
AD FS 2.0
IdP
OpenID
格納
Windows Azure
http authorization ヘッダーに入れて
送信サービスへのアクセスを認可
OA
uth
2.0
ACS sign in control で簡単に実装
Isolated Storage にクレデンシャルとクレームを格納
32
SWT ~ Simple Web Token• ACS から返された SWT は
SL.Phone.Federation.Controls.RequestSecurityTokenResponseCompletedEventArgs から取得できる
• ACS から発行された SWT は、HTTP Authorization ヘッダーに格納して REST Service に POST する
"http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2femailaddress=junichia%40xxx.com&http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fname=Junichi+Anno&http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=https%3a%2f%2fwww.google.com%2faccounts%2fo8%2fid%3fid%3dAItOawlmkqO3aqYE1CE1PvWTjCLngPgHng3gZ6k&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=Google&Audience=uri%3awp7cloudapp5&ExpiresOn=1313686502&Issuer=https%3a%2f%2ftfazureforitpro.accesscontrol.windows.net%2f&HMACSHA256=g1WSUMaW8aOmO0kvfvtNj451qYIJODug29kx1H8l1Bo%3d"
Claim 1
Claim 2
Claim nIssure
AudienceExpiresOn
HMACHA256
KeyH
ash
ACS に保存されてい
る
33
SWT を分解すると
http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2femailaddress = junichia%40xxx.com&http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fname = Junichi+Anno&http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier = https%3a%2f%2fwww.google.com%2faccounts%2fo8%2fid%3fid%3dAItOawlmkqO3aqYE1CE1PvWTjCLngPgHng3gZ6k&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider = Google&Audience = uri%3awp7cloudapp5&ExpiresOn = 1313686502&Issuer = https%3a%2f%2ftfazureforitpro.accesscontrol.windows.net%2f&HMACSHA256 = g1WSUMaW8aOmO0kvfvtNj451qYIJODug29kx1H8l1Bo%3d
34
アプリケーション側の対応
• SWT 内の 4 つの主要クレームを検証する– 署名 : HMACSHA256– 発行者 : Issuer– 発行先 : Audience (== applies_to)– 有効期限 : ExpiresOn
• SWT を Authorization ヘッダーに格納して REST サービスに POST
• HTTP Authorization ヘッダーからクレームを取り出す• クレームの活用
• ユーザーのロールを判断し、サービスへのアクセス権を与える• データとしてストレージに保存
Windows Phone アプリケーション
REST サービス
35
WINDOWS PHONE セキュリティトピック
36
Windows Phone のセキュリティ関連機能対応状況
• Private Application Deployment 7.1• Windows Live ID Client API ×
→ OAuth 2.0 が使えます• Credential Manager & DPAPI Native コードの
み• Client Certificates ו Device Encryption ו Local Authentication Subsystem ×
– NTLM や Kerberos が使えない– Windows 統合認証が使えない
• WIF Support ו IPSEC Networking Stack ו IRM Protected Document 7.1• Encrypted Credential Store 7.1
WIF : Windows Identity Foundation
隠し URL による配信が可能
修正
37
(参考) Active Directory の認証を受けるには
• Phone SDK は DirectoryService Namespace に対応しておらず、現時点では Windows 統合認証も使えない
∴ WCF を経由して AD FS を使用する
WCF Service
イントラネットDMZ
ADFS PROXY AD FS AD DS
https 445
38
まとめ
39
まとめアプリケーションの利用シナリオを明確にしましょう• 企業 or ソーシャルアプリ
情報漏えい [元 ] にならないように気を付けましょう• 余分な特権は要求しない
OAuth と OpenID 周辺の動向に注目しましょう• OAuth 2.0 Draft 20 ( Final )• OpenID Connect• トラストフレームワーク
企業システムには SAML も重要です
アイデンティティ萌えは アリ です
40
世界中の “ ID” が利用者になる
41