【问题标题】:Authorize Azure Function Event Grid Trigger through Azure AD B2C通过 Azure AD B2C 授权 Azure 函数事件网格触发器
【发布时间】:2020-12-08 19:43:41
【问题描述】:

我的函数应用程序中有一个 Azure 事件网格触发器。该函数通过事件订阅订阅事件网格主题。该功能完美运行,当我在功能应用程序的身份验证/授权刀片内未配置身份验证时触发该功能。但是当我从 Blade 中集成 B2C AD App 时,没有传递主题,也没有触发功能。此外,我可以在事件订阅中看到“未经授权”错误。 Function App 内的其他 HTTP 触发器需要 B2C 流。如何授予对事件网格的独占访问权限,以便在没有 B2C 流的情况下传递此消息?

【问题讨论】:

  • 我也有同样的问题。我在文档中找不到有关此限制的任何信息。

标签: azure-ad-b2c azure-function-app azure-eventgrid


【解决方案1】:

您可以尝试以下方法:

启用事件网格以使用您的 Azure AD 应用程序:

使用下面的 PowerShell 脚本在您的 Azure AD 应用程序中创建角色和服务主体。您将需要 Azure AD 应用程序中的租户 ID 和对象 ID:

  1. 修改 PowerShell 脚本的 $myTenantId 以使用您的 Azure AD 租户 ID。

  2. 修改 PowerShell 脚本的 $myAzureADApplicationObjectId 以使用您的 Azure AD 应用程序的对象 ID。

  3. 运行修改后的脚本。

    $myTenantId = "<the Tenant Id of your Azure AD Application>"
    
    Connect-AzureAD -TenantId $myTenantId
    
    $myAzureADApplicationObjectId = "<the Object Id of your Azure AD Application>"
    
    $eventGridAppId = "4962773b-9cdb-44cf-a8bf-237846a00ab7"
    
    $eventGridRoleName = "AzureEventGridSecureWebhook"
    
    Function CreateAppRole([string] $Name, [string] $Description)
    {
        $appRole = New-Object Microsoft.Open.AzureAD.Model.AppRole
        $appRole.AllowedMemberTypes = New-Object System.Collections.Generic.List[string]
        $appRole.AllowedMemberTypes.Add("Application");
        $appRole.DisplayName = $Name
        $appRole.Id = New-Guid
        $appRole.IsEnabled = $true
        $appRole.Description = $Description
        $appRole.Value = $Name;
        return $appRole
    }
    
    $myApp = Get-AzureADApplication -ObjectId $myAzureADApplicationObjectId
    $myAppRoles = $myApp.AppRoles
    $eventGridSP = Get-AzureADServicePrincipal -Filter ("appId eq '" + $eventGridAppId + "'")
    
    Write-Host "App Roles before addition of new role.."
    Write-Host $myAppRoles
    
    if ($myAppRoles -match $eventGridRoleName)
    {
        Write-Host "The Azure Event Grid role is already defined.`n"
    }
    else
    {
        $myServicePrincipal = Get-AzureADServicePrincipal -Filter ("appId eq '" + $myApp.AppId + "'")
    
        $newRole = CreateAppRole -Name $eventGridRoleName -Description "Azure Event Grid Role"
        $myAppRoles.Add($newRole)
        Set-AzureADApplication -ObjectId $myApp.ObjectId -AppRoles $myAppRoles
    }
    
    if ($eventGridSP -match "Microsoft.EventGrid")
    {
        Write-Host "The Service principal is already defined.`n"
    }
    else
    {
        $eventGridSP = New-AzureADServicePrincipal -AppId $eventGridAppId
    }
    
    New-AzureADServiceAppRoleAssignment -Id $myApp.AppRoles[0].Id -ResourceId         $myServicePrincipal.ObjectId -ObjectId $eventGridSP.ObjectId -PrincipalId $eventGridSP.ObjectId
    
    Write-Host "My Azure AD Tenant Id: $myTenantId"
    Write-Host "My Azure AD Application Id: $($myApp.AppId)"
    Write-Host "My Azure AD Application ObjectId: $($myApp.ObjectId)"
    Write-Host "My Azure AD Application's Roles: "
    Write-Host $myApp.AppRoles
    

配置事件订阅:

在事件订阅的创建流程中,选择端点类型“Web Hook”。提供端点 URI(事件网格端点的 webhook uri - https://FUNCTION_DOMAIN/runtime/webhooks/eventgrid?functionName={FUNCTION_NAME})后,单击创建事件订阅刀片顶部的附加功能选项卡.

在附加功能选项卡中,选中“使用 AAD 身份验证”复选框并配置租户 ID 和应用程序 ID:

  • 从脚本的输出中复制 Azure AD 租户 ID 并输入 在 AAD 租户 ID 字段中。
  • 从脚本的输出中复制 Azure AD 应用程序 ID,然后 在 AAD 应用程序 ID 字段中输入它。

编辑:

有关此解决方案的更多详细信息,请访问here

【讨论】:

  • 所以我尝试了这个,但我最终无法创建事件订阅。我收到此错误:部署失败,出现以下错误:{"code":"Url validation","message":"Webhook validation handshake failed for https://{function-app-url}.azurewebsites.net/runtime /webhooks/EventGrid. Http POST 请求失败,响应代码未知。有关故障排除,请访问 aka.ms/esvalidation。活动 id:fa614249-ee37-4847-a236-3cdea6cda70b,时间戳:2020 年 8 月 18 日上午 9:42:51(UTC )."}.
  • $eventGridAppId = "4962773b-9cdb-44cf-a8bf-237846a00ab7" 这个 ID 是固定的还是应该用门户中的任何其他 ID 替换它?
  • @LiqteqDeveloper,$eventGridAppId 是“Azure 事件网格”Azure Active Directory AppId。
  • 请参阅docs.microsoft.com/en-us/azure/event-grid/…,了解有关使用事件网格事件进行端点验证的详细信息。您可以参考github.com/Azure-Samples/… 获取处理 webhook 的 Event Grid 事件验证的示例代码。
  • @Liqteq Developer 您是否使用此解决方案让它工作?
猜你喜欢
  • 2017-04-20
  • 2021-11-02
  • 2017-01-04
  • 2016-06-29
  • 2020-04-10
  • 2020-04-21
  • 2019-12-10
  • 2018-05-15
  • 2021-01-04
相关资源
最近更新 更多