调用带有客户端证书错误的 SOAP Web 服务 - 从服务器收到的身份验证 header 是“”

Calling SOAP web service with client certificate error - Authentication header received from the server was ''

我正在尝试使用客户端证书调用 SOAP Web 服务,但收到以下错误消息。

HTTP 请求未经客户端身份验证方案 'Anonymous' 授权。从服务器收到的身份验证 header 是 ''。

在保护 Web 服务的要求之前,我能够使用以下代码减去证书代码来检索数据。我已验证证书代码正确地从我的证书存储中检索了客户端证书信息。在代码下方我也添加了我的应用配置信息

任何人都可以提供有关我收到上述错误消息的原因的任何见解吗?提前感谢任何可以提供任何见解的人。

    Friend Function GetWorkByBAWTS(ByVal sBAWTSLookupName As String, ByVal sUnit As String, ByVal sWorkType As String, ByVal sStatus As String) As ArrayList
    System.Net.ServicePointManager.Expect100Continue = False
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12

    Dim sSearchType As X509FindType = DirectCast([Enum].Parse(GetType(X509FindType), ConfigurationManager.AppSettings("searchtype")), X509FindType)
    Dim sSubjectValue As String = ConfigurationManager.AppSettings("searchvalue")
    Dim sDelimiter As String = ConfigurationManager.AppSettings("delimiter")
    Dim sStoreName As StoreName = DirectCast([Enum].Parse(GetType(StoreName), ConfigurationManager.AppSettings("storename")), StoreName)
    Dim sStoreLocation As StoreLocation = DirectCast([Enum].Parse(GetType(StoreLocation), ConfigurationManager.AppSettings("storelocation")), StoreLocation)

    Dim cert As X509Certificate2 = Nothing
    Dim store As X509Store = New X509Store(StoreName.My, StoreLocation.CurrentUser)

    store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly)


    Dim certcollection As X509Certificate2Collection = store.Certificates.Find(sSearchType, sSubjectValue, False)
    Dim activecollection As X509Certificate2Collection = certcollection.Find(X509FindType.FindByTimeValid, DateTime.Now, False)

    cert = certcollection(0)
    store.Close()


    Dim iRetry As Integer = 0
    Dim alWorkItems As New ArrayList
    Dim oResponse As lookupObjectsResponse = Nothing
    Dim oClient As ProcessingServiceClient = New ProcessingServiceClient("ProcessingServicePort")

    oClient.ClientCredentials.ClientCertificate.Certificate = cert
    oClient.Endpoint.Address = New ServiceModel.EndpointAddress("https://mywebservice:8443/prodapp/ProcessingService?wsdl")

    Dim oRequest As lookupObjects = New lookupObjects()
    oRequest.lookupObjectsRequest = New lookupObjectsRequest()
    oRequest.lookupObjectsRequest.lookupName = "LKWTSTAT"
    oRequest.lookupObjectsRequest.lookupParameters = New lookupObjectsRequestLookupParameters()


    m_oAuthInfo = New authorizationInfo()
    m_oAuthInfo.userId = "user1"

    oClient.ClientCredentials.UserName.UserName = "user1"
    oClient.ClientCredentials.UserName.Password = "password"


    Dim oItems As lookupParameter()
    ReDim oItems(2)
    oRequest.lookupObjectsRequest.lookupParameters.Items = oItems
    oRequest.lookupObjectsRequest.lookupParameters.Items(0) = New lookupParameter()
    oRequest.lookupObjectsRequest.lookupParameters.Items(0).name = "businessArea"
    oRequest.lookupObjectsRequest.lookupParameters.Items(0).Value = sUnit
    oRequest.lookupObjectsRequest.lookupParameters.Items(1) = New lookupParameter()
    oRequest.lookupObjectsRequest.lookupParameters.Items(1).name = "type"
    oRequest.lookupObjectsRequest.lookupParameters.Items(1).Value = sWorkType
    oRequest.lookupObjectsRequest.lookupParameters.Items(2) = New lookupParameter()
    oRequest.lookupObjectsRequest.lookupParameters.Items(2).name = "status"
    oRequest.lookupObjectsRequest.lookupParameters.Items(2).Value = sStatus


    oResponse = oClient.lookupObjects(m_oAuthInfo, oRequest)


    If Not oResponse.lookupObjectsResponse1.Items Is Nothing Then
        For Each oWorkItem As workInstance In oResponse.lookupObjectsResponse1.Items
            alWorkItems.Add(oWorkItem)
        Next
    End If
    Return alWorkItems
End Function

app.config

<configuration>
<configSections>
</configSections>
<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
          <binding name="AWDProcessingServiceBinding" closeTimeout="00:01:00"
              openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
              allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              maxBufferSize="655360" maxBufferPoolSize="524288" maxReceivedMessageSize="655360"
              messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
              useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
            <!-- <security mode="Transport">
              <transport clientCredentialType="Certificate" proxyCredentialType="Basic" realm="" />
              <message clientCredentialType="UserName" algorithmSuite="Default" />
            </security> -->
            <security mode="Transport">
              <transport clientCredentialType="Certificate" />
            </security> 
          </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://mywebservice:8443/betaapp/ProcessingService?wsdl"
            binding="basicHttpBinding" bindingConfiguration="ProcessingServiceBinding"
            contract="PS.ProcessingService" name="AWDProcessingServicePort" />
    </client>
</system.serviceModel>
<appSettings>
    *** removed cert info ***
</appSettings> 

更新:问题最终是传入的用户 ID 被禁用。重新启用了 ID,这解决了我的问题。