Azure Functions隔离模式下基础认证配置及账号密码获取方法
Azure Functions 隔离模式基础认证相关问题解答
1. 如何在Azure Functions隔离模式中使用基础认证?
Azure Functions隔离模式没有内置的基础认证支持,需手动实现以下步骤:
- 从请求头提取
Authorization字段,格式为Basic <Base64编码的用户名:密码> - 对Base64编码部分解码,拆分得到用户名和密码
- 自定义验证逻辑(如对比预设账号密码、调用身份验证服务等)
- 验证不通过时返回
401 Unauthorized响应
2. 如何获取SOAPUI调用函数时传入的用户名和密码?
修改函数代码,从HttpRequestData的请求头中解析基础认证信息:
[Function("Function1")] public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req) { _logger.LogInformation("C# HTTP trigger function processed a request."); string username = null; string password = null; // 解析基础认证头 if (req.Headers.TryGetValues("Authorization", out var authHeaders)) { var authHeader = authHeaders.FirstOrDefault(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Basic ")) { var encodedCredentials = authHeader["Basic ".Length..]; var credentials = Encoding.UTF8.GetString(Convert.FromBase64String(encodedCredentials)); var parts = credentials.Split(':', 2); if (parts.Length == 2) { username = parts[0]; password = parts[1]; } } } // 验证凭据,无有效凭据则返回401 if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { var unauthorizedResponse = req.CreateResponse(HttpStatusCode.Unauthorized); unauthorizedResponse.Headers.Add("WWW-Authenticate", "Basic realm=\"YourFunctionRealm\""); return unauthorizedResponse; } var response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); response.WriteString($"Welcome {username}!"); return response; }
3. 如何在自定义中间件中获取该用户名和密码?
在隔离模式的自定义中间件中,先从FunctionContext获取HttpRequestData实例,再按相同逻辑解析:
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { var req = await context.GetHttpRequestDataAsync(); if (req != null) { string username = null; string password = null; if (req.Headers.TryGetValues("Authorization", out var authHeaders)) { var authHeader = authHeaders.FirstOrDefault(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Basic ")) { var encodedCredentials = authHeader["Basic ".Length..]; var credentials = Encoding.UTF8.GetString(Convert.FromBase64String(encodedCredentials)); var parts = credentials.Split(':', 2); if (parts.Length == 2) { username = parts[0]; password = parts[1]; } } } // 验证失败直接返回401 if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { var unauthorizedResponse = req.CreateResponse(HttpStatusCode.Unauthorized); unauthorizedResponse.Headers.Add("WWW-Authenticate", "Basic realm=\"YourFunctionRealm\""); await context.GetInvocationResultAsync().SetResult(unauthorizedResponse); return; } // 将认证信息存入上下文,供后续函数使用 context.Items["AuthenticatedUsername"] = username; } await next(context); }
注意:生产环境中请勿硬编码用户名密码,建议使用Azure Key Vault存储认证凭据,避免明文泄露。
内容的提问来源于stack exchange,提问作者Marcer ponts
相关产品推荐
相关产品推荐

