我正在尝试在自托管 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