WebAPI证书和身份验证 - ELI5

时间:2015-07-23 12:16:59

标签: c# asp.net-mvc rest iis asp.net-web-api

我确定我错过了一些关键事实,但我可以帮你找到。我真的很困惑这一切都需要如何运作:

  • 服务器1 - IIS 8,托管供应商的WebAPI,匿名和Windows身份验证。提供商是谈判,NTLM。 Https和签名证书(Cert1)。
  • 服务器2 - IIS8,连接到Server1的WebAPI的新WebAPI。我假设我需要在服务器2上存储Cert1。我们将有另一个证书,https(Cert2)
  • 服务器3 - IIS 8,网站连接到服务器2的webAPI。
  • 用户 - 连接到服务器3的浏览器,仅限Windows身份验证。 每个服务器和用户的浏览器都连接到同一个Active Directory。

我可以访问Server1的web.config来更改绑定,但不能更改代码。在Visual Studio 2013中,当我添加服务器2的服务引用时,web.config将添加如下:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_ICoreWebService">
      <security mode="Transport">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="https://dave.domain.com/webService/CoreWebService.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICoreWebService" contract="Dave.ICoreWebService" name="WSHttpBinding_ICoreWebService">
    <identity>
      <userPrincipalName value="Server1ServiceAccount@dave.domain.com" />
    </identity>
  </endpoint>
</client>

这是Server1的WebAPI web.config

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <!-- The following block is used for secure connection (HTTPS)-->
    <binding name="DaveServiceBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:05:00" sendTimeout="00:05:00">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="None" />
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<services>
  <service name="Dave.WebService.CoreWebService" behaviorConfiguration="DaveWebServiceBehavior">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DaveWebServiceBinding" contract="Dave.WebService.ICoreWebService" />
    <endpoint address="wauth" binding="wsHttpBinding" bindingConfiguration="DaveWebServiceBindingWauth" contract="Dave.WebService.ICoreWebService" />
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="DaveWebServiceBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Dave.WebService.WebServiceAuthValidator,Dave.WebService" />
      </serviceCredentials>
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

  1. 我在服务器1和服务器2之间如何工作时遇到问题。我只需要下载Cert1并将其存储在Server2上?然后在我打电话时参考该证书。此代码未找到证书:

    svc.ClientCredentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine,
                StoreName.TrustedPublisher,
                X509FindType.FindBySubjectName, "CN = dave.domain.com, OU = ZZ123, O = Dave, Inc., L = Chicago, S = Illinois, C = US");
    
  2. 如何将用户的Windows身份验证冒泡到server1?供应商的API将通过该消息进行身份验证。

  3. 现在,我可以在本地浏览该服务,但我一直被困在服务器2上并获得证书。我想确保我正确地存储和引用它。

    先谢谢。

1 个答案:

答案 0 :(得分:0)

主题名称必须是域名,我使用MMC来确保证书应该在哪里。

MMC - &gt;证书(您可能需要在管理单元中添加它们)

值得信赖的人 - &gt;证书。

希望能有所帮助。