c# - 用于创建团队的 Microsoft Graph Beta 调用返回错误请求

标签 c# microsoft-graph-api microsoft-teams

在我们的代码中,我们使用 Microsoft Graph Beta 调用 (https://graph.microsoft.com/beta) 创建了一个 Microsoft 团队。其他调用是通过 Microsoft Graph ( https://graph.microsoft.com/ ) 完成的。我们正在使用 Microsoft Graph v1.14.0 NuGet 包。

直到 2019 年 5 月 30 日,它都运行良好。之后它停止工作并返回以下错误:

Type: Microsoft.Graph.ServiceException
Bericht: Code: BadRequest
Message: Write requests (excluding DELETE) must contain the Content-Type header declaration.

5 月 30 日和 5 月 31 日没有人在工作,所以我们这边没有任何变化。

我们的电话:

var createdTeam = await graphApiServiceClient
  .Teams
  .Request()
  .AddAsync(team);

变量“团队”包含一个对象,该对象生成以下 JSON:

{
    "template@odata.bind": "https://graph.microsoft.com/beta/teamsTemplates('standard')",
    "owners@odata.bind": ["https://graph.microsoft.com/beta/users('a guid')"],
    "displayName": "Test displayname",
    "description": "Test Description",
    "visibility": "Private"
}

我们已经登录到 Graph Explorer,从 cookie 中获取访问 token 并在我们自己的代码中使用它。这促成了一次成功的通话,并创建了团队。

这有点奇怪,因为如果我们的原始访问 token 是错误的,我们将无法执行我们正在执行的其他成功调用(例如;创建安全组)。

我们比较了 Graph 浏览器用户与我们在代码中使用的用户的权限。我们没有发现任何区别。两者都具有 Group.ReadWrite.All 权限。

有时我们会在使用相同数据的同一调用中收到另一个错误:

更新:升级到 Microsoft Graph v1.50.0 和 Microsoft Graph Core v1.16.0 后,我们收到以下错误

Type: Microsoft.Graph.ServiceException
Bericht: Code: UnauthorizedAccess
Message: Failed to execute Templates backend request CreateTeamFromTemplateRequest. 
Request Url: https://teams.microsoft.com/fabric/templates/api/team, 
Request Method: POST, Response Status Code: Unauthorized, Response Headers: Strict-Transport-Security: max-age=2592000
X-MSEdge-Ref: Ref A: 266D45253C1B41809D27E6B7815E094E Ref B: DB3EDGE1119 Ref C: 2019-06-05T09:25:18Z
Date: Wed, 05 Jun 2019 09:25:18 GMT, 
ErrorMessage : {
   "errors":[{
     "message":"AccessToken token is not valid."
    }],
    "operationId":"2d511c3df28add419e9aa37926ccb962"
}

附加信息:

我们正在使用 App 上下文。

我们获取访问 token 的代码:

var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext($"https://login.microsoftonline.com/{this.domain}");
var credential = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(ClientID, ClientSecret);
var authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credential);

accessToken = authResult.AccessToken;

失败的请求( token 现在已过期):

Method: POST,
RequestUri: 'https://graph.microsoft.com/beta/teams',
Version: 1.1,
Content: System.Net.Http.StringContent,
Headers:
{
  SdkVersion: Graph-dotnet-1.14.0
  FeatureFlag: None
  FeatureFlag: RedirectHandler, RetryHandler, AuthHandler, DefaultHttpProvider
  Cache-Control: no-store, no-cache
  Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFEQ29NcGpKWHJ4VHE5Vkc5dGUtN0ZYblRaYWluNkdtNWhnRnRrWEh0RlRydFhtRUM2bUZJZFI0X00wMkRoMFg5QzVIaFU0ZHhyRFE2cU1rMGVFOEFVbWtqZnZaMjFlZFZKR1NXYUY5bGdsRFNBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiQ3RmUUM4TGUtOE5zQzdvQzJ6UWtacGNyZk9jIiwia2lkIjoiQ3RmUUM4TGUtOE5zQzdvQzJ6UWtacGNyZk9jIn0.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20vIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvM2QxY2M5YWQtZjBkNC00MTZkLTkyZGMtOTRjZGFjYzdkNTUwLyIsImlhdCI6MTU2MTYyMTMwNiwibmJmIjoxNTYxNjIxMzA2LCJleHAiOjE1NjE2MjUyMDYsImFpbyI6IjQyWmdZRmgzTmJmT3JweE56V2wzdmtMc2IxMWJBQT09IiwiYXBwX2Rpc3BsYXluYW1lIjoiREVWX01PTy1wcm92aXNpb25pbmciLCJhcHBpZCI6IjkwNmUwNjJkLTIwNWItNGM3Yi05NmM3LWQ4ZTI4YjZlMTAyNyIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzNkMWNjOWFkLWYwZDQtNDE2ZC05MmRjLTk0Y2RhY2M3ZDU1MC8iLCJvaWQiOiIzMjQyODFjYi01ODVmLTQ5ODItODE4NC00ZTdlOGNmYTllMTQiLCJyb2xlcyI6WyJVc2VyLlJlYWRXcml0ZS5BbGwiLCJHcm91cC5SZWFkV3JpdGUuQWxsIiwiVXNlci5SZWFkLkFsbCIsIk1haWxib3hTZXR0aW5ncy5SZWFkV3JpdGUiXSwic3ViIjoiMzI0MjgxY2ItNTg1Zi00OTgyLTgxODQtNGU3ZThjZmE5ZTE0IiwidGlkIjoiM2QxY2M5YWQtZjBkNC00MTZkLTkyZGMtOTRjZGFjYzdkNTUwIiwidXRpIjoiREVyR082OTE0a1doazh0YjI4OUNBQSIsInZlciI6IjEuMCIsInhtc190Y2R0IjoxMzQzODA0NzExfQ.DXO3VpCj5GyULTxiCvdyV5Fv33D5QER4CQDkhfxi-0t8MGXJ7reositSt2-oNqxRwQ3iI0_R-kXsldaPtf7mR0aP2HgJeWQoy_MiTKtLU8RwW9hkgJEohjeeWku9edOn_fsLj8V1Yw4eLeXroqPLEmIWQ4ks8mG9Q1T3Q-9mixhjI7b4by7wIJgFe6DvmI7Yo9KYg4HygCPJ-FQJH8yeDGQWbyuy0pskNmj88b77k3fL_3-c-OAL74dOZ-FCcTkIq63bvg8NxKSgRWb5OMu7JK6cjfKUhPFWLTk2l8Aqq8UYXqoSQynX2ZvaJsBmARb6vLIeflwLPC4yr73afj6NtA
  Content-Type: application/json
  Content-Length: 305
}

正文:

{
    "template@odata.bind": "https://graph.microsoft.com/beta/teamsTemplates('standard')",
    "owners@odata.bind": ["https://graph.microsoft.com/beta/users('a guid')"],
    "displayName": "Test displayname",
    "description": "Test Description",
    "visibility": "Private"
}

响应是 Microsoft.Graph.ServiceException:

{
    Code: BadRequest
    Message: Write requests (excluding DELETE) must contain the Content-Type header declaration.
    Inner error
}

响应头:

{
    Transfer-Encoding: chunked
    request-id: 1daa5989-7fbe-44c1-89f8-908c3adb740b
    client-request-id: 1daa5989-7fbe-44c1-89f8-908c3adb740b
    x-ms-ags-diagnostic: {"ServerInfo":{"DataCenter":"West Europe","Slice":"SliceC","Ring":"5","ScaleUnit":"003","RoleInstance":"AGSFE_IN_44","ADSiteName":"WEU"}}
    Duration: 5.254
    Strict-Transport-Security: max-age=31536000
    Cache-Control: private
    Date: Thu, 27 Jun 2019 07:56:27 GMT
}

堆栈跟踪:

   at Microsoft.Graph.HttpProvider.<SendAsync>d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Graph.BaseRequest.<SendRequestAsync>d__34.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Graph.BaseRequest.<SendAsync>d__30`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at MOO.Apps.Office365.Backend.Repository.Office365.TeamO365Repository.<CreateAsync>d__2.MoveNext()

一些额外的信息:

如果我们使用我们的 clientId 和 clientSecret 在 Postman 中执行以下调用,我们将获得一个工作 token (我们在代码中使用了返回的 token )。

Content-Type application/x-www-form-urlencoded
POST https://login.microsoftonline.com/domain/oauth2/v2.0/token
BODY client_id=clientidguid&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=clientsecret&grant_type=client_credentials

最佳答案

您能否尝试在 authContext.AcquireTokenAsync() 中传递“https://graph.microsoft.com”而不是“https://graph.microsoft.com/”?

var authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com", credential);

我们正在努力解决问题,但同时请尝试此解决方法,如果您仍然遇到同样的问题,请告诉我们。

关于c# - 用于创建团队的 Microsoft Graph Beta 调用返回错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56479989/

相关文章:

azure - 使用 API 在 OneDrive 上创建文件夹

python - 如何使用 Microsoft Graph 覆盖上传到 SharePoint 的文件

microsoft-graph-api - Microsoft Graph API 下载文件内容返回未授权 401

c# - 如何通过 Bot Framework 向 Teams 中的用户发送通知?

azure - QnA Maker 在 MS Teams 中部署时不显示按钮

c# - EFv1 一对多映射与 POCO 的关系

c# - 在C#中使用基本身份验证调用WEB API

C# : how to - single instance application that accepts new parameters?

c# - 将 Enumerable.ToDictionary 与扩展方法一起使用时为 "CLR detected an Invalid Program"

python - 如何使用传入的 webhook API 在 MS 团队中创建公告