2012-07-12 5 views
2

클라이언트 - 서버 응용 프로그램을 개발할 때 WCF를 사용하고 있습니다. WCF 서비스는 디지털 인증서를 사용하여 보호됩니다. 클라이언트에 서버에 대한 호출로 멤버쉽 사용자 이름/암호를 제공해야하므로 메시지 보안을 사용하고 있습니다. 서버는 Windows 서비스에 의해 호스팅됩니다. 프로덕션 서버에 인증서 서비스를 설치하고 서버 인증 디지털 인증서를 만드는 데 사용했습니다.매우 느린 x509 암호화를 사용하는 WCF Net.TCP

서버의 디지털 인증서는 sha1을 1024 비트 공개 키가있는 해시 알고리즘으로 사용합니다.

클라이언트 WCF 프록시는 Visual Studio에서 (서비스 참조 추가를 통해) 생성됩니다. 내 클라이언트에서는 WCF 프록시의 싱글 톤 인스턴스를 사용하고 있습니다.

문제는 응용 프로그램의 성능을 내 프로덕션 서버에 끔찍한 (전용 클라우드 서버와 내 로컬 컴퓨터가 클라이언트 역할) WCF의 보안 모드가 "메시지" 또는 "TransportWithMessage"로 설정되어있을 때이다 .

서버와 클라이언트가 같은 컴퓨터에있을 때 로컬 컴퓨터와 프로덕션 서버에서 응용 프로그램이 매우 빠르게 실행됩니다. 이는 SQL 쿼리와 관련된 성능 문제를 배제합니다.

보안 여부에 관계없이 성능을 비교하십시오. 나는 다음과 같은 작업을 사용하고 있습니다 :

작업을 :

  1. 확인 로그인 자격 증명 : 호출되는 테스트 기능을 보안 예외가 인증 정보가 잘못되었습니다 후 반환되는 경우.
  2. 목록 가져 오기 : 11 (EF DbContext) 엔터티 목록을 반환하는 함수입니다.
  3. ID로 레코드 가져 오기 : "단일 다중성"탐색 속성이로드 된 단일 엔터티를 반환합니다.

나는이 작업에 대한 서비스 요청의 기간과 크기를 기록하기 위해 WireShark를 사용했습니다. 클라이언트와 서버가있는 경우 동일한 시스템이 항상에

Results table

모든 작업에 대한 기간 : I 보안 않고, 보안 WsHttpBinding과 보안 netTcpBinding 및 netTcpBinding에 대한 테스트를 반복 한, 여기에 결과는 1 초 미만.

이것은 WCF 서버의 구성 파일입니다. 두 개의 바인딩과 두 가지 동작, 하나는 보안 통신용이고 다른 하나는 불안전 한 통신용입니다.

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <netTcpBinding> 
       <binding name="NetTcpBinding_IHS" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="20000000" portSharingEnabled="false"> 
        <security mode="Message"> 
         <message clientCredentialType="UserName" /> 
        </security> 
       </binding> 
       <binding name="NetTcpBinding_IHS_Insecure" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="20000000"> 
        <security mode="None"> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
     <client> 
      <endpoint address="net.tcp://{my server ip address}:808/Services/HS.svc" binding="netTcpBinding" 
       bindingConfiguration="NetTcpBinding_IHS" contract="ServiceReference.IHS" 
       name="NetTcpBinding_IHS"> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

내가 어떤 주목할만한 진전없이 일주일에 있기 때문에이 문제로 어려움을 겪고되었습니다

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
     <add name="HS" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=HS;Integrated Security=True" providerName="System.Data.SqlClient"/> 
     <add name="HSContext" connectionString="metadata=res://HS.Model/Model.csdl|res://HS.Model/Model.ssdl|res://HS.Model/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=HS;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
    <system.web> 
     <compilation debug="true" targetFramework="4.2"/> 
     <authentication mode="Forms"> 
      <forms name=".HSYAUTH" loginUrl="~/Account/LogOn" cookieless="UseCookies" protection="All" slidingExpiration="true" timeout="2880"/> 
     </authentication> 
     <machineKey validationKey="..." decryptionKey="..." validation="HMACSHA256" decryption="AES"/> 
     <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15" hashAlgorithmType="SHA256"> 
      <providers> 
       <clear/> 
       <add applicationName="HS" name="SqlMembershipProvider" connectionStringName="HS" passwordFormat="Hashed" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="6" maxInvalidPasswordAttempts="5" enablePasswordReset="true" enablePasswordRetrieval="false" passwordAttemptWindow="10" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" type="System.Web.Security.SqlMembershipProvider"/> 
      </providers> 
     </membership> 
     <profile> 
      <providers> 
       <clear/> 
       <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="HS" applicationName="HS"/> 
      </providers> 
      <properties> 
       <add name="WebSettingsTestText" type="string" readOnly="false" defaultValue="DefaultText" serializeAs="String" allowAnonymous="false"/> 
      </properties> 
     </profile> 
     <roleManager enabled="true" defaultProvider="SqlRoleProvider"> 
      <providers> 
       <clear/> 
       <add connectionStringName="HS" applicationName="HS" name="SqlRoleProvider" type="System.Web.Security.SqlRoleProvider"/> 
       <add applicationName="HS" name="WindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider"/> 
      </providers> 
     </roleManager> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="HS.Services.HS" behaviorConfiguration="SecureServiceBehavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://0:808/Services/HS.svc"/> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="netTcpBinding" contract="HS.Services.IHS" bindingConfiguration="SecureBinding"> 
        <identity> 
         <dns value="{my server ip address}"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="SecureServiceBehavior"> 
        <serviceMetadata/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
        <serviceCredentials> 
         <serviceCertificate findValue="CN={my server ip address}" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectDistinguishedName"/> 
         <clientCertificate> 
          <authentication revocationMode="NoCheck"/> 
         </clientCertificate> 
         <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider"/> 
        </serviceCredentials> 
        <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider"/> 
        <serviceThrottling maxConcurrentCalls="128" maxConcurrentSessions="128" maxConcurrentInstances="128"/> 
       </behavior> 
       <behavior name="InsecureServiceBehavior"> 
        <serviceMetadata/> 
        <serviceDebug includeExceptionDetailInFaults="true"/> 
        <serviceCredentials> 
         <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="SqlMembershipProvider"/> 
        </serviceCredentials> 
        <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider"/> 
        <serviceThrottling maxConcurrentCalls="128" maxConcurrentSessions="128" maxConcurrentInstances="128"/> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <bindings> 
      <netTcpBinding> 
       <binding name="SecureBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="20000000" portSharingEnabled="false"> 
        <security mode="Message"> 
         <message clientCredentialType="UserName"/> 
        </security> 
        <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/> 
       </binding> 
       <binding name="NoSecureBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="20000000" portSharingEnabled="true"> 
        <security mode="None"> 
        </security> 
        <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> 
    </startup> 
</configuration> 

은이는 WCF 클라이언트의 구성 파일입니다. 보안이 취약한 WCF가 있습니까? 아니면 내가 잘못하고있는 것이 있습니까?

+0

여전히 메시지 보안 + 사용자 이름/암호를 사용하여 문제를 해결 했습니까? – hardywang

+0

예. 난 그냥 서버에 전화를 적게하여 코드를 최적화했다. 이는 클라이언트 측에서 정보를 캐싱하고 서버를 비동기 적으로 호출하여 수행 할 수 있습니다. – Omtara

답변

2

속도가 염려되는 경우 전송 보안 만 사용하는 것이 좋습니다. 메시지 본문 암호화는 전체 채널을 보호하는 것보다 훨씬 느립니다.

관련 문제