gpt4 book ai didi

c# - 将 Azure MS Graph API 服务帐户与托管标识结合使用

转载 作者:行者123 更新时间:2023-12-03 05:11:30 26 4
gpt4 key购买 nike

我已经通过应用程序注册和 Web API 的关联托管标识设置了 Azure 门户。尽管看起来令人困惑,但我能够部署我的应用程序,并且测试了一个基本命令来提取我的 azure 租户中的用户列表,如下所示,并带有注释掉的代码。我正在使用服务帐户执行所有操作,但我想提取特定用户的日历并查看他们的数据,结果返回时出现以下错误:

"Content type text/html does not have a factory registered to beparsed"

然后我尝试使用它来提取用户的电子邮件,并在尝试返回结果时遇到相同的错误。我在企业应用中的权限如下:

enter image description here

我的代码如下:

[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 :允许应用程序创建、读取、更新和删除没有登录用户的所有日历的事件。)这让我觉得我应该有权访问所有用户,甚至是下面的用户。

我认为它可能使用 Users[""] ,我尝试了电子邮件地址以及我最初能够提取的用户查询中的 id,因为它没有给出任何内容。

最佳答案

I agree with @Nick.McDermaid, it is not an authorization issue.

我创建了一个 Azure Web 应用程序并打开了身份,如下所示:

enter image description here

现在,我向企业应用程序分配了权限,如下所示:

enter image description here

通过 Kudu 生成访问 token ,如下所示:

$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

enter image description here

通过解码 token 来检查访问 token 是否具有适当的权限:

enter image description here

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

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

enter image description here

如果响应不是预期的响应格式,通常会出现错误“内容类型 text/html 没有注册要解析的工厂”必须是 JSON 格式。

出现该错误的原因可能有多种,例如:

  • 网络应用和 Microsoft Graph API 之间的代理服务器正在返回 HTML 响应。
  • 由于代码问题,Microsoft Graph API 返回 HTML 响应。
  • 响应内容类型可能未设置为 application/json

要解决该错误,请安装 Fiddler 并检查 Web 应用程序与 Microsoft Graph API 之间的 HTTP 流量。

您还可以使用Microsoft Graph Developer ProxySébastien Levert 检查 Microsoft Graph 请求详细信息。

  • 使用生成的访问 token 并在 Microsoft Graph API 中检查请求是否有效。
  • 尝试使用 newtonsoft.json 库并检查。

如果上述更改后问题仍然存在,则使用授权代码流程进行检查。

更新:

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

引用:

azure - Content type text/html does not have a factory registered to be parsed作者:格伦·斯凯尔斯。

关于c# - 将 Azure MS Graph API 服务帐户与托管标识结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76511237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com