ARM/Bicep模板配置Azure Function认证时缺失指定密钥
解决Azure Function通过Bicep/CLI配置AAD认证时缺少MICROSOFT_PROVIDER_AUTHENTICATION_SECRET的问题
问题原因
Azure门户配置AAD认证时,会自动完成全流程操作:创建对应AAD应用注册、生成客户端密钥、将密钥值存入Function App的应用设置MICROSOFT_PROVIDER_AUTHENTICATION_SECRET。但使用Bicep或az webapp auth microsoft update命令时,仅完成了认证规则的配置,并未自动生成或注入客户端密钥值,因此会缺失这个关键的应用设置项。
解决方案
方案1:手动注入已有AAD应用的客户端密钥
如果你已经有现成的AAD应用注册和客户端密钥,直接在Bicep中添加应用设置即可:
修改Function App资源的siteConfig部分,添加appSettings数组(已有则追加):
resource site1 'Microsoft.Web/sites@2022-03-01' = { name: function1name kind: 'functionapp,linux' location: region identity:{ type: 'SystemAssigned' } properties: { // 其他属性保持不变 siteConfig: { numberOfWorkers:1 linuxFxVersion:'Python|3.9' acrUseManagedIdentityCreds: false alwaysOn: false http20Enabled: false functionAppScaleLimit: 200 minimumElasticInstanceCount: 0 // 添加应用设置 appSettings: [ { name: 'MICROSOFT_PROVIDER_AUTHENTICATION_SECRET' // 生产环境不推荐硬编码,建议用下方Key Vault引用方式 // value: '<你的AAD应用客户端密钥>' value: '@Microsoft.KeyVault(SecretUri=https://your-kv.vault.azure.net/secrets/your-secret-name)' } ] } serverFarmId: srv } }
注:使用Key Vault引用时,需确保Function App的系统身份拥有访问对应密钥的权限。
方案2:自动创建AAD应用并生成密钥
如果希望完全自动化(模拟门户行为),可以用Bicep创建AAD应用注册和密钥,再自动注入到应用设置:
param function1name string = 'testfunctionnum1' param region string param srv string = 'xxxxx' // 1. 创建AAD应用注册 resource aadApp 'Microsoft.Authorization/applications@2021-04-01' = { name: '${function1name}-aad-app' properties: { displayName: '${function1name}-aad-app' web: { redirectUris: [ 'https://${site1.defaultHostName}/.auth/login/aad/callback' ] } } } // 2. 生成AAD应用客户端密钥(有效期1年) resource aadAppSecret 'Microsoft.Authorization/applications/passwordCredentials@2021-04-01' = { parent: aadApp name: 'auth-secret' properties: { startDateTime: utcNow() endDateTime: utcNow('yyyy-MM-dd') addYears 1 } } // 3. 创建Function App并注入密钥 resource site1 'Microsoft.Web/sites@2022-03-01' = { name: function1name kind: 'functionapp,linux' location: region identity:{ type: 'SystemAssigned' } properties: { scmSiteAlsoStopped: false clientAffinityEnabled: false clientCertEnabled: false clientCertMode: 'Required' hostNamesDisabled: false containerSize: 1536 dailyMemoryTimeQuota: 0 httpsOnly: true redundancyMode: 'None' storageAccountRequired: false keyVaultReferenceIdentity: 'SystemAssigned' siteConfig: { numberOfWorkers:1 linuxFxVersion:'Python|3.9' acrUseManagedIdentityCreds: false alwaysOn: false http20Enabled: false functionAppScaleLimit: 200 minimumElasticInstanceCount: 0 appSettings: [ { name: 'MICROSOFT_PROVIDER_AUTHENTICATION_SECRET' value: aadAppSecret.value } ] } serverFarmId: srv } } // 4. 配置认证设置,使用自动创建的AAD应用ID resource fn1auth 'Microsoft.Web/sites/config@2022-03-01' = { parent: site1 name: 'authsettingsV2' properties:{ platform: { enabled: true } globalValidation: { requireAuthentication: true unauthenticatedClientAction: 'Return401' } identityProviders:{ azureActiveDirectory:{ enabled: true registration:{ clientId: aadApp.properties.appId clientSecretSettingName: 'MICROSOFT_PROVIDER_AUTHENTICATION_SECRET' openIdIssuer: 'https://sts.windows.net/${subscription().tenantId}/v2.0' } } } login:{ tokenStore:{ enabled:true } } } }
注:部署此模板的账号需具备创建AAD应用的权限。
方案3:使用CLI补充密钥
如果已经通过CLI配置了认证,只需再执行以下命令添加应用设置:
az webapp config appsettings set --name <你的Function App名称> --resource-group <资源组名称> --settings MICROSOFT_PROVIDER_AUTHENTICATION_SECRET=<你的AAD客户端密钥>
注意事项
- 生产环境禁止硬编码密钥,必须使用Key Vault存储并通过应用设置引用。
- 密钥过期后需重新生成,并更新应用设置或Key Vault中的密钥。
内容的提问来源于stack exchange,提问作者El-Shorbagy Amr
相关产品推荐
相关产品推荐

