Для справки я пытаюсь воспроизвести решение, о котором говорилось здесь: https://www.tech-findings.com/2020/02/securing-logic-app-with-azure-active-directory.html для использования API Управление для защиты приложения Azure Logic.
Я получаю ошибку JWT. Когда я посещаю URL-адрес приложения в браузере, он дает:
{ "statusCode": 404, "message": "Resource not found" }
В тесте службы управления API я получаю:
HTTP/1.1 401 Unauthorized
После трассировки через него видно:
validate-jwt (-0.111 ms)
{
"message": "JWT Validation Failed: JWT not present.."
}
Я немного погуглил и попробовал решения по адресу: Ошибка сбоя проверки JWT в azure apim и https://learn.microsoft.com/en-us/answers/questions/108008/azure-apim-jwt-token-validation-policy.html
Вот входящая политика из дизайна управления API:
<policies>
<inbound>
<base />
<set-method id = "apim-generated-policy">POST</set-method>
<rewrite-uri id = "apim-generated-policy" template = "/request/paths/invoke//?api-version=2016-06-01&sp=/triggers/request/run&sv=1.0&sig = {{[[LOGIC APP NAME]]_request-invoke_XXXXXXXXXXXXXXXXXXXXXXXX}}" />
<validate-jwt header-name = "Authorization" failed-validation-httpcode = "401" failed-validation-error-message = "Request is not authorized or token failed" require-expiration-time = "false" require-scheme = "Bearer" require-signed-tokens = "true">
<openid-config url = "https://login.windows.net/[[TENANT NAME]].onmicrosoft.com/.well-known/openid-configuration" />
<audiences>
<audience>[[THE ID OF A REGISTERED APP]]</audience>
</audiences>
</validate-jwt>
<set-header name = "Authorization" exists-action = "delete" />
<set-header name = "apim-generated-policy" exists-action = "delete" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
Это манифест зарегистрированного приложения:
{
"id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"acceptMappedClaims": null,
"accessTokenAcceptedVersion": 2,
"addIns": [],
"allowPublicClient": null,
"appId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"appRoles": [],
"oauth2AllowUrlPathMatching": false,
"createdDateTime": "2020-12-22T19:48:36Z",
"disabledByMicrosoftStatus": null,
"groupMembershipClaims": null,
"identifierUris": [
"api://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
],
"informationalUrls": {
"termsOfService": null,
"support": null,
"privacy": null,
"marketing": null
},
"keyCredentials": [],
"knownClientApplications": [],
"logoUrl": null,
"logoutUrl": null,
"name": "LabsTestApp",
"oauth2AllowIdTokenImplicitFlow": false,
"oauth2AllowImplicitFlow": false,
"oauth2Permissions": [],
"oauth2RequirePostResponse": false,
"optionalClaims": null,
"orgRestrictions": [],
"parentalControlSettings": {
"countriesBlockedForMinors": [],
"legalAgeGroupRule": "Allow"
},
"passwordCredentials": [],
"preAuthorizedApplications": [],
"publisherDomain": "[[TENANT NAME]].onmicrosoft.com",
"replyUrlsWithType": [],
"requiredResourceAccess": [],
"samlMetadataUrl": null,
"signInUrl": null,
"signInAudience": "AzureADandPersonalMicrosoftAccount",
"tags": [],
"tokenEncryptionKeyId": null
}
Надеюсь, вы можете помочь - направьте меня в правильном направлении.
Для этого вопроса в ваших шагах есть более одной проблемы.
1. Вы упомянули об ошибке { "statusCode": 404, "message": "Resource not found" }
при запросе URL в браузере. Причина в том, что когда вы запрашиваете его в браузере, он запрашивает метод Get
, но URL-адрес должен запрашиваться методом Post
. Так это показывает 404 not found
.
2. При тестировании в службе управления API отображается 401 Unauthorized
. Причиной этой ошибки является то, что вы не предоставили токен доступа или предоставленный вами токен доступа недействителен. Шаги в документе , который вы упомянули, являются неполными, пожалуйста, обратитесь к шагам ниже:
1). Сначала убедитесь, что вы выполнили все шаги, указанные в предоставленном вами документе.
2). Затем перейдите в приложение, которое вы зарегистрировали в azure ad, и щелкните вкладку «Манифест», добавьте appRole в json «Манифеста».
Вы можете указать имя (любое) для этой роли, я назвал роль как Writer
, как показано на скриншоте выше. И вы также можете указать «id» (в формате GUID) в качестве значения поля id
в appRole. Для получения более подробной информации о добавлении appRole вы можете обратиться к этому документу.
3). Вам необходимо зарегистрировать другое приложение в Azure Ad в качестве клиентского приложения. Выполните ту же операцию регистрации, что и ваш документ, чтобы зарегистрировать другое приложение, я зарегистрировал приложение и назвал его huryGetToken4
. Перейдите в это приложение и перейдите на вкладку «Разрешения API», нажмите «Добавить разрешение» и найдите исходное приложение, которое вы зарегистрировали, затем добавьте разрешение Writer
.
После добавления разрешения Writer
вам также нужно нажать «Предоставить согласие администратора для xxx».
Затем перейдите на вкладку «Сертификаты и секреты», нажмите «Новый секрет клиента», чтобы сгенерировать секрет клиента. Скопируйте этот секрет, потому что он будет показан только один раз.
4). Затем вам нужно получить токен доступа, пожалуйста, обратитесь к снимку экрана ниже, чтобы запросить токен доступа.
На скриншоте выше вам нужно заменить <tenant id>
идентификатором вашего арендатора в URL-адресе хоста. И вам также необходимо ввести первые три параметра. Последний параметр grant_type
является статическим.
5). Запросите токен доступа, вы получите ответ, как показано на скриншоте ниже.
Скопируйте значение access_token
и вставьте его на эту страницу, чтобы расшифровать токен, вы можете увидеть в нем претензию roles
с разрешением Writer
. Это требование — то, что вам нужно проверить в политике <validate-jwt>
в вашем APIM.
6). Зайдите в свой апим и нажмите на иконку pencil
политики validate-jwt
.
7). Отредактируйте «Пересмотренные претензии», как показано на скриншоте ниже:
8). После этого вы можете протестировать API в сервисе APIM. Добавьте заголовок с ключом: Authorization
, значение: Bearer <your access token>
(обратите внимание, что между Bearer
и токеном доступа есть пробел).
Вау, это подробно. Спасибо! Так вы говорите, что мне нужно 2 регистрации приложений в дополнение к службе управления API и приложению Logic? Или приложение hte logic считается одной из двух регистраций?
@GregViers Да, вам нужно зарегистрировать приложение в Azure AD. Один из них предназначен для серверной части, которую вы уже зарегистрировали, как упоминается в документе (в руководстве по документу вы регистрируете приложение с именем AudienceAppForADSecuredLogicApp
). А другое зарегистрировано как клиентское приложение в вашей Azure AD, о чем я упоминал в своем ответе (3). You need to register another app in azure ad as the client app.....
).
Итак, я сделал все это и успешно - я получаю другое сообщение об ошибке. Но это не имеет ничего общего с проверкой hte JWT. Спасибо за решение этой проблемы!
Здравствуйте, могу ли я узнать, решилась ли ваша проблема? Если все еще есть какие-либо проблемы, пожалуйста, дайте мне знать.