2009-05-21 5 views
3

ASP.NET 응용 프로그램에서 WCF 서비스에 연결하고 있습니다. 하나의 사용자 이름과 암호를 사용하여 로그인하고 whoevever의 실제 사용자 이름을 전달하는 것은 ASP.NET 웹 응용 프로그램에 아래와 같이 메시지 헤더에 기록됩니다.wcf : 메시지 헤더에 사용자 이름을 추가하는 것이 안전합니까?

using (OperationContextScope scope = new OperationContextScope(myService2.InnerChannel)) 
    { 
    Guid myToken = Guid.NewGuid(); 

    MessageHeader<string> messageHeader = new MessageHeader<string>(HttpContext.Current.User.Identity.Name); 
    MessageHeader untyped = messageHeader.GetUntypedHeader("token", "ns"); 

    OperationContext.Current.OutgoingMessageHeaders.Add(untyped); 

    lblResult.Text = myService2.GetData(1231); 
    } 

나는 또한이 충분한 보호가 메시지 헤더에 저장된 사용자 이름에서 점점 사람을 중단 여부에 대해 걱정 무엇

 <serviceCredentials> 
     <serviceCertificate findValue="CN=tempCert" /> 
     <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
      membershipProviderName="MySqlMembershipProvider" /> 
     </serviceCredentials> 

다음과 같은 서비스 인증서를 사용하고 있습니다?

ASP.NET의 설정은

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="NewBehavior"> 
       <clientCredentials> 
        <serviceCertificate> 
         <authentication revocationMode="NoCheck"/> 
        </serviceCertificate> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="wsHttpEndpoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
       <security mode="Message"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> 
        <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/WCFTestService/Service.svc" behaviorConfiguration="NewBehavior" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpoint" contract="WCFTestService.IService" name="wsHttpEndpoint"> 
      <identity> 
       <certificate encodedValue=""/> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

과 서비스 측면에서의

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttpEndpointBinding"> 
     <security> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="Service"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" 
     name="wsHttpEndpoint" contract="IService"> 
     <!--<identity> 
     <dns value="" /> 
     </identity>--> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceCredentials> 
     <serviceCertificate findValue="CN=tempCert" /> 
     <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
      membershipProviderName="MySqlMembershipProvider" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

답변

2

큰 질문은 : 당신은 전송 수준 또는 메시지 - 어떤 종류가 있나요 바인딩에서 수준 보안을 사용할 수 있습니까? 어떤 바인딩을 사용하고 있습니까?

전송 수준 보안 (일반적으로 SSL을 통한 HTTPS 사용)이있는 경우 매우 안전하다고 판단되는 지점 간 암호화 된 전송 채널이 있습니다.

클라이언트의 인증서를 사용하는 메시지 수준 보안도 있고 전체 메시지를 암호화하는 경우 안전해야합니다.

정말 당신이 사용하고있는 바인딩과 그 바인딩에서 사용하고있는 보안 설정에 따라 다릅니다. 우리에게 서버의 설정을 보여줘!

마크

+0

내 설정을 표시하도록 내 소식을 업데이트했습니다. 지혜의 덩어리가되어 주셔서 감사합니다. – AJM

+1

나는 당신이 괜찮을 거라고 생각합니다. wsHttpBinding을 지정했으며 서비스는 서비스 인증서를 사용하여 클라이언트에 대해 자체 인증합니다. 메시지 레벨 보안을 지정 했으므로 클라이언트는 서비스 인증서의 공개 키를 사용하여 메시지를 암호화하고 유선을 통해 전송하며 서비스의 공개 키를 사용하여 암호화되므로 해당 인증서 만 사용하여 해당 서비스 만 암호화합니다. 비공개 키로 해독 할 수 있습니다. 나는 네가 안전해야한다고 생각해. –

+0

도움에 감사드립니다. :-) – AJM

관련 문제