アプリケーション開発者のため
のAzure Active Directory
GoAzure 2015 / 2015.01.16
JAZUG 青木 賢太郎
JAZUG 亀渕 景司
アジェンダ (Azure AD 1/3)
• Azure ADまわりのIDシナリオ
– クラウドID
– クラウドID+ディレクトリ同期
– フェデレーションID
• Azure ADの特徴
– セキュリティ、レポート
2
アジェンダ (Webサーバ 2/3)
• Identityライブラリ(主にWebサーバ側)
– WIF、Katana
– VS2013/2015(Preview)テンプレート
• 単一組織のWebアプリ
– WIF、Katana、Websites
– ホーム・レルム・ディスカバリ
• 複数組織のWebアプリ
– マルチテナント
3
アジェンダ (クライアント 3/3)
• Identityライブラリ(主にクライアント側)
– ADAL
• クライアントアプリのAzure AD利用
– ネイティブアプリ
• Graph API
– REST API, Azure AD Graph Client ライブラリ
4
本セッションでは
• アプリケーション開発者の視点
でAzure ADをどのように使う
ことができるのか?
• クラウドデザインパターン本の
Federated Identityパターンの
理解につながればと考えていま
す。
5
Speaker's
6
{
"objectType": "User",
“displayName”: “青木 賢太郎",
"mail": "aoki-kentaro@mki.co.jp",
“company”: “三井情報株式会社",
"onPremisesSecurityIdentifier": null,
"odata.type": "Microsoft.DirectoryServices.User"
}
MKI
Speaker's
{
"name" : "Keiji Kamebuchi",
"corporation" : "pnop Inc.",
"mail" : "kamebuchi@pnop.co.jp",
"web" : "http://buchizo.wordpress.com/",
"twitter" : "@kosmosebi",
}
7
buchizo@kosmosebi
Senior Fellow
大事なお知らせ
8
• このセッションは 2015/01/16 時点の情報を
基にしています
• 最新情報はWebで❕
AZURE ADまわりのIDシナリオ
9
– それぞれのWebアプリで
ユーザ/パスワードを管理
– 社員が辞めた場合は、それ
ぞれのWebアプリからユー
ザ情報を削除しないといけ
ない
– ユーザ情報がそれぞれのア
プリで異なる。パスワード
を覚えるのが大変
10
Webアプリ
Webアプリ
Green社
– 社内のディレクトリサーバと連
携して、ユーザ情報を一元管理
– 社員が辞めた場合は、それぞれ
のWebアプリからユーザ情報
を削除しないといけない
– ユーザ情報がそれぞれのアプリ
で異なる。パスワードを覚える
のが大変
Webアプリ Webアプリ
Webアプリ Webアプリ
Active Directory
Green社
– Azure ADの認
証基盤を使うこ
とにより、クラ
ウドアプリの
ユーザも一元管
理
Webアプリ Webアプリ
Webアプリ Webアプリ
Active DirectoryADFS
(Proxy)
Office365
(SaaS)
Webアプリ
Green社
Azure AD
Green社
– オンプレミスのディレクトリが存在しな
い場合
– 新たに会社を作るなど、迅速にビジネス
を開始する場合など Office365
(SaaS)
Azure ADWebアプリ
Red社
– Webアプリはユーザ
の意思によりAzure
ADとの連携が可能に
なる
– Webアプリ提供者は
Office365などを利用
している企業に対して、
クラウドサービスを提
供しやすい
14
複数組織が利用する
Webアプリ
(SaaS提供するときなど)
Red社 Black社 Green社
Azure AD
Webアプリとの連携に同意
Black社の
AzureADテナント全体管理者
AZURE ADの機能特徴
15
17
– 不明なソースからのサインイン
• テナントに正常にサインインしているが、Microsoftが認識している匿名のプロキシIPア
ドレスからの接続元である場合のログレポート。悪意の目的で使用される場合があるた
め。
– 複数のエラー発生後のサインイン
• 複数回連続してサインインの試行に失敗した後に、正常にサインインしたユーザーの、
失敗したサインイン試行数と成功時のログレポート。ユーザーがパスワードを忘れた場
合もあるが、ブルート フォース攻撃の被害者になっている場合があるため。
– 複数の地域からのサインイン
• 異なる国から同一ユーザーによる2回のサインインがあり、それらの国の間をユーザー
が移動するのが不可能である場合の、サインインの時間間隔、サインインを行った国、
それらの国の間の推定移動時間ログレポート。ユーザーがパスワードを共有している場
合や、ユーザーがリモート環境を使用している場合があるが、ハッカーが複数の国から
そのアカウントにサインインしている場合があるため。
– 疑わしいアクティビティを示す IP アドレスからのサインイン(Premium)
• 疑わしいアクティビティのサインイン試行のIPアドレスログレポート。疑わしいアク
ティビティは、同じIPアドレスから短期間のうちに実施された多数のサインインの試行
失敗や、疑わしいと見なされる他のアクティビティから識別されます。
– 感染の疑いのあるデバイスからのサインイン(Premium)
• マルウェア (悪意のあるソフトウェア) の可能性があるサインイン試行のIPアドレスログ
レポート。マルウェアサーバーへの接続が試みられた IP アドレスを感染の疑いのある
デバイスとして識別されます。
– 不規則なサインイン アクティビティ(Premium)
• 機械学習アルゴリズムによって、“irregular” (不規則) と識別されたサインインの分類
と場所のログレポート。予期しない場所でのサインイン、予期しない時刻のサインイン、
またはそれらの組み合わせにより識別されます。機械学習アルゴリズムでは、イベント
が “irregular (不規則)” または “suspicious (疑わしい)” として分類されます。セキュ
リティ違反は“suspicious” の可能性が高いです。
– 異常なサインイン アクティビティのユーザー(Premium)
• 異常なサインイン アクティビティが検出された全てのユーザーアカウントをレポート。
他のすべての異常なアクティビティレポートのデータが含まれます。
– 監査レポート
• サインイン先のアプリケーション、使用デバイス、IP アドレス、場所などのレポート。
– パスワード リセット アクティビティ(Premium)
• 組織内で行われたパスワード リセットに関するログ。
– パスワード リセット登録アクティビティ(Premium)
• 組織内で行われたパスワード リセット登録のログ。
– グループ アクティビティ(Premium)
• ディレクトリ内のすべてのグループ関連アクティビティのログ。
– アプリケーションの使用状況(Premium)
• ディレクトリと統合された全ての SaaS アプリケーションの利用状況のレポート。アク
セスパネルをユーザーがクリックした回数に基づきます。
– アカウント プロビジョニングのアクティビティ
• 外部アプリケーションにアカウントのプロビジョニングを試行した回数の履歴をレポー
トします。
– アカウント プロビジョニング エラー
• SaaSアプリケーションから Azure AD へアカウントの同期中に発生したエラーをレ
ポートします。外部のアプリケーションにアクセスするユーザーの機能に問題があるこ
とが考えられます。
IDENTITYライブラリ
Azure ADに関係する
.NET3.0 .NET3.5 .NET4.0 .NET4.5+
リソースを保護する
Identityライブラリ
Webアプリや、Web
APIで利用
WCF
WIF 1.x WIF 4.5 with WIF Extensions (JWT, VINR)
Katana Middleware
ASP.NET 5 the security and
authorization middleware
• WIFの実装
• Katana(OWINベース)の実装
• ASP.NET 5の実装
– Web Forms
– MVC
– Web API
– ASP.NET 5 Starter Web
Visual Studio 2015
ASP.NET 4.x
Authentication
No
Authentication
Individual User
Accounts
Organization
User Accounts
Windows
Authentication
Single
Organization
Multiple
Organizations
On-Premises
Access Level
SSO,
Read directory, Write directory
設定済み単一
Windows ADテナ
ントの認証とディ
レクトリ管理
動的追加可能な複
数Windows ADテ
ナントの認証と
ディレクトリ管理
オンプレミス
ADFSの認証など
Facebook,
Google, Twitter,
Microsoftアカウン
トなどのIDプロバ
イダなどや、Ws-
Federation,
OpenIDなどが使
える
Katana WIF
ASP.NET 5
Authentication
No
Authentication
Individual User
Accounts
Facebook,
Google, Twitter,
Microsoftアカウン
トなどのIDプロバ
イダなどを使える
ASP.NET 5
– 組織内の複数部門のWebアプリ
– クラウドを含めたWebアプリ
– クラウドだけのWebアプリ
Azure ADWebアプリ
Red社
– プロジェクト作成と共に、Azure ADのアプリケーション設定が行われる
– 手動でメンテナンスする場合は、Azure ADアプリケーションの設定から
Web.confなどを設定する( WIFベースのテンプレートを使った場合)
DEMO
DEMO
DEMO
<appSettings>
<add key=“ida:FederationMetadataLocation” value=“<フェデレーションメタデータドキュメント>" />
<add key=“ida:Realm” value=“<アプリケーションID/URI>" />
<add key="ida:AudienceUri" value="<アプリケーションID/URI>" />
</appSettings>
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="<アプリケーションID/URI>" />
</audienceUris>
</identityConfiguration>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<wsFederation passiveRedirectEnabled=“true” issuer=“ <WS-FEDERATIONサインオンエンドポイント> " realm="<アプリケー
ションID/URI>" requireHttps="true" />
</federationConfiguration>
</system.identityModel.services>
DEMO
DEMO
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = "https://login.windows.net/xxx-tenant-id-xxx-
xxx/federationmetadata/2007-06/federationmetadata.xml",
Wtrealm = "http://myapp",
});
サンプルコード:
https://github.com/KentaroAOKI/GoAzureAzureADSingleKatana/blob/master/WebAppAzureADS
ingleKatanaGoAzure/App_Start/Startup.Auth.cs
C#
DEMO
ホーム・レルム・ディスカバリ
• Azure ADのサインイン
ページは共通であるた
め、ユーザアカウント
を入力した際のレルム
により各組織に合わせ
た動作が実行される。
– 組織毎に配置している
STSへリダイレクト
– 組織毎のカスタマイズ・
ブランディング・ページ
もレルムにより表示
user@domain01.com
user@domain02.com
(赤字の箇所がレルム)
domain01.comのSTS
(ADFSサーバ)
domain02.comのSTS
(ADFSサーバ)
Black社 Green社
36
Azure ADの共通サインイン画面にアカウントを入
力
アカウントのレルムから該当するADSFサーバを見
つけてリダイレクト
DEMO
37
ADFS2.0のデフォルト画面
(Windows Server 2012)
ADFS3.0のデフォルト画面
(Windows Server 2012 R2)
DEMO
Azure ADの共通ログイン画面にアカウントを入力 アカウントのレルムから該当するブランディング
画像/文字を表示
DEMO
http://msdn.microsoft.com/en-us/library/azure/dn532270.aspx
DEMO
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
MetadataAddress = "https://login.windows.net/xxx-tenant-id-xxx-
xxx/federationmetadata/2007-06/federationmetadata.xml",
Wtrealm = "http://myapp",
Notifications = new WsFederationAuthenticationNotifications
{
RedirectToIdentityProvider = (context) =>
{
context.ProtocolMessage.Whr = “vividwave.net";
return Task.FromResult(0);
}
}
});
サンプルコード:
https://github.com/KentaroAOKI/GoAzureAzureADSingleKatana/blob/master/WebAppAzureADS
ingleKatanaGoAzure/App_Start/Startup.Auth.cs
– 複数組織が利用するWebアプリ
複数組織が利用する
Webアプリ
(SaaS提供するときなど)
Red社 Black社 Green社
Azure AD
Webアプリとの連携に同意
Green社の
AzureADテナント全体管理者
– プロジェクト作成と共に、Azure ADのアプリケーション設定が行われる
DEMO
42
DEMO
DEMO
– https://account.activedirectory.windowsazure.com/Consent.aspx?Clien
tId=<クライアントID>&RequestedPermissions=<パーミッション>
&ConsentReturnURL=<リダイレクトURL>
– DirectoryReaders
• シングルサインオン、ディレクトリの読み込みアクセス
– DirectoryWriters
• シングルサインオン、ディレクトリの読み込み/書き込みアクセス
– 指定しない
• シングルサインオン
DEMO
– 外部アクセス
• オン
– アプリID/URI
• Windows Azure ADでユニークなアプリID/URI
– ロゴ
• イメージのサイズは、215px x 215px
• 中央のイメージのサイズは、94px x 94px
• サポートファイルは、.bmp、.jpg、.png)
• ファイル サイズは 100 KB 未満
– ディレクトリアクセス
• シングル サインオン
• シングル サインオン、ディレクトリ データの読み取り
• シングル サインオン、ディレクトリ データの読み取りと書き込み
45
215px
94px
DEMO
同意したアプリは自分のディレク
トリに登録される。
アクセス管理が可能に。
自分で作成
したアプリ。
DEMO
DEMO
Windows
Windows Store
Windows Phone 8.1
iOS
Android
JS
ADAL .NET 2.x
ADAL .NET 3.x
• ADAL
ADAL iOS 1.0
(Objective C)
ADAL Android 1.0
(Java)
ADAL JS (Java Script)
DEMO
DEMO
DEMO
DEMO
static string clientId = xxx-Client-Id-xxx-xxxx";
const static string commonAuthority = "https://login.windows.net/common";
static Uri returnUri = new Uri("http://appgoazure");
const string graphResourceUri = "https://graph.windows.net";
AuthenticationResult authResult = null;
AuthenticationContext authContext = null;
private async void ButtonRequestAD_Click(object sender, RoutedEventArgs e)
{
if (authContext.TokenCache.ReadItems().Count() > 0)
{
authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
}
authResult = await authContext.AcquireTokenAsync(graphResourceUri, clientId, returnUri, new
AuthorizationParameters(PromptBehavior.Auto, new WindowInteropHelper(this).Handle));
<Graph APIアクセスにつづく>
}
サンプルコード:
https://github.com/KentaroAOKI/GoAzureWpfApp/blob/master/WpfAppGoAzure/MainWindow.xaml.cs
アプリ
(ADFSサーバがある場合)
DEMO
(ADFSサーバがある場合、
信頼されている証明書が必要)
GRAPH API
ディレクトリの読み込みと書き込み
– 新しいユーザを作成
– ユーザのプロパティを取得
– 役割ベースのアクセスのためのユーザのグループメンバーシップを確認
– ユーザアカウントの無効化や削除
56
– Version 1.5
– Version 2013-11-08
– Version 2013-04-05
– https://graph.windows.net/vividwave.net?api-version=1.5
– https://graph.windows.net/vividwave.net?api-version=2013-11-08
– サービスルート
• Azure AD Graph APIのサービスルートは常にhttps://graph.windows.net
– テナントID
• オブジェクトIDもしくは、登録されているドメイン
– リソースパス
• アクセスするリソースを指定
– クエリパラメーター
• バージョンクエリパラメータ以外に、$filter、$orderby、$expand、$top、$formatの
ODataクエリパラメータも利用可能
– http://msdn.microsoft.com/ja-jp/library/azure/hh974478.aspx
– "aad.deltaLink":
"https://graph.windows.net/vividwave.net/directoryObjects?deltaLink=ADdwukWIFzUEWfYfKAaFcuZdNBkFzXHC22faZX5H-
wPjyNiIwvexHMt15jFPmlZQELMM_88V4NvGyLiC6H2LFW5HXUrCjHSaS3ck3eME7eGr2sh0PSl8i20uVLKefAdOX2Y-
lCLdDe_Xgk5SHbwthlZpNhG8FUj1J1rrseuW1ssl7wyla-VLshVSw0zlIuG4Y3aJ5CYYN3XswEvKCk3YeG8SXPLAJ01cH0g6tTYzZ-
IttOY1QR9Wrc58qdN3hW57gDt5CFU13D7KvNZROG3ceyq9HQCtMQD_rT6m9M7P-
gVGqkZRwlKBrNu3cpXSUIzR7rQ5VMHxma-SeyGgYctrnGag3Vl-AwcHMG--u4taWINgsPGBwiKSl9_FqG1Nc1F1baNn_w-
2b8rhkAvTYqUMvEBmF_zHdCZBZNFA33fIxPktPIvn5W59QxkEir6CQIGsZS_CfI1CzU423gC73nvKZnuSvp7_hr2VdYbUVaPQVVW
Oa0340j9r8JYnnw2wv4He6_YQ1rBhP8Br1It2F7vbjfWFGVnitUkjC-
hCKqmkoaDemFEY6RfrzEWa4B5uvcKIwSqKMPY0zmJb6uh0E8sl8JdXB4FcEj1QzIvyV_lYI1lwLSL7HgYJ_lOYh1IIYsVxuWfprqmFl
KkVzDesm7GbJJ6qCD2CojRLQWATTQY8j7ZVSoFFa04NWQA-
VOEQBXwKIBsL08zuDcArDuVX8zJMpmjavbfU2yl6uSfPYp_B9jueS8pEWUjzwVvpPk04CJfTo_0z6Tuwg7E724QC0PXMukLEsfX-
1x-9pOjWKgXwmpUg6yOJPutEC-TshSvDDgU6pM_Tdnmu-ISW-72RslPhu02PQzROdZQeBeaIgfxoUkX-
q5iZU573cTgtT7m1TC6BUhcJIxQEIgeC08z4xueh-
w7c1aWsrNf2hO5YxdGjCpNlX3TWPmMzs47TCKDZtTMFwMQcLwP8Pni59ZqwS56b0FwB-
B0FiaDWiqyYThxhmMr76F7WNf8TUej9F47lT-
gRPRRJnV2ZhMgfDMrYXADgqTdWUNHmL_cFvIm52PgemFDtj8o69weTyeIfGmUaSS_2ke2ZU9XixPNpWQX7phzgJrl0pT2VoH1
w5iW9cV7cG5irmY-
XuWISzsc4nnKjnyFwwWuUYqvcvGXpJ_ozY4EH_RVgFgnRFGiVyqPTv6iwOK7pyWEUK9antE6lzCGLSkEkIIuXdOQ_XG9yIw4Uor
B52cOuqJFhoTm__VGjhnvGNUNeukKwNVYSFoUxl3phpOFxxuAUQsHja5u7FarGYsiVPnA_s7hdxfBz2m6ZDKmb7RkGlpqPu_ssIF
c17mOvFOMaEk7qxF5J96WPnfWxTc1-B8cgFkahh0xb6pmpf_Z_8ExIZ_m5_ZXZ9yeU5IXPkRx0kj8t-
sZrgHsgvjC_R1mxyd228Pf9lV24yNvjaXEeva3SQ-L_1YtojhyU9ZqDNiB-
MIVLpWUPat4fSYgKiGinkkC4vAfwgtcbItSPtjRTp8ni6SUKb0RqsU-jeF-
tBx2tk4m3UghnfLhoHj3FcByBENvE7xHOmRCkDslLkvJQflJG9m7pSisKeFuT3bLWyvwwaWDzmTQlYf6wJKSV0MFIuzzvGGsQl9oz
vLIeEJHh4QXlWFaOXnW4L4RtssWrQ2PsDDt88FXy4mOA-7146JXWM5fDxvED7koeGroSEJC-fnTjdor9EhJqNYZJxH-
Nho7j8WekIxU1g_PmtfsYRnre7Q.4ddoCM3TjXK8AG7KvzgWCP-iWkNf2uozL1-3Nkkd2R8"
60
– Graph APIバージョンは1.5
– 1つのオブジェクトに100個の拡張プロパティ
– プロパティの型は、文字列(256文字まで)とBinary(256バイトまで)
– 登録できるオブジェクトは、User、Group、TenantDetail、Device、
Application、ServicePrincipal
– 拡張機能プロパティは、開発者のディレクトリにある Application オブジェ
クトに登録
– 組織内の承諾された任意のアプリケーションからアクセス権限に従ってアク
セス可能
– 組織のディレクトリ内でアプリケーションまたは承諾が削除された場合は、
ターゲット ディレクトリ オブジェクトで拡張機能プロパティが削除
– ディレクトリ
• 読み込み
• 書き込み
DEMO
string graphRequest = String.Format(CultureInfo.InvariantCulture, "{0}/{1}/users?api-
version={2}", graphResourceUri, authResult.TenantId, graphApiVersion);
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, graphRequest);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer",
authResult.AccessToken);
HttpResponseMessage response = await client.SendAsync(request);
string content = await response.Content.ReadAsStringAsync();
TextBoxResult.Text = content;
DEMO
C#
サンプルコード:
https://github.com/KentaroAOKI/GoAzureWpfApp/blob/master/WpfAppGoAzure/MainWindow.xaml.cs
Windows
Windows Store
Windows Phone 8.1
iOS
Android
JS
Graph Client 2.0
.NET
Office365 SDK iOS (Objective C)
Office365 SDK Android (Java)
ActiveDirectoryClient adc = await GetActiveDirectoryClient();
var Apps = adc.Applications.Where(App => App.DisplayName.StartsWith("W"))
.Take(10).ExecuteAsync().Result.CurrentPage.Select(App => App.DisplayName);
string content = string.Join("rn", Apps);
DEMO
GET /0c5af5a3-b318-4415-b5ec-
c03c771e421x/applications()?$filter=startswith(displayName,'W')&$top=10&api-
version=1.5 HTTP/1.1
Graph API
C#
サンプルコード:
https://github.com/KentaroAOKI/GoAzureWpfApp/blob/master/WpfAppGoAzure/MainWindow.xaml.cs
まとめ
67
WIF Katana ASP.NET 5
ADAL Graph Client
Webアプリ
ネイティブアプリ
Azure AD
ADAL
Graph Client
さいごに
• Azure ADを利用すると
– ユーザの一元管理だけでなく、最新のセュリ
ティ情報や技術が常に提供される
– アプリケーションの追加開発を行わなくても、
他の機能を後から設定で利用することが可能
になる(多要素認証など)
– オンプレミスとの連携など構成変更時もアプ
リケーションの追加開発を行わなくてもよい
69
• このセッションは
2015/01/16 時点の情報を
基にしています
• 最新情報はWebで❕
※Azureは日々進化するのでこの時点から
情報が劣化していきます…
質
問
シ
テ
ネ
!

GoAzure 2015 Azure AD for Developers