如何用Entra ID与MSAL.NET在Blazor浏览器无密钥访问Azure存储资源
无密钥通过浏览器使用Entra ID访问Azure Blob存储方案
前提条件
- 拥有Azure订阅,具备Entra ID应用注册和存储账户配置权限
- 已注册Entra ID单页应用(SPA)——浏览器环境仅支持该类型应用注册
- 目标Azure Blob存储账户已启用Entra ID身份验证
配置步骤
1. 配置Entra ID SPA应用注册
- 在Entra ID控制台创建SPA应用,设置前端应用的重定向URI(如
http://localhost:3000) - 为应用添加API权限:找到「Azure Storage」,添加user_impersonation委托权限,完成后授予管理员同意(需让所有授权用户都能访问时操作)
2. 配置Blob存储的IAM访问控制
- 进入目标存储账户的「访问控制(IAM)」页面,添加角色分配
- 选择匹配需求的内置角色:如仅需读取选存储Blob数据读取者,需读写选存储Blob数据贡献者
- 将角色分配给Entra ID中的目标用户组或单个用户(基于信任已认证用户的前提,直接分配即可)
前端实现(基于MSAL.js)
浏览器环境无法使用Azure.Identity的TokenCredentials,需用专为前端设计的MSAL.js库完成身份验证和令牌获取:
import { PublicClientApplication } from '@azure/msal-browser'; // 初始化MSAL客户端 const msalConfig = { auth: { clientId: '你的SPA应用ID', authority: 'https://login.microsoftonline.com/你的租户ID', redirectUri: '你的前端应用地址' } }; const pca = new PublicClientApplication(msalConfig); // 获取访问令牌 async function fetchAccessToken() { const accounts = pca.getAllAccounts(); if (accounts.length === 0) { // 未登录则弹出登录窗口 const loginRes = await pca.loginPopup({ scopes: ['https://storage.azure.com/.default'] }); return loginRes.accessToken; } else { // 已登录则静默刷新令牌 const tokenRes = await pca.acquireTokenSilent({ account: accounts[0], scopes: ['https://storage.azure.com/.default'] }); return tokenRes.accessToken; } } // 调用Blob存储REST API示例:列出容器 async function listBlobContainers(storageAccount, token) { const res = await fetch(`https://${storageAccount}.blob.core.windows.net/?comp=list`, { headers: { 'Authorization': `Bearer ${token}` } }); if (res.ok) { const containerList = await res.text(); console.log('容器列表:', containerList); } else { console.error('请求失败:', res.status); } } // 执行示例 fetchAccessToken().then(token => { listBlobContainers('你的存储账户名', token); });
关键说明
- 为何不用Azure.Identity:该库的TokenCredentials组件多为后端/桌面应用设计,依赖客户端密钥或证书,不符合浏览器环境的无密钥要求;而MSAL.js基于OAuth2 PKCE流程,全程无需暴露敏感密钥
- 权限管控:通过IAM直接绑定用户与Blob数据角色,确保仅授权用户可访问,完全规避SAS、连接字符串等密钥类凭证的安全风险
- 安全边界:因前端直接访问资源,需严格遵循最小权限原则分配角色,且仅信任已认证用户的合规操作
内容的提问来源于stack exchange,提问作者Rodolfo Grave
相关产品推荐
相关产品推荐

