Office 365 でイベント (カレンダー) を自動的に追加/削除/更新するアプリを作成しようとしています。
このチュートリアルに従いました: https://dev.outlook.com/RestGettingStarted/Tutorial/dotnet。このようにして、アプリでメールを読み、イベントを読むことができました。
しかし、スコープ "" https://outlook.office.com/Calendars.ReadWrite " を追加してイベントを追加しようとすると、有効な認証トークンを取得できないようです。
ブレークポイントを使用すると、authResult.Token の値が null であることがわかります。適切なトークンを取得するにはどうすればよいですか?
public class HomeController : Controller
{
// The required scopes for our app
// "https://outlook.office.com/calendars.read",
// "https://outlook.office.com/Calendars.ReadWrite"
// "https://outlook.office.com/mail.read",
private static string[] scopes = { "https://outlook.office.com/mail.read",
"https://outlook.office.com/Calendars.ReadWrite" };
public async Task<ActionResult> SignIn()
{
string authority = "https://login.microsoftonline.com/common";
string clientId = System.Configuration.ConfigurationManager.AppSettings["ida:ClientID"];
AuthenticationContext authContext = new AuthenticationContext(authority);
// The url in our app that Azure should redirect to after successful signin
Uri redirectUri = new Uri(Url.Action("Authorize", "Home", null, Request.Url.Scheme));
// Generate the parameterized URL for Azure signin
Uri authUri = await authContext.GetAuthorizationRequestUrlAsync(scopes, null, clientId,
redirectUri, UserIdentifier.AnyUser, null);
// Redirect the browser to the Azure signin page
return Redirect(authUri.ToString());
}
public async Task<ActionResult> Authorize()
{
// Get the 'code' parameter from the Azure redirect
string authCode = Request.Params["code"];
string authority = "https://login.microsoftonline.com/common";
string clientId = System.Configuration.ConfigurationManager.AppSettings["ida:ClientID"];
string clientSecret = System.Configuration.ConfigurationManager.AppSettings["ida:ClientSecret"];
AuthenticationContext authContext = new AuthenticationContext(authority);
// The same url we specified in the auth code request
Uri redirectUri = new Uri(Url.Action("Authorize", "Home", null, Request.Url.Scheme));
// Use client ID and secret to establish app identity
ClientCredential credential = new ClientCredential(clientId, clientSecret);
try
{
// Get the token
var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(authCode,
redirectUri, credential, scopes);
// Save the token in the session
Session["access_token"] = authResult.Token;
// Try to get user info
Session["user_email"] = GetUserEmail(authContext, clientId);
// return Content("Access Token: " + authResult.Token);
return Redirect(Url.Action("Inbox", "Home", null, Request.Url.Scheme));
}
catch (AdalException ex)
{
return Content(string.Format("ERROR retrieving token: {0}", ex.Message));
}
}