Обновите ключи или секреты приложения Azure AD с помощью Microsoft Graph API - ошибка BadRequest - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь исправить данные пароля для приложения, использующего бета-версию Microsoft Graph API для типа ресурса приложения.

https://graph.microsoft.com/beta/applications/{applicationId}

Переменная содержимого представляет собой JSON-сериализованное представление чего-то вроде этого:

[{
"customKeyIdentifier":null,
"endDateTime":"2019-11-19T23:16:24.2602448Z",
"keyId":"47fde652-8b60-4384-b630-8e5f8f6e24b1",
"startDateTime":"2018-11-19T23:16:24.2602448Z",
"secretText":"SomeGeneratedPassword",
"hint":null
}]

Телефонный код:

using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://graph.microsoft.com");
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authHeaderValue.Result.AccessToken);
                client.DefaultRequestHeaders
                    .Accept
                    .Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var method = new HttpMethod("PATCH");
                var requestUri = $"https://graph.microsoft.com/beta/applications/{applicationId}";
                var content = GeneratePasswordCredentials(passwordHint);
                var request = new HttpRequestMessage(method, requestUri)
                {
                    Content = new StringContent(
                        content,
                        System.Text.Encoding.UTF8,
                        "application/json")
                };
                request.Headers
                    .Accept
                    .Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var resultApi = await client.SendAsync(request);
                response = await resultApi.Content.ReadAsStringAsync();
            }

Кажется, что Auth работает нормально, но ответ таков: для краткости внутренняя ошибка удалена:

{
  "error": {
    "code": "BadRequest",
    "message": "Empty Payload. JSON content expected.",
  }
}

Что не так с приведенным выше кодом?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Формат содержимого тела должен быть

{
  "passwordCredentials":
    [
      {"customKeyIdentifier":"YWJjZA==",
      "startDateTime":"2018-11-20T02:37:07.3963006Z",
      "endDateTime":"2019-11-20T02:37:07.3963006Z",
      "secretText":"The passwords must be 16-64 characters in length",
      "keyId":"aeda515d-dc58-4ce6-a452-3bc3d84f58a3",
      "hint":"xxx"}
    ]
}

Следующий демонстрационный код для генерации содержимого тела PasswordCredentials

public static string GeneratePasswordCredentials(string passwordHint)
   {
         var passwordCredential = new JObject
         {
                new JProperty("customKeyIdentifier",Encoding.UTF8.GetBytes(passwordHint)),
                new JProperty("startDateTime",DateTime.UtcNow),
                new JProperty("endDateTime", DateTime.UtcNow.AddYears(1)),
                new JProperty("secretText", "The passwords must be 16-64 characters in length"),
                new JProperty("keyId", Guid.NewGuid().ToString()),
                new JProperty("hint", passwordHint)
         };
         JArray jArray = new JArray
         {
              passwordCredential
         };
         var jsonObject = new JObject
         {
              new JProperty("passwordCredentials",jArray)
         };

         var json = JsonConvert.SerializeObject(jsonObject);
         return json;
     }

Примечание : URL-адрес запроса должен быть $"https://graph.microsoft.com/beta/applications/{ApplicationObjectId}"

0 голосов
/ 20 ноября 2018

Проблема связана со строкой JSON, указанной для приложения Microsoft Graph API для обновления. Отсутствует свойство, которое вы пытаетесь обновить для приложения. Я добавил свойство «passwordCredentials» и дал ему JSON как коллекцию. См. Переменную jsonContent в самом начале моего кода.

/*Only change here from original JSON is to add the passwordCredentials node*/

{
  "passwordCredentials":[
    {
      "customKeyIdentifier": null,
      "endDateTime": "2019-11-19T23:16:24.2602448Z",
      "keyId": "47fde652-8b60-4384-b630-8e5f8f6e24b1",
      "startDateTime": "2018-11-19T23:16:24.2602448Z",
      "secretText": "SomeGeneratedPassword",
      "hint": null
    }
  ]
}

Я начал с вашего кода, и для меня также была воспроизведена ошибка 400 неверных ответов.

Ниже приведен окончательный рабочий код, и теперь я возвращаю 204 статуса ответа. Я также вижу новый ключ, добавленный в коллекцию ключей приложений, из портала Azure> Регистрация приложений> Мое приложение> Настройки> Ключи

string jsonContent = "{\"passwordCredentials\":[{\"customKeyIdentifier\":null,\"endDateTime\":\"2019-11-19T23:16:24.2602448Z\",\"keyId\":\"47fde652-8b60-4384-b630-8e5f8f6e24b1\",\"startDateTime\":\"2018-11-19T23:16:24.2602448Z\",\"secretText\":\"somegeneratedpassword\",\"hint\":null}]}";

using (HttpClient client = new HttpClient())
{
    client.BaseAddress = new Uri("https://graph.microsoft.com");
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authHeaderValue.Result.AccessToken);

    client.DefaultRequestHeaders
                    .Accept
                    .Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var method = new HttpMethod("PATCH");
    var requestUri = $"https://graph.microsoft.com/beta/applications/{applicationId}";

    // I have commented out this method and passed in my JSON instead.   
    //var content = GeneratePasswordCredentials(passwordHint);
    var content = jsonContent;
    var request = new HttpRequestMessage(method, requestUri)
    {
                    Content = new StringContent(
                        content,
                        System.Text.Encoding.UTF8,
                        "application/json")
    };

    request.Headers
                    .Accept
                    .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    var resultApi = client.SendAsync(request).GetAwaiter().GetResult();

    //response = await resultApi.Content.ReadAsStringAsync();
        var response = resultApi.Content.ReadAsStringAsync().GetAwaiter().GetResult();
}
...