https://github.com/Azure-Samples/active-directory-dotnet-graphapi-console/tree/master/GraphConsoleAppV3からグラフコードを試しました。私のローカルシステムで動作しました。ローカルマシンでは、ウィンドウをポップアップしてログインを要求します。しかし、私がazure Web Portalにアプリケーションをデプロイすると、Itenentを表すトークンを取得する時点で失敗しました。Azure ADグラフapiはローカルでは動作しますが、デプロイ時に失敗します
[COMExceptionは(0x80004005が)。:エラーHRESULT E_FAILがCOMコンポーネントへの呼び出しから返されました] "エラーHRESULT E_FAILがCOMコンポーネントへの呼び出しから返されました"
私はこのことを考えますローカルシステムからトークンを検索しています。トークン検索オプションは、ウィンドウやWebに関連していますか?コードの変更に関する提案。
このアプリケーションを展開すると、どのように動作するのですか。私はITenantDetail tenantDetail = GetTenantDetailsSync(クライアント、UserModeConstants.TenantId)を変更できると思います。ユーザーから情報を取得するコードに変換します。これはウェブ上でも動作します。コードサンプルで使用して
private static ActiveDirectoryClient client;
client = AuthenticationHelper.GetActiveDirectoryClientAsUser();
ITenantDetail tenantDetail = GetTenantDetailsSync(client, UserModeConstants.TenantId);
public static ITenantDetail GetTenantDetailsSync(IActiveDirectoryClient client, string tenantId)
{
ITenantDetail tenant = null;
try
{
IPagedCollection<ITenantDetail> tenantsCollection = client.TenantDetails
.Where(tenantDetail => tenantDetail.ObjectId.Equals(tenantId)).ExecuteAsync().Result;
List<ITenantDetail> tenantsList = tenantsCollection.CurrentPage.ToList();
if (tenantsList.Count > 0)
{
tenant = tenantsList.First();
}
}
catch (Exception ex)
{
}
if (tenant == null)
{
return null;
}
else
{
TenantDetail tenantDetail = (TenantDetail)tenant;
return tenantDetail;
}
}
public static ActiveDirectoryClient GetActiveDirectoryClientAsUser()
{
Uri servicePointUri = new Uri(GlobalConstants.ResourceUrl);
Uri serviceRoot = new Uri(servicePointUri, UserModeConstants.TenantId);
ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(serviceRoot,
async() => await AcquireTokenAsyncForUser());
return activeDirectoryClient;
}
public static async Task<string> AcquireTokenAsyncForUser()
{
return await GetTokenForUser();
}
public static async Task<string> GetTokenForUser()
{
if (TokenForUser == null)
{
var redirectUri = new Uri("https://localhost");
AuthenticationContext authenticationContext = new AuthenticationContext(UserModeConstants.AuthString, false);
AuthenticationResult userAuthnResult = await authenticationContext.AcquireTokenAsync(GlobalConstants.ResourceUrl,
UserModeConstants.ClientId, redirectUri, new PlatformParameters(PromptBehavior.RefreshSession));
TokenForUser = userAuthnResult.AccessToken;
}
return TokenForUser;
}
「Azure Webポータルにデプロイする」とはどういう意味ですか?サンプルはコンソールアプリケーションですか? – RasmusW
コンソールアプリケーションをWebアプリケーションに更新して公開しました。 – Kurkula
その場合、COM例外は、ログイン・ダイアログを表示するためにIEインスタンスを開始しようとしているコードに起因すると思います。おそらくWebアプリケーションサンプルの1つを出発点として使用するべきです([Fei Xueの答え](http://stackoverflow.com/a/42643452)など))。 – RasmusW