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>
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
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. –
danke für die Hilfe :-) – AJM