【发布时间】:2019-07-05 17:32:39
【问题描述】:
我们正在将客户端写入 WCF 服务,该服务同时使用 CSR 证书和基本身份验证。
我们的 C# 客户端是通过 Visual Studio 生成的,我们可以通过编程方式设置证书和用户名/密码。但是,我们必须手动发送 Basic Auth 标头,否则我们会收到错误:
'The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm="HttpBasicAuthentication"'.'
我们的代码是:
var myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
myBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
var ea = new EndpointAddress("https://example.org/myservice");
var client = new MandateWebServiceClient(myBinding, ea);
client.ClientCredentials.UserName.UserName = "wally";
client.ClientCredentials.UserName.Password = "walliesWorld";
client.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2("C:\\some\\path\\to\\csr.pfx", "password");
using (var scope = new OperationContextScope(client.InnerChannel))
{
var httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers[HttpRequestHeader.Authorization] =
"Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(client.ClientCredentials.UserName.UserName + ":" + client.ClientCredentials.UserName.Password));
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
client.create();
}
通过上面的代码,我们可以成功地与服务对话。如果我们删除using 块中的行,身份验证方案将更改为Anonymous,我们会收到上述错误。
上面的安排似乎有点陈词滥调。我们已经尝试了所有可能的SecurityMode 设置,SecurityMode.Transport 和HttpClientCredentialType.Certificate 是唯一允许接受证书的组合。设置或不设置MessageCredentialType.UserName似乎对系统没有影响。
是否有任何 .Net Framework 方法可以同时提供证书和基本身份验证标头,而不是手动添加标头?
【问题讨论】:
标签: c# wcf ssl-certificate basic-authentication