클라이언트 - 서버 응용 프로그램을 개발할 때 WCF를 사용하고 있습니다. WCF 서비스는 디지털 인증서를 사용하여 보호됩니다. 클라이언트에 서버에 대한 호출로 멤버쉽 사용자 이름/암호를 제공해야하므로 메시지 보안을 사용하고 있습니다. 서버는 Windows 서비스에 의해 호스팅됩니다. 프로덕션 서버에 인증서 서비스를 설치하고 서버 인증 디지털 인증서를 만드는 데 사용했습니다.매우 느린 x509 암호화를 사용하는 WCF Net.TCP
서버의 디지털 인증서는 sha1을 1024 비트 공개 키가있는 해시 알고리즘으로 사용합니다.
클라이언트 WCF 프록시는 Visual Studio에서 (서비스 참조 추가를 통해) 생성됩니다. 내 클라이언트에서는 WCF 프록시의 싱글 톤 인스턴스를 사용하고 있습니다.
문제는 응용 프로그램의 성능을 내 프로덕션 서버에 끔찍한 (전용 클라우드 서버와 내 로컬 컴퓨터가 클라이언트 역할) WCF의 보안 모드가 "메시지" 또는 "TransportWithMessage"로 설정되어있을 때이다 .
서버와 클라이언트가 같은 컴퓨터에있을 때 로컬 컴퓨터와 프로덕션 서버에서 응용 프로그램이 매우 빠르게 실행됩니다. 이는 SQL 쿼리와 관련된 성능 문제를 배제합니다.
보안 여부에 관계없이 성능을 비교하십시오. 나는 다음과 같은 작업을 사용하고 있습니다 :
작업을 :
- 확인 로그인 자격 증명 : 호출되는 테스트 기능을 보안 예외가 인증 정보가 잘못되었습니다 후 반환되는 경우.
- 목록 가져 오기 : 11 (EF DbContext) 엔터티 목록을 반환하는 함수입니다.
- ID로 레코드 가져 오기 : "단일 다중성"탐색 속성이로드 된 단일 엔터티를 반환합니다.
나는이 작업에 대한 서비스 요청의 기간과 크기를 기록하기 위해 WireShark를 사용했습니다. 클라이언트와 서버가있는 경우 동일한 시스템이 항상에
모든 작업에 대한 기간 : 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="data source=.\SQLEXPRESS;initial catalog=HS;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" 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가 있습니까? 아니면 내가 잘못하고있는 것이 있습니까?
여전히 메시지 보안 + 사용자 이름/암호를 사용하여 문제를 해결 했습니까? – hardywang
예. 난 그냥 서버에 전화를 적게하여 코드를 최적화했다. 이는 클라이언트 측에서 정보를 캐싱하고 서버를 비동기 적으로 호출하여 수행 할 수 있습니다. – Omtara