0

我正在尝试在自托管 Web 服务器上实施客户端认证验证。我的第一次尝试是检查请求是否包含客户端证书,但我被困在这里,因为Request.GetClientCertificate()总是返回null.

这是我的身份验证属性类。

public class CustomAuthAttirbute : AuthorizationFilterAttribute
{

    public override void OnAuthorization(HttpActionContext actionContext)
    {

        X509Certificate2 cert = actionContext.Request.GetClientCertificate();
        if (cert == null)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "Client Certificate Required"
            };

        }
        else
        {
            // Validate the certificate
        }

        base.OnAuthorization(actionContext);
    }
}

我使用 Postman 作为 REST 客户端,使用 Postman 我发送客户端证书,如此处记录的使用证书。在 Postman 控制台中,我可以看到证书已成功发送。

我按照本教程使用 nodejs 创建了另一台服务器,以确保我的证书正常并且 Postman 客户端也正常。该服务器工作正常,我可以成功授权 Postman 客户端。

因此,我认为问题仅与 C# 自托管服务器有关。

不幸的是,我不能使用 IIS 或其他 Web 服务器,我只能使用这样的自托管设置或使用 OWIN Katana。

这是我当前的入口点和配置:

class Program
{
    static void Main(string[] args)
    {
        var config = new MyHttpsSelfHostConfiguration("https://localhost:5005");

        config.Routes.MapHttpRoute(
            "API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

        using (HttpSelfHostServer server = new HttpSelfHostServer(config))
        {
            server.OpenAsync().Wait();
            Console.WriteLine("Press Enter to quit.");
            Console.ReadLine();
        }
    }

    class MyHttpsSelfHostConfiguration : HttpSelfHostConfiguration
    {
        public MyHttpsSelfHostConfiguration(string baseAddress) : base(baseAddress) { }
        public MyHttpsSelfHostConfiguration(Uri baseAddress) : base(baseAddress) { }
        protected override BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding)
        {
            httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
            httpBinding.Security.Mode = HttpBindingSecurityMode.Transport;
            return base.OnConfigureBinding(httpBinding);
        }
    }
}

这些是我采取的一些额外步骤:

  • 将证书绑定到 HTTPS。netsh http add sslcert ipport=0.0.0.0:5005 appid={ca7f9e45-f183-414f-8baf-b02d88310766} certhash=bd759f39dc966e0ef131cafde4ab273e9c2d5134 clientcertnegotiation=enable
  • 为我的 URL 添加预订条目。netsh http add urlacl url=https://localhost:5005/ user=Everyone
4

0 回答 0