如何为Windows身份验证和可靠消息传递设置WCF服务

时间:2016-03-02 11:24:08

标签: c# .net wcf iis windows-authentication

我的问题类似于WCF Service, Windows Authentication(以及其他解决类似解决方案相同问题的问题),但我也需要可靠的会话,而#34; basicHttpBinding"正如在回答这个问题时所建议的那样。

我想简要解释一下我的场景:用户使用连接到IIS上托管的WCF服务的WinForms应用程序,WCF服务连接到MS SQL Server(用户被授予访问权限)。用户是域用户,IIS和SQL Server都在同一个域中。出于测试目的,我创建了一个小的ASP.net网页,输出" Thread.CurrentPrincipal.Identity.Name"。如果我在IIS中启用Windows身份验证,我可以看到我的用户名,因此我可以确定Windows身份验证适用于IIS。

在IIS中为WCF服务启用Windows身份验证后,在Visual Studio中创建服务引用时出现错误,指出WSHttpBinding不支持通过HTTPS实现可会话(尽管我使用HTTP)。它表示类似"无法打开通道工厂或服务主机。" (不幸的是,我有所有软件的非英语版本,所以我必须尝试翻译它)。我现在尝试了各种配置,最后得到了以下Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
  <!-- Bei der Bereitstellung des Dienstbibliothekprojekts muss der Inhalt der Konfigurationsdatei der app.config-Datei 
  des Hosts hinzugefügt werden. System.Configuration unterstützt keine Konfigurationsdateien für Bibliotheken. -->
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="wsHttpBinding" bindingConfiguration="WsHttpEndpointBinding" />
    </protocolMapping>
    <bindings>
      <wsHttpBinding>
        <binding name="WsHttpEndpointBinding">
          <reliableSession enabled="true" inactivityTimeout="00:59:59" />
          <security mode="Transport">
            <transport clientCredentialType="Windows">
              <extendedProtectionPolicy policyEnforcement="Never" />
            </transport>
            <message establishSecurityContext="true" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="ES.Reporting.RepWbService.RepWbMain">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WsHttpEndpointBinding" contract="ES.Reporting.RepWbService.IRepWbMain">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/RepWbService/MainRepWbService/" />
          </baseAddresses>
          <!--<timeouts closeTimeout="00:01:00" />-->
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Legen Sie die Werte unten vor der Bereitstellung 
          auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
          <!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, 
          legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, 
          um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

任何想知道如何配置服务以使其按预期工作的人?

编辑:虽然我在IIS中设置了虚拟目录以进行匿名身份验证,但启用了摘要身份验证和Windows身份验证,但我在WCF服务中获取了Thread.CurrentPrincipal.Identity.Name的用户名(但是&#34; DefaultAppPool&#34;在Environment.UserName中)。可能有一种在连接到SQL Server时转发该用户的方法吗?

0 个答案:

没有答案