2009-05-21 2 views
3

Ich verbinde mich mit einem WCF-Dienst in einer ASP.NET-App. Ich melde mich mit einem Benutzernamen und einem Passwort an und übergebe den tatsächlichen Benutzernamen von whoevever an die ASP.NET Web App in einer Nachrichtenkopfzeile wie unten beschrieben.wcf: das Hinzufügen von Benutzername zum Nachrichtenkopf ist das sicher?

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); 
    } 

Ich verwende auch ein Service-Zertifikat wie unten

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

Was ich mache mir Sorgen, ob dieser eine ausreichender Schutz Menschen an den im Message-Header gespeicherten Benutzername immer zu stoppen?

ASP.NET config

<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> 

und auf der Serviceseite seiner

<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> 

Antwort

2

Die große Frage ist: Sie haben keine Art von Transportebene oder message- Level-Sicherheit für Ihre Bindung aktiviert? Welche Bindung verwendest du?

Wenn Sie Sicherheit auf Transportebene haben (normalerweise durch Verwendung von HTTPS über SSL), dann haben Sie einen verschlüsselten Punkt-zu-Punkt-Transportkanal, den ich für sehr sicher halten würde.

Wenn Sie die Sicherheit auf Nachrichtenebene auch mit einem Zertifikat auf dem Client haben und die gesamte Nachricht verschlüsseln, sollten Sie ebenfalls sicher sein.

Es kommt wirklich darauf an, welche Bindung Sie verwenden und welche Sicherheitseinstellungen Sie für diese Bindung verwenden. Zeig uns die Serverkonfiguration!

Marc

+0

Ich habe meinen Beitrag aktualisiert, um meine Konfiguration zu zeigen. Ich fühle mich immer noch mit all dem Zeug, also würde ich alle Nuggets der Weisheit schätzen! – AJM

+1

Ich würde denken, du solltest in Ordnung sein. Sie haben wsHttpBinding angegeben, und der Dienst authentifiziert sich mit einem Dienstzertifikat beim Client. Sie haben die Sicherheit auf Nachrichtenebene festgelegt. Dies bedeutet, dass alle Clients den öffentlichen Schlüssel des Dienstzertifikats verwenden, um ihre Nachrichten zu verschlüsseln, über die Verbindung zu senden, und da sie mit dem öffentlichen Schlüssel des Dienstes verschlüsselt sind Der private Schlüssel kann sie entschlüsseln. Ich denke, du solltest in Sicherheit sein. –

+0

danke für die Hilfe :-) – AJM

Verwandte Themen