Azure Function配置Entra认证后,用户令牌访问Blob Storage失败求助
解决方案
1. 调整Azure Function的Entra认证配置,指定正确令牌范围
你的Function使用v2版本认证,无法通过additionalLoginParams配置,需通过以下方式修正令牌受众:
- 在Function的Entra认证设置中,添加
https://storage.azure.com至允许的令牌受众列表 - 调整用户登录的授权请求,显式指定Storage的权限范围:
此处https://login.microsoftonline.com/<租户ID>/oauth2/v2.0/authorize? client_id=<你的Function应用客户端ID> &response_type=id_token+token &redirect_uri=<Function的回调URI> &scope=openid https://storage.azure.com/user_impersonation &response_mode=fragmenthttps://storage.azure.com/user_impersonation是Storage的用户模拟权限,确保生成的令牌aud字段指向https://storage.azure.com。
2. 在Function中获取有效Storage令牌
方式一:使用On-Behalf-Of(OBO)流程转换令牌
利用用户已完成的认证,通过OBO流程向Entra ID请求针对Storage的令牌:
using Microsoft.Identity.Client; var tokenAcquisition = new TokenAcquisition(); var storageToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync( new[] { "https://storage.azure.com/user_impersonation" }, req.Headers["Authorization"].ToString().Replace("Bearer ", "") ); // 使用storageToken调用Storage API
需提前在应用注册中为Storage的user_impersonation权限授予管理员同意。
方式二:直接修改Function认证流程获取目标令牌
在Function的Entra认证高级设置中,添加登录参数(支持v2版本):
"loginParameters": ["scope=https://storage.azure.com/user_impersonation openid profile"]
用户登录后,x-ms-token-aad-access-token返回的令牌aud将自动指向https://storage.azure.com。
3. 验证令牌有效性
通过JWT.IO解码令牌,确认两个关键字段:
aud值为https://storage.azure.comscp字段包含user_impersonation
符合要求的令牌可被Storage API正常验证。
4. 浏览器直接查看Blob的实现方案
Function获取有效Storage令牌后,可通过前端请求展示图片:
fetch('https://<存储账户名>.blob.core.windows.net/<容器名>/<Blob路径>', { headers: { 'Authorization': 'Bearer ' + storageAccessToken } }).then(response => response.blob()) .then(blob => { const imgUrl = URL.createObjectURL(blob); document.getElementById('image-container').src = imgUrl; });
内容的提问来源于stack exchange,提问作者Duncan King
相关产品推荐
相关产品推荐

