Microsoft Graph 用のアプリの登録
アプリの登録
- 「Azure Active Directory 管理センター」を開く
- サイドメニューの「Azure Active Directory」をクリック
- 「既定のディレクトリ」のサイドメニュー「アプリの登録」をクリック
- 「新規登録」をクリック
- 名前を付ける
- 「サポートされているアカウントの種類」で以下をチェック
任意の組織ディレクトリ内のアカウント (任意の Azure AD ディレクトリ – マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など) - 登録をクリック
リダイレクト URI を追加
- 「リダイレクト URI を追加する」→「+プラットフォームを追加」
- 「モバイル アプリケーションとデスクトップ アプリケーション」
- 「https://login.microsoftonline.com/common/oauth2/nativeclient」をチェック
アプリケーション (クライアント) ID の取得
- 登録したアプリの「アプリケーション (クライアント) ID」をコピーする
Microsoft Graphの認証(GraphClientを使用)
- 「WPF アプリ(.NET Framework)」プロジェクトを作成する
※.NET Frameworkが必要
- NuGetで以下のパッケージをインストールする
Microsoft.Identity.Client
Microsoft.Graph
Microsoft.Graph.Auth(プレリリースを含める)
- フィールドの作成
private GraphServiceClient graphClient;
- 「 TokenCacheHelper 」クラスを作成
// using System.Security.Cryptography;
static class TokenCacheHelper
{
public static void EnableSerialization(ITokenCache tokenCache)
{
tokenCache.SetBeforeAccess(BeforeAccessNotification);
tokenCache.SetAfterAccess(AfterAccessNotification);
}
public static readonly string CacheFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location + ".msalcache.bin3";
private static readonly object FileLock = new object();
private static void BeforeAccessNotification(TokenCacheNotificationArgs args)
{
lock (FileLock)
{
args.TokenCache.DeserializeMsalV3(File.Exists(CacheFilePath)
? ProtectedData.Unprotect(File.ReadAllBytes(CacheFilePath),
null,
DataProtectionScope.CurrentUser)
: null);
}
}
private static void AfterAccessNotification(TokenCacheNotificationArgs args)
{
// if the access operation resulted in a cache update
if (args.HasStateChanged)
{
lock (FileLock)
{
// reflect changesgs in the persistent store
File.WriteAllBytes(CacheFilePath,
ProtectedData.Protect(args.TokenCache.SerializeMsalV3(),
null,
DataProtectionScope.CurrentUser)
);
}
}
}
}
- IPublicClientApplicationを利用してGraphServiceClientを取得する
Microsoft Graph 用のアプリで登録したアプリの「アプリケーション (クライアント) ID」をClientIdに設定する
public static class Graph
{
public static GraphServiceClient GraphClient;
private static string ClientId = "アプリケーション (クライアント) ID";
private static string[] scopes = new string[] { "Files.ReadWrite" };
public static async Task CreateGraphClient(IntPtr windowHandle)
{
IPublicClientApplication PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority(AzureCloudInstance.AzurePublic, "common")
.WithDefaultRedirectUri()
.Build();
TokenCacheHelper.EnableSerialization(PublicClientApp.UserTokenCache);
IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync();
var firstAccount = accounts.FirstOrDefault();
try
{
AuthenticationResult authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
}
catch (Exception)
{
AuthenticationResult authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
.WithAccount(accounts.FirstOrDefault())
.WithParentActivityOrWindow(windowHandle)
.WithPrompt(Microsoft.Identity.Client.Prompt.SelectAccount)
.ExecuteAsync();
}
DeviceCodeProvider authProvider = new DeviceCodeProvider(PublicClientApp, scopes);
GraphClient = new GraphServiceClient(authProvider);
}
}
GraphClientの作成
// Create GraphClient
await Graph.CreateGraphClient(new WindowInteropHelper(this).Handle);
OneDrive内のテキストファイルを取得する
string filePath = "/Documents/MyData/test.txt";
var stream = await GraphClient
.Me
.Drive
.Root
.ItemWithPath(filePath)
.Content
.Request()
.GetAsync();
string value = "";
using (var reader = new StreamReader(stream))
{
value = reader.ReadToEnd();
}
テキストファイルをOneDriveにアップロードする
4MB以内のファイル
string filePath = "/Documents/MyData/test.txt";
var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(DateTime.Now.ToString()));
await GraphClient
.Me
.Drive
.Root
.ItemWithPath(filePath)
.Content
.Request()
.PutAsync<DriveItem>(stream);