将Azure MS Graph API服务帐户与托管身份一起使用

pxy2qtax  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(121)

我已经安装了Azure Portal,并为我的Web API提供了应用程序注册和相关的托管身份。尽管看起来很混乱,但我还是能够部署我的应用程序,我测试了一个基本命令来提取我的Azure租户中的用户列表,如下所示,代码被注解掉了。我正在使用服务帐户的一切,但我想拉日历为特定的用户,并查看他们的数据,它回来了以下错误:
“内容类型text/html没有要解析的注册工厂”
然后,我尝试它拉用户的电子邮件,并得到了相同的错误时,试图返回结果。我在企业应用程序中的权限如下:

代码如下:

[HttpGet(Name = "GetCalendar")]
[OktaAuthorizeAttribute]
[EnableRateLimiting("api")]
public async Task<IActionResult> Get()
{
    var credential = new ChainedTokenCredential(
        new ManagedIdentityCredential(),
        new EnvironmentCredential());

    string[] scopes = new[] { "https://graph.microsoft.com/.default" };

    var graphServiceClient = new GraphServiceClient(
        credential, scopes);
    List<MSGraphUser> msGraphUsers = new List<MSGraphUser>();

    try
    {
        //var result = await graphServiceClient.Users["dfasdfdfdsafklsaf-dfsdaf-sdfdf-d"].Events.GetAsync((requestConfiguration) =>
        //{
        //    requestConfiguration.QueryParameters.Select = new string[] { "subject", "body", "bodyPreview", "organizer", "attendees", "start", "end", "location" };
        //});

        var result = await graphServiceClient.Users["dfasdfdfdsafklsaf-dfsdaf-sdfdf-d"].Messages.GetAsync();
        //var users = await graphServiceClient.Users.GetAsync();
        return Ok(result);
    }
    catch (Exception ex)
    {
        string msg = ex.Message;
        return Ok(msg);
    }
}

我是否在一般情况下或在代码中错误地使用了服务帐户?我知道要做的事情代表用户我会授权流和我使用的客户端凭据流,但当我看这些权限的描述,我设置(即calendar.readwrite:允许应用程序在没有登录用户的情况下创建、读取、更新和删除所有日历的事件。)这让我觉得我应该有权访问所有用户,即使是下面的用户。
我在想它可能是使用用户[""],我尝试了电子邮件地址,也从用户查询的ID,我能够拉原来,因为它给它和什么都没有。

gzszwxb4

gzszwxb41#

我同意@Nick.McDermaid,这不是授权问题。
我创建了一个Azure Web App并打开了Identity,如下所示:

现在,我为Enterprise应用程序分配了权限,如下所示:

通过Kudu生成访问令牌如下:

$resourceURI = "https://graph.microsoft.com"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token

通过解码令牌,检查访问令牌是否具有正确的权限

我尝试使用上述访问令牌成功检索用户:

https://graph.microsoft.com/v1.0/users/UserID

如果响应不是预期的格式,即响应必须是JSON格式,则通常会出现错误“Content type text/html does not have a factory registered to be parsed”。
错误可能由以下几个原因导致:

  • Web应用程序和Microsoft Graph API之间的代理服务器正在返回HTML响应。
  • 由于代码存在问题,Microsoft Graph API正在返回HTML响应。
  • 响应内容类型可能未设置为application/json
    要解决错误,请安装Fiddler并检查Web应用程序与Microsoft Graph API之间的HTTP流量。

您还可以使用 Sébastien LevertMicrosoft Graph Developer Proxy来检查Microsoft Graph请求的详细信息。

  • 使用生成的访问令牌和在Microsoft Graph API中检查请求是否有效。
  • 尝试使用newtonsoft.json库并检查。
    如果上述更改后问题仍然存在,请使用授权代码流进行检查。
    更新:

要解决此问题,请升级到业务包,将用户分配到许可证,然后进行设置。

参考:

Glen Scales的azure - Content type text/html does not have a factory registered to be parsed

相关问题