Office 365 サービスを追加した Asp.Net Mvc アプリがあります。Azure Active Directory が作成され、ユーザー名/アプリケーションが Azure portal に適切に入力されました。
アプリからログインして認証コードを取得できます。ただし、OAuth トークンを取得するためにコードが送信されると、「リモート サーバーがエラーを返しました: (404) 見つかりません」という内容で AdalServiceException がスローされます。メッセージ。
Office365 API の通信に Owin OpenIdConnect 認証を使用しています。このために、以下に示すように、認証フローを Owin StartUp クラスに挿入しています。
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = AADAppSettings.ClientId,
Authority = AADAppSettings.Authority,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = false
},
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthorizationCodeReceived = (context) =>
{
var code = context.Code;
ClientCredential credential = new ClientCredential(AADAppSettings.ClientId, AADAppSettings.AppKey);
string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", AADAppSettings.AuthorizationUri, tenantID), new NaiveSessionCache(signedInUserID));
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(code,
new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)),
credential,
AADAppSettings.AADGraphResourceId);
AuthenticationHelper.SetToken(result.AccessToken);
return Task.FromResult(0);
},
RedirectToIdentityProvider = (context) =>
{
string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase;
context.ProtocolMessage.RedirectUri = appBaseUrl + "/";
context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
return Task.FromResult(0);
},
AuthenticationFailed = (context) =>
{
// Suppress the exception
context.HandleResponse();
return Task.FromResult(0);
}
}
});
}
以下のステートメントで例外がスローされます。
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(code,
new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)),
credential,
AADAppSettings.AADGraphResourceId);