Azure Active Directory の SSO 開発 (Visual Studio 2013 編)


環境 :
Visual Studio 2013 RC

開発者にとっての Microsoft Azure Active Directory

ここでは Visual Studio 2013 を例に解説しています。Visual Studio 2013 では WS-Federation が使用されますが、Visual Studio 2015 以降では OpenID Connect が使用されます。(OWIN のライブラリーが使用されています。)

こんにちは。

今日は、Visual Studio 2013 を使用した Azure Active Directory との連携開発について紹介します。
ASP.NET の Web アプリを作成し、Azure AD を使った認証をおこないます。接続された他の Web アプリがある場合、毎回 ログイン (SignOn) しなおす必要はなく、1 度 SignOn をおこなうと他のアプリも SignOn された状態で使用できる SSO (Single SignOn) の Experience が提供されます。

まず当然ですが、「Azure Active Directory とは (事前準備)」を参照の上、あらかじめ Azure Active Directory の Directory を作成しておいてください。また、全体管理者 (Global Administrator) のユーザーをあらかじめ追加しておいてください。(今回は、Directory のドメインを「tsmatsuzdom01.onmicrosoft.com」と仮定します。)

Visual Studio 2013 を起動して、[ASP.NET Web アプリケーション] のプロジェクトを新規作成します。
すると、プロジェクト作成の際のウィザードで [認証の変更] (Change Authentication) ボタンが表示されるので、このボタンを押します。

つぎに表示されるダイアログ ボックスで、[組織アカウント] (Organization Account) を選択します。(「組織アカウント」とは「Azure Active Directory または Windows Server Active Directory のアカウント」を意味しています。)
また下図の通り、右ペインのドメインに、あらかじめ準備しておいた Directory のドメイン (今回の場合は「tsmatsuzdom01.onmicrosoft.com」) を入力しておきます。
例えば、この Web アプリケーション (サーバー側) から Azure Active Directory Graph (Graph API) にアクセスする場合、下図の [アクセス レベル] (Access Level) を使って権限を指定できます。例えば、アプリケーションでユーザー一覧を表示する場合には、下図のようにディレクトリ データの読み込みも可能なように構成できます。

上記の設定が完了したら、プロジェクトの新規作成を実行します。
この際、内部で以下の 2 つの設定がおこなわれます。また、Azure Active Directory へのログインが必要となりますが、この際、上記で準備しておいた全体管理者 (Global Administrator) のユーザーでログインしてください。(Microsoft Account は NG です。)

  • Azure AD へのアプリケーション登録 :
    本来の手順は、あらかじめ、Azure Portal などを使って Azure Active Directory (指定した Directory) へ Application (Service Principal) を登録し (アプリケーションの URL なども設定します)、登録時に発行される Id (Client Id) などの情報を使って Web アプリケーション側を構成します。しかし、上記の Visual Studio を使用した手順によって、自動で Azure AD への Application 登録がおこなわれます。(上述のアクセス レベルも設定されます)
  • Web アプリケーションへのコードの追加 :
    作成した Web アプリケーションへのシングル・サインオン (SSO) のためのコードが記述されます。コードの内容は、主に Web.config に対する設定です。(作成されたアプリケーションの Web.config を開いて確認してみてください。)
    既定ではページを表示する際に Azure Active Directory に強制的にリダイレクトされる設定になっていますが、こうした細かな設定の変更や、ユーザー属性 (クレーム) を使ったアプリケーション独自な処理などは、開発者 (プログラマー) 自身が、Web.config 編集やロジック コードを記述するなどして対応します。

例えば、プロジェクトの作成後に Windows PowerShell を使って Azure Active Directory の Directory を確認すると、下記の通り Service Principal が作成されています。(PowerShell Cmdlet の使用方法については「Azure Active Directory とは (事前準備)」を参照してください。)

PS > Get-MsolServicePrincipal -All

. . .
ExtensionData         : System.Runtime.Serialization.ExtensionDataObject
AccountEnabled        : True
Addresses             : {Microsoft.Online.Administration.RedirectUri}
AppPrincipalId        : e6aa0b6d-6acd-4117-ab88-98bb32219aff
DisplayName           : WebApplication1
ObjectId              : 331470de-ca9c-4885-9a93-47d1d534127e
ServicePrincipalNames : {https://tsmatsuzdom01.onmicrosoft.com/WebApplication1,
  e6aa0b6d-6acd-4117-ab88-98bb32219aff}
TrustedForDelegation  : False

なお、上記の Addresses には、ちゃんと、このアプリケーションのアドレスが登録されています。

PS> $sp = Get-MsolServicePrincipal -AppPrincipalId e6aa0b6d-6acd-4117-ab88-98bb32219aff
PS> echo $sp.Addresses

ExtensionData              Address ...
-------------              -------
System.Runtime.Serializ... https://localhost:44300/ ...

Azure ポータル上でも、Active Directory のアプリケーションを確認すると、下図の通り表示されます。

また、この作成したプロジェクトを Visual Studio を使って Azure Web App (旧 Azure WebSite) に発行 (配置) すると、新しい Application (Service Principal) も自動的に登録されます。この場合も、全体管理者でのログインを要求されます。(もちろん、ftp や git を使って自身で発行した場合は自動設定されませんので、自身で設定をおこなってください。)

補足 (追記) : Visual Studio 2013 のプロジェクト テンプレートでは、Azure Active Directory (Azure AD) と連携している Directory (Tenant) の情報をデータベース (SQL Server) に保持しており、動的に Directory (Tenant) に Consent (sign up) してデータベースに保持する multi-tenant 対応の Web アプリケーションを簡単に構築できるようになっています。
このため、プロジェクトを Azure に発行する際は、発行時にデータベース接続文字列 (DefaultConnection) を SQL Database のデータベースに変更しておいてください。(この構成をおこなわないと、Azure 発行後にエラーが発生して、動作しません。)

Web アプリケーション内では、氏名、メールアドレスなどのユーザー属性 (クレーム) を参照できます。

[Authorize]
public ActionResult Test()
{
  ClaimsPrincipal principal = HttpContext.User as ClaimsPrincipal;
  string res = "";
  foreach (var claim in principal.Claims)
  {
    res += claim.Type + "=" + claim.Value + "<br>";
  }
  ViewBag.Message = res;

  return View();
}

その他にも、ログイン ボタンなどを設けてオンデマンドにログインをおこなう (既定では、ページを表示する際に Azure Active Directory に強制的にリダイレクトされます) など、応用的なプログラミングが可能です。詳細については、以前投稿した「Azure Active Directory の SSO 開発 (Identity and Access Tool 編)」で紹介していますので参考にしてください。

Comments (0)

Skip to main content