Azure ad b2c 通过Azure AD B2C授权Azure功能事件网格触发器

Azure ad b2c 通过Azure AD B2C授权Azure功能事件网格触发器,azure-ad-b2c,azure-function-app,azure-eventgrid,Azure Ad B2c,Azure Function App,Azure Eventgrid,我的函数应用程序中有一个Azure事件网格触发器。该函数通过事件订阅订阅到事件网格主题。该功能工作正常,在功能应用程序的身份验证/授权刀片中未配置身份验证时触发。但是,当我从Blade集成B2C广告应用程序时,主题不会被传递,功能也不会被触发。此外,我可以在事件订阅中看到“未经授权”的错误。功能应用程序内的其他HTTP触发器需要B2C流。如何授予对事件网格的独占访问权,以便在没有B2C流的情况下传递此消息?您可以尝试以下方法: 启用事件网格以使用Azure广告应用程序: 使用下面的PowerSh

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

您可以尝试以下方法:

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

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

  • 修改PowerShell脚本的$mytenatid以使用Azure广告 租户ID

  • 修改PowerShell脚本的$myAzureADApplicationObjectId以使用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
    
    $mytenatid=“”
    连接AzureAD-TenantId$myTenantId
    $myAzureADApplicationObjectId=“”
    $eventGridAppId=“4962773b-9cdb-44cf-a8bf-237846a00ab7”
    $eventGridRoleName=“AzureEventGridSecureWebhook”
    函数CreateAppRole([string]$Name,[string]$Description)
    {
    $appRole=新对象Microsoft.Open.AzureAD.Model.appRole
    $appRole.AllowedMemberTypes=新对象System.Collections.Generic.List[字符串]
    $appRole.AllowedMemberTypes.Add(“应用程序”);
    $appRole.DisplayName=$Name
    $appRole.Id=新Guid
    $approvle.IsEnabled=$true
    $appRole.Description=$Description
    $appRole.Value=$Name;
    返回$appRole
    }
    $myApp=Get-AzureADApplication-ObjectId$MyAzureadApplication-ObjectId
    $myAppRoles=$myApp.AppRoles
    $eventGridSP=Get-AzureADServicePrincipal-Filter(“appId eq'+$eventGridAppId+”))
    写入主机“添加新角色之前的应用程序角色…”
    写入主机$myAppRoles
    if($myAppRoles-匹配$eventGridRoleName)
    {
    写入主机“Azure事件网格角色已定义。`n”
    }
    其他的
    {
    $myServicePrincipal=Get-AzureADServicePrincipal-Filter(“appId eq'+$myApp.appId+”))
    $newRole=CreateAppRole-名称$eventGridRoleName-说明“Azure事件网格角色”
    $myAppRoles.Add($newRole)
    设置AzureADApplication-ObjectId$myApp.ObjectId-AppRoles$myAppRoles
    }
    if($eventGridSP-匹配“Microsoft.EventGrid”)
    {
    写入主机“服务主体已定义。`n”
    }
    其他的
    {
    $eventGridSP=新AzureADServicePrincipal-AppId$eventGridAppId
    }
    新AzureADServiceAppRoleAssignment-Id$myApp.AppRoles[0].Id-ResourceId$myServicePrincipal.ObjectId-ObjectId$eventGridSP.ObjectId-PrincipalId$eventGridSP.ObjectId
    写入主机“My Azure AD租户Id:$myTenantId”
    写入主机“我的Azure广告应用程序Id:$($myApp.AppId)”
    写入主机“My Azure广告应用程序ObjectId:$($myApp.ObjectId)”
    写入主机“我的Azure广告应用程序的角色:”
    写入主机$myApp.AppRoles
    
  • 配置事件订阅:

    在事件订阅的创建流中,选择端点类型“Web挂钩”。一旦您给出了端点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字段中输入它

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

    因此我尝试了此方法,但最终无法创建事件订阅。我收到此错误:部署失败,出现以下错误:{“代码”:“Url验证”,“消息”:“https的Webhook验证握手失败://{function app Url}.azurewebsites.net/runtime/webhooks/EventGrid.Http POST请求失败,响应代码未知。有关疑难解答,请访问。活动id:fa614249-ee37-4847-a236-3cdea6cda70b,时间戳:8/18/2020 9:42:51 AM(UTC)。“}.$eventGridAppId=“4962773b-9cdb-44cf-a8bf-237846a00ab7”此Id是固定的还是应该从门户中的任何其他Id替换它?@LiqteqDeveloper,$eventGridAppId是“Azure事件网格”Azure Active Directory AppId。有关使用事件网格事件进行端点验证的详细信息,请参阅。有关处理webhooks事件网格事件验证的示例代码,请参阅。@Liqteq Developer您使用此解决方案使其工作了吗?我也有同样的问题。我在文档中找不到有关此限制的任何信息。