You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:50:09