请求协助修复Azure Function:实现用户ID多租户访问权限校验
完整修复后的Azure Function PowerShell代码
using namespace System.Net # 输入绑定通过param块传入 param($Request, $TriggerMetadata) # 初始化结果集合 $tenantAccessResults = @() # 从请求体提取核心参数 $userEmail = $Request.Body.UserEmail $userId = $Request.Body.UserId $targetTenants = $Request.Body.Tenants # 校验输入参数合法性 if (-not $userEmail -or -not $userId -or (-not $targetTenants -or $targetTenants.Count -ne 5)) { Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::BadRequest Body = @{ Error = "参数不完整:必须提供UserEmail、UserId,以及包含5个租户ID的Tenants数组" } }) return } # 遍历每个租户执行权限校验 foreach ($tenantId in $targetTenants) { $resultItem = @{ TenantId = $tenantId HasAccess = $false StatusMsg = "" } try { # 调用Microsoft Graph API校验用户在租户中的存在性(基础访问权限判定依据) # 依赖:Function已配置托管身份,并获得Directory.Read.All应用权限的管理员同意 $graphEndpoint = "https://graph.microsoft.com/v1.0/users/$userId" $authHeader = @{ "Authorization" = "Bearer $env:IDENTITY_HEADER" } # 针对目标租户发起Graph请求 $response = Invoke-RestMethod -Uri $graphEndpoint -Headers $authHeader -Method Get -ErrorAction Stop # 请求成功则判定用户拥有该租户访问权限 $resultItem.HasAccess = $true $resultItem.StatusMsg = "用户在该租户中存在,拥有基础访问权限" } catch { # 按错误类型返回精准提示 switch ($_.Exception.Response.StatusCode) { [HttpStatusCode]::NotFound { $resultItem.StatusMsg = "用户未在该租户中注册" } [HttpStatusCode]::Forbidden { $resultItem.StatusMsg = "Function托管身份无权限访问该租户的Graph数据" } default { $resultItem.StatusMsg = "校验失败:$($_.Exception.Message)" } } } $tenantAccessResults += $resultItem } # 返回结构化响应结果 Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{ StatusCode = [HttpStatusCode]::OK Body = @{ UserProfile = @{ Email = $userEmail Id = $userId } TenantCheckResults = $tenantAccessResults } })
关键配置与修复说明
- 输入校验逻辑:新增参数完整性检查,提前拦截非法请求,避免后续逻辑崩溃
- 跨租户权限校验:采用Microsoft Graph API替代传统Azure AD模块,适配无服务器环境的依赖轻量化需求
- 错误分类处理:针对用户不存在、权限不足、请求异常等场景返回明确提示,便于问题定位
- 结构化响应:返回包含用户信息与租户校验结果的JSON结构,符合API交互的规范要求
部署前必备配置
- 托管身份启用:为Azure Function开启系统分配托管身份,或关联用户分配托管身份
- Graph权限授权:在Azure AD中为该托管身份授予
Directory.Read.All应用权限,并完成管理员同意 - 环境变量确认:确保Function应用设置中自动注入的
IDENTITY_HEADER环境变量可用
测试请求示例
发送POST请求至Function触发URL,请求体格式如下:
{ "UserEmail": "john.doe@contoso.com", "UserId": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv", "Tenants": [ "tenant-id-1", "tenant-id-2", "tenant-id-3", "tenant-id-4", "tenant-id-5" ] }
内容的提问来源于stack exchange,提问作者NERDO-leee
相关产品推荐
相关产品推荐

