.NET隔离进程Azure Functions:如何从请求中访问客户端证书
.NET 7隔离进程函数获取客户端证书的实现方法
在.NET 7隔离进程函数架构中,确实无法直接使用MVC里的Request.GetClientCertificate()方法,也不能直接通过HttpContext访问,但可以通过FunctionContext的特性集合来获取客户端证书,具体实现如下:
1. 配置客户端证书模式
首先在host.json中配置HTTP扩展的客户端证书模式,确保函数应用接收客户端证书:
{ "extensions": { "http": { "clientCertificateMode": "Require" // 可选值:Require/Allow/Ignore } } }
如果是Azure部署的函数应用,还需要在门户的配置>常规设置中,将“客户端证书模式”设置为对应的值。
2. 在中间件中获取证书
创建自定义中间件,通过FunctionContext的Features集合提取IHttpRequestFeature,从中获取客户端证书:
using Microsoft.AspNetCore.Http.Features; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Middleware; public class CertificateMiddleware : IFunctionsWorkerMiddleware { public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next) { var httpRequestFeature = context.Features.Get<IHttpRequestFeature>(); var clientCertificate = httpRequestFeature.ClientCertificate; if (clientCertificate != null) { // 这里可以添加证书验证、信息提取等逻辑 var certThumbprint = clientCertificate.Thumbprint; // 将证书存入context.Items,供后续函数调用时使用 context.Items["ClientCertificate"] = clientCertificate; } await next(context); } }
3. 注册中间件
在Program.cs中注册自定义中间件:
var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(builder => { builder.UseMiddleware<CertificateMiddleware>(); }) .Build(); host.Run();
4. 在函数中直接获取证书
如果不需要通过中间件,也可以在函数体内直接从FunctionContext提取证书:
using Microsoft.AspNetCore.Http.Features; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using System.Net; [Function("CertificateTestFunction")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, FunctionContext context) { var httpRequestFeature = context.Features.Get<IHttpRequestFeature>(); var clientCert = httpRequestFeature.ClientCertificate; var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteStringAsync(clientCert != null ? $"客户端证书指纹:{clientCert.Thumbprint}" : "未获取到客户端证书"); return response; }
内容的提问来源于stack exchange,提问作者Donar144
相关产品推荐
相关产品推荐

