Во-первых, хотя использование ключей может быть удобным, я вижу, что официальная документация не рекомендует использовать ключи для защиты конечной точки функции в производственных сценариях.
Я полагаю, что было бы лучше выбрать Azure Active Directory для обеспечения безопасности ... как описано здесь Защищать конечную точку HTTP на производстве
Как реализовать
Я вижу два возможных подхода:
1. Простой подход: убедитесь, что вызывающее приложение - это ваше логическое приложение Azure, в частности
Включите аутентификацию Azure Active Directory для вашего функционального приложения Azure. Вы можете просто использовать настройки Express (с созданием нового приложения Azure AD)
Включение идентификатора управляемой службы для вашего приложения логики.
Найдите appid для идентификатора управляемой службы, связанного с вашим приложением логики. Перейдите на портал Azure> Azure Active Directory> Корпоративные приложения> Все приложения> Соответствующий принципал службы (более подробно объяснено со скриншотами в еще одна статья SO здесь )
Аутентификация приложения логики в функции Azure с использованием идентификатора управляемой службы, как описано здесь. Аутентификация с использованием управляемого идентификатора в приложении логики .. обратите внимание, что доступ к ресурсу будет вашей функцией Azure.
В коде вашей функции теперь вы можете проверить, что утверждение appid
в токене доступа должно точно соответствовать appid
для приложения логики (т. Е. Приложение логики - это приложение, вызывающее вашу функцию). В противном случае вы можете отклонить вызов с помощью Несанкционированное исключение.
2. Более декларативный подход: определите разрешение приложения для приложения-функции Azure и проверьте наличие этого разрешения / роли в маркере авторизации от клиента, вызывающего вашу функцию
Этот подход немного более декларативен, поскольку вы определяете разрешение приложения, которое должно быть назначено любому приложению, которое может вызывать вашу функцию Azure.
Включите аутентификацию Azure Active Directory для вашего функционального приложения Azure. Вы можете просто использовать настройки Express (с созданием нового приложения Azure AD)
Теперь перейдите в Azure Active Directory> Регистрация приложений> Регистрация приложения для вашего функционального приложения> Манифест
Добавить новую роль приложения .. используя json, вот так:
"appRoles": [
{
"allowedMemberTypes": [
"Application"
],
"displayName": "Can invoke my function",
"id": "fc803414-3c61-4ebc-a5e5-cd1675c14bbb",
"isEnabled": true,
"description": "Apps that have this role have the ability to invoke my Azure function",
"value": "MyFunctionValidClient"
}]
Включение идентификатора управляемой службы для вашего приложения логики.
Найдите appid для идентификатора управляемой службы, связанного с вашим приложением логики ... как уже объяснено в подходе 1 выше
Назначьте разрешение приложения для этого идентификатора управляемой службы.
New-AzureADServiceAppRoleAssignment -ObjectId <logicappmsi.ObjectId> -PrincipalId <logicappmsi.ObjectId> -Id "fc803414-3c61-4ebc-a5e5-cd1675c14bbb" -ResourceId <yourfunctionaadapp.ObjectId>
Аутентификация вашего логического приложения в функции Azure с использованием идентификатора управляемой службы ... как уже объяснено в подходе 1 выше
Теперь в токене авторизации, полученном вашей функцией, вы можете проверить, что коллекция утверждений role
должна содержать роль с именем "MyFunctionValidClient"
, в противном случае вы можете отклонить вызов с неавторизованным исключением.