基本的には自社用に作っている社員ポータルにSSOを実装しているのですが、グラフAPIにもアクセスできるようにしたいです(少なくとも、AzureAD REST APIの項目の追加/削除/取得など) SSO 経由でサインインする必要はありません。
このようにして、ある種の API キー/秘密のセットアップであると考えているものを使用して、何らかの方法で AD と対話する cron ジョブをスケジュールできます。技術的には、サインインして自分のアカウントをこれを実行するアカウントに設定することはできますが、それは一種のハッキーで信頼性が低いようです (たとえば、アカウントに何かが起こった場合、パスワードの有効期限が切れたり、変更されたりすると、更新トークンはもはや再度サインインする必要があり、タスクが一時的に中断される可能性があります。)
数か月前にこれを実装することを検討していたときに、これに関するドキュメントをどこかで見たことがあると断言できましたが、今では一生見つけることができません。
これが重複していないことを本当に願っています。検索する言葉遣いが思いつかないだけで、SSO ベースの API 情報が得られません。
更新 - わかりました、私はこれを理解したようです (以下に投稿された Shaun Luttin の回答の助けを借りて: https://stackoverflow.com/a/32618417/3721165 [便利なリンク])
ですから、ショーンがまとめてくれたすべての情報は本当に役に立ちました。当初、ドキュメントは、言葉遣いの仕方や、いくつかの例の複雑さのために、かなり混乱していました。しかし、いくつかの例に加えて、Shaun が提供した情報のいくつかを掘り下げ、自分でいくつかの実験/研究を行うと、これを思いつくことができました (基本的なデモ/概念):
using System;
using System.Globalization;
using System.Threading.Tasks;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Azure.ActiveDirectory.GraphClient;
namespace AzureADGraphApi
{
class Program
{
private static string tenant = "...tenant id...";
private static string clientid = "...client id...";
private static string appkey = "...app key...";
private static string aadinstance = "https://login.microsoftonline.com/{0}";
private static string graphResourceUrl = "https://graph.windows.net";
static void Main(string[] args)
{
Uri serviceRoot = new Uri(graphResourceUrl + "/" + tenant);
ActiveDirectoryClient adc = new ActiveDirectoryClient(serviceRoot, async () => await GetToken());
IPagedCollection<IUser> Users = adc.Users.ExecuteAsync().Result;
bool pagesLeft = false;
do
{
foreach (IUser user in Users.CurrentPage)
{
Console.WriteLine(user.DisplayName);
}
pagesLeft = Users.MorePagesAvailable;
Users = Users.GetNextPageAsync().Result;
Console.WriteLine("--- Page Break ---");
} while (pagesLeft);
Console.ReadLine();
}
private static async Task<string> GetToken()
{
AuthenticationContext authContext = new AuthenticationContext(String.Format(CultureInfo.InvariantCulture, aadinstance, tenant));
AuthenticationResult result = authContext.AcquireToken(graphResourceUrl, new ClientCredential(clientid, appkey));
return result.AccessToken;
}
}
}
さらなる調査の結果、Graph API を意図したとおりに使用するには、アプリ ID/ URL。
だから、私はショーンの答えを受け入れていますが、その答えの私の作業結果も伝えたかったのです。
助けてくれてありがとう、みんな!