C# Azure AD graph api在本地运行,但部署时失败

C# Azure AD graph api在本地运行,但部署时失败,c#,asp.net-mvc,azure-web-app-service,azure-active-directory,azure-ad-graph-api,C#,Asp.net Mvc,Azure Web App Service,Azure Active Directory,Azure Ad Graph Api,我试过了graphapi代码。它在我的本地系统中起作用。在本地机器上,它会弹出一个窗口并要求登录。但当我将应用程序部署到azure web portal时,它在获取令牌sing itent时失败 “调用COM组件时返回错误HRESULT E_FAIL” [COMException(0x80004005):调用COM组件时返回错误HRESULT E_FAIL.] 我想这是从本地系统搜索令牌。我的令牌检索选项是否与windows或web相关?关于代码更改的任何建议 部署时如何替换此应用程序才能正常工

我试过了graphapi代码。它在我的本地系统中起作用。在本地机器上,它会弹出一个窗口并要求登录。但当我将应用程序部署到azure web portal时,它在获取令牌sing itent时失败

“调用COM组件时返回错误HRESULT E_FAIL” [COMException(0x80004005):调用COM组件时返回错误HRESULT E_FAIL.]

我想这是从本地系统搜索令牌。我的令牌检索选项是否与windows或web相关?关于代码更改的任何建议

部署时如何替换此应用程序才能正常工作。我认为如果我们可以更改ITenantDetail tenantDetail=GetTenantDetailsSync(client,UserModeConstants.TenantId);从用户那里获取信息的代码,这在web上也应该有效

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;
        }
私有静态ActiveDirectoryClient;
client=AuthenticationHelper.getActiveDirectoryClientSuser();
ITenantDetail tenantDetail=GetTenantDetailsSync(客户端,UserModeConstants.TenantId);
公共静态ITenantDetail GetTenantDetailsSync(IActiveDirectory客户端,字符串tenantId)
{
ITenantDetail租户=null;
尝试
{
IPagedCollection tenantsCollection=client.TenantDetails
.Where(tenantDetail=>tenantDetail.ObjectId.Equals(tenantId)).ExecuteAsync().Result;
List tenantsList=tenantsCollection.CurrentPage.ToList();
如果(tenantsList.Count>0)
{
tenant=tenantsList.First();
}
}
捕获(例外情况除外)
{
}
if(租户==null)
{
返回null;
}
其他的
{
租户详细信息租户详细信息=(租户详细信息)租户;
归还租户详情;
}
}
公共静态ActiveDirectoryClient GetActiveDirectoryClientSuser()
{
Uri servicePointUri=新Uri(GlobalConstants.ResourceUrl);
Uri serviceRoot=新Uri(servicePointUri,UserModeConstants.tenatid);
ActiveDirectoryClient ActiveDirectoryClient=新的ActiveDirectoryClient(serviceRoot,
async()=>await AcquireTokenAsyncForUser());
返回activeDirectoryClient;
}
公共静态异步任务AcquireTokenAsyncForUser()
{
return wait getTokenforser();
}
公共静态异步任务GetTokenForUser()
{
if(TokenForUser==null)
{
var redirectUri=新Uri(“https://localhost");
AuthenticationContext AuthenticationContext=新的AuthenticationContext(UserModeConstants.AuthString,false);
AuthenticationResult userAuthnResult=等待authenticationContext.AcquireTokenAsync(GlobalConstants.ResourceUrl,
UserModeConstants.ClientId、重定向URI、新平台参数(PromptBehavior.RefreshSession));
TokenForUser=userAuthnResult.AccessToken;
}
为用户返回令牌;
}
代码示例中使用的 帮助开发人员在各种平台(包括Windows桌面、Windows应用商店、Xamarin iOS和Xamarin Android)上为您的.NET客户端使用身份验证功能


如果您正在开发web应用程序,请参考代码示例。如果您还想在web应用程序中使用Azure AD graph API,可以参考代码示例

Microsoft还提供了许多使用Azure开发的示例,您可以从以下链接找到它们:


您的意思是登录弹出窗口在本地主机上可以正常工作,但在部署时不会弹出?有关解决方案,请参阅此链接


您必须使用powershell登录。如果我误解了您的问题,请纠正我。

您所说的“部署到Azure web门户”是什么意思。示例是一个控制台应用程序?将控制台应用程序更新为Web应用程序并发布。在这种情况下,我认为COM异常源于试图启动IE实例以显示登录对话框的代码。您可能应该使用其中一个web应用示例作为起点(如中)。如果您正在开发web应用,则不会向最终用户提示该对话框,因为代码正在服务器端运行。在这个场景中,请参考我文章中的代码示例。如果你有任何问题,请随时告诉我。