本地运行Azure Functions时获取已认证用户的问题
本地运行Azure Functions获取B2C认证用户信息的配置步骤
1. 手动实现JWT令牌验证
云端Azure Functions会自动由平台完成B2C令牌验证并填充context.req.user及相关请求头,但本地运行无此自动处理,需自行添加验证逻辑:
- 安装依赖包:
npm install jsonwebtoken jwks-rsa @types/jsonwebtoken --save-dev - 在Function代码中加入验证逻辑示例:
import jwt from 'jsonwebtoken'; import jwksClient from 'jwks-rsa'; import { Context, HttpRequest } from '@azure/functions'; const client = jwksClient({ jwksUri: 'https://<你的B2C租户>.b2clogin.com/<你的B2C租户>.onmicrosoft.com/<你的B2C策略>/discovery/v2.0/keys' }); function getKey(header: jwt.JwtHeader, callback: jwt.SigningKeyCallback) { client.getSigningKey(header.kid, (err, key) => { err ? callback(err) : callback(null, key.getPublicKey()); }); } export async function run(context: Context, req: HttpRequest) { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { context.res = { status: 401, body: '未授权' }; return; } const token = authHeader.split(' ')[1]; jwt.verify(token, getKey, { audience: '<你的Functions应用客户端ID>', issuer: 'https://<你的B2C租户>.b2clogin.com/<你的B2C租户ID>/v2.0/' }, (err, decoded) => { if (err) { context.res = { status: 401, body: '无效令牌' }; return; } // 手动填充用户信息及请求头 context.req.user = decoded; context.req.headers['X-MS-CLIENT-PRINCIPAL-ID'] = decoded.sub; // 后续业务逻辑 context.res = { status: 200, body: `欢迎 ${decoded.name}` }; }); }
2. 配置local.settings.json补充认证参数
在本地配置文件中添加B2C相关参数,模拟云端环境:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "node", "AzureAdB2C__Tenant": "<你的B2C租户>", "AzureAdB2C__ClientId": "<你的Functions应用客户端ID>", "AzureAdB2C__Policy": "<你的B2C策略名称>", "AzureAdB2C__IssuerUrl": "https://<你的B2C租户>.b2clogin.com/<你的B2C租户ID>/v2.0/" } }
3. 升级并配置本地Functions主机
如果使用Azure Functions v4+,可通过扩展启用本地认证支持:
- 确保本地Functions CLI为最新版本:
npm install -g azure-functions-core-tools@4 - 在对应Function的
function.json中添加认证规则:{ "authLevel": "anonymous", "bindings": [ // 你的绑定配置 ], "auth": { "allowedAudiences": ["<你的Functions应用客户端ID>"], "issuers": ["https://<你的B2C租户>.b2clogin.com/<你的B2C租户ID>/v2.0/"] } }
核心注意点
- 本地运行时Functions主机不会自动验证JWT,必须手动实现或通过扩展配置处理,这是与云端运行的核心差异。
audience和issuer参数必须与B2C应用注册中的配置完全匹配,否则令牌验证会失败。
内容的提问来源于stack exchange,提问作者tdurnford
相关产品推荐
相关产品推荐

