当前位置: 首页 > 知识库问答 >
问题:

通过Azure AD授权Azure函数事件网格触发器B2C

华星文
2023-03-14

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

共有1个答案

姜玉泽
2023-03-14

您可以尝试以下方法

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

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

>

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

    修改PowerShell脚本的$MyAzureAdapplicationObject以使用Azure AD应用程序的对象ID。

    运行修改后的脚本。

    $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
    

    配置事件订阅:

    在事件订阅的创作路径中,选择endpoint类型“Web Hook”。一旦您提供了endpointURI(事件网格endpoint的网络钩子uri-https://FUNCTION_DOMAIN/runtime/webhoks/eventgrid? FunctionName={FUNCTION_NAME}),单击创建事件订阅边栏选项卡顶部的附加功能选项卡。

    在“其他功能”选项卡中,选中“使用 AAD 身份验证”框,然后配置租户 ID 和应用程序 ID:

      < li >从脚本输出中复制Azure AD租户ID,并将其输入到AAD租户ID字段中。 < li >从脚本输出中复制Azure AD应用程序ID,并将其输入到AAD应用程序ID字段中。

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

  •  类似资料:
    • 我已经实现了一个EventGrid触发器来响应Blob存储事件,其逻辑简化如下: 外部API的响应时间不长(1秒或更短),我对主机的配置设置为默认(因此允许无限数量的并发调用)。 当同时添加多个blob(从只有2个blob开始)时,我在日志中得到了很多重复的事件(脚本正在快速地一个接一个地上传blob,中间没有等待时间)。 我觉得这可能是由于我从不承认收到事件,我不知道我是否应该在我的代码中执行此

    • 我的Azure Functions事件网格触发器没有触发。我是这么做的。 Key Vault设置为将事件报告给EventGrid系统主题 此主题由将事件传递到Azure Function的订阅订阅 函数有一个事件网格触发器(见下文,默认由门户创建): 我用谷歌搜索了一下,对于这样的入门级方案,没有更多的指导。我想的也许是授权...订阅如何触发该函数?在此过程中(通过GUI /门户配置),没有任何关

    • 我们有一个 Azure 设置,其中包含一个 Azure 事件网格主题,并且我们有一个 Azure 函数服务,其中包含大约 15 个函数,这些函数通过不同的前缀筛选器订阅该主题。Azure 函数服务设置为基于消耗的资源,应该能够根据需要进行缩放。 每个订阅都设置为在最多4小时内尝试交付10次,然后放弃活动。到目前为止一切顺利,设置大部分时间都按预期工作。 在某些情况下,对于我们未知的情况,事件网格主

    • 在Azure function中,你可以创建一个函数来监听某个事件的变化,比如消息总线、blob存储等等... 如果您正在使用azure功能,并且您的目标是通过侦听事件(如消息总线、blob存储或任何其他内置触发器)来处理某些事情,那么您有什么理由希望将事件网格放在中间层吗?即,您不希望azure函数直接侦听blob存储更改,而是希望azure函数侦听正在侦听blob存储器更改事件的事件网格。 谢

    • 我知道对于http触发函数,您可以设置context.res.status = 501,因此appInsight中的结果代码将更改为501。想知道如何为eventGrid触发的azure函数做同样的事情吗?我们想要一些自定义的结果代码,以便以后可以运行统计数据。

    • 我有一个由事件网格事件触发的Azure函数。仅当blob上载到存储帐户时,才会创建事件网格事件。 虽然由于某些原因,该函数仍然会被同一事件触发,即使它已成功处理,但它现在已部署并运行良好? 例子: 今天我查看了日志,该函数已继续执行! 错误:“Blob不存在” 代码片段: 编辑1:这仍在发生,这次有点不同。 现在,EventGrid在成功传递消息和函数运行后继续触发 我如何调试它?