클라이언트 인증서와 사용자 이름/암호가 필요한 서버에 연결하는 WCF 클라이언트를 가져 오는 데 문제가 있습니다.WCF 클라이언트 인증서 및 사용자 이름 자격 증명 금지
var binding = new WSHttpBinding(SecurityMode.Transport);
binding.Security.Transport = new HttpTransportSecurity();
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var ea = new EndpointAddress(EndpointUrl);
using (var p = new ServiceReference1.AAAClient(binding, ea))
{
try
{
p.ClientCredentials.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
CertificateSubject);
var x = p.RequiresClientCertificateOnly();
Console.WriteLine("Status: " + x.status);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
}
다음 논리적 단계는 사용자 이름/암호 부분을 추가했지만, 그것은 다시 허가받지 않은 403와 함께 제공 :
이 나는 이것을 사용 JUST 클라이언트 인증서의 작품을 사용하는 것을 확인했습니다. 클라이언트 인증서 및 사용자 이름/암호를 제공하기 위해 중간에 피 들러를 사용 했으므로 자격 증명과 인증서가 유효하다는 사실을 알고 WCF를 통해 모두 사용하면 제대로 작동하지 않거나 클라이언트 인증서 및 사용자 이름/암호.
모두 같습니다 사용하려고 코드 (WsHttpBinding과와은 BasicHttpBinding으로 시도 - 모두 같은 결과):
var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
var ea = new EndpointAddress(EndpointUrl);
using (var p = new ServiceReference1.PingPortTypeClient(binding, ea))
{
try
{
p.ClientCredentials.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser,
System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindBySubjectName,
CertificateSubject);
p.ClientCredentials.UserName.UserName = Username;
p.ClientCredentials.UserName.Password = Password;
var x = p.pingDatabase();
Console.WriteLine("Status: " + x.status);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine();
나는 브라우저에서 직접 URL 고토 때 - 나는 오류 얻을 :
을HTTP Error 403.7 - Forbidden The page you are attempting to access requires your browser to have a Secure Sockets Layer (SSL) client certificate that the Web server recognizes.
이는 동일한 오류 (403)가 수신되었으므로 위의 두 번째 예에서 인증서가 전송되지 않았 음을 나타냅니다.
누군가가 WCF가 클라이언트 인증서와 사용자 이름/암호를 제공하도록 구성 할 수 있습니까? 나는 웹을 뒤흔들었고 여기에있는 '비슷한 질문'은 전혀 도움이되지 못했다. 그걸로 지금 매우 좌절감을 느끼고 있습니다 - 나는 무엇을 놓치고 있습니까?
내게 web.config를 보여 주실 수 있습니까? – rauts
또한 WCF 서비스를 만들거나 아니면 해당 서비스를 사용하고 있습니까? WCF 서비스를 만드는 경우 동일한 끝점에 클라이언트 인증서와 사용자 이름/암호 인증이 없어야합니다. 각 인증 모드 (관심사 원칙의 분리)로 두 개의 다른 종단점을 만듭니다. – rauts
좋아, 문제는 보이지만 쉽게 해결되지는 않습니다. SSL이 작동 중입니다. 코드를 기반으로 SSL을 사용하여 메시지를 암호화하지만 메시지 수준 암호화를 사용하여 호스트에 전달할 클라이언트 인증 사용자 자격 증명을 보존합니다. 호스트와의 인증에 UserName/ID와 클라이언트 인증서 자격 증명을 함께 사용하고 있습니까? WCF, 암호화 및 클라이언트 자격 증명을 사용하여 잠시 동안 작업 해본 적이 있으며 누구도이 두 가지를 모두 사용하려고 본 적이 없습니다. – Brian