2011-06-06 16 views
1

コンソールアプリケーションでホストされているssl/https Webサービスを作成しました。Silverlightでwcfのセキュリティ保護された自己ホストサービスを使用する

127.0.0.1:8741私は証明書を追加しました。私はエンドポイントとしてhttps://127.0.0.1:8741/MagazinService/を使用します。私は、Visual Studio Web Development ServerをSilverlight 4クライアントに使用しています。また、WebサービスをホストするコンソールアプリケーションはVisual Studioから起動されます。私はIISをまったく使用しません。私は正常にSilverlightクライアントにサービス参照を追加しましたが、サーバーから操作を呼び出すと、クロスドメインエラーが発生します。

私はclientaccesspolicy.xmlとcrossdomain.xmlについて読んで、このファイルをソリューション全体で追加しても機能しません。

私は立ち往生しています!助けてください!

コンソールアプリケーション(サーバ/ホスト)でapp.configを::

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="MagazinServiceBehavior" name="SOAP.MagazinVirtual"> 
    <endpoint address="" binding="customBinding" bindingConfiguration="MagazinServiceBinding" contract="SOAP.IMagazinVirtual"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="https://127.0.0.1:8741/MagazinService/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<bindings> 
    <customBinding> 
    <!-- buffer: 64KB; max size: 64MB --> 
    <binding name="MagazinServiceBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"> 
     <security authenticationMode="UserNameOverTransport" /> 
     <binaryMessageEncoding> 
     </binaryMessageEncoding> 
     <httpsTransport> 
     </httpsTransport> 
    </binding> 
    </customBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="MagazinServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <useRequestHeadersForMetadataAddress> 
     <defaultPorts> 
      <add scheme="https" port="443" /> 
     </defaultPorts> 
     </useRequestHeadersForMetadataAddress> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="SOAP.Validator, SOAP" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

ここ

ServiceReferences.ClientConfig

<configuration> 
<system.serviceModel> 
    <bindings> 
     <customBinding> 
      <binding name="CustomBinding_IMagazinVirtual"> 
       <security authenticationMode="UserNameOverTransport" includeTimestamp="true"> 
        <secureConversationBootstrap /> 
       </security> 
       <binaryMessageEncoding /> 
       <httpsTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
      </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://127.0.0.1:8741/MagazinService/" binding="customBinding" 
      bindingConfiguration="CustomBinding_IMagazinVirtual" contract="ServiceReference.IMagazinVirtual" 
      name="CustomBinding_IMagazinVirtual" /> 
    </client> 
</system.serviceModel> 

ここで私が使用するコードです

Silverlight Webプロジェクトのコードは次のとおりです。Web.config:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
      <binding name="CustomBinding_IMagazinVirtual"> 
       <security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport" 
        requireDerivedKeys="true" securityHeaderLayout="Strict" includeTimestamp="true" 
        keyEntropyMode="CombinedEntropy" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"> 
        <localClientSettings cacheCookies="true" detectReplays="false" 
         replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite" 
         replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00" 
         sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true" 
         timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" /> 
        <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00" 
         maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00" 
         negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00" 
         sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00" 
         reconnectTransportOnFailure="true" maxPendingSessions="128" 
         maxCachedCookies="1000" timestampValidityDuration="00:05:00" /> 
        <secureConversationBootstrap /> 
       </security> 
       <binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
        maxSessionSize="2048"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       </binaryMessageEncoding> 
       <httpsTransport manualAddressing="false" maxBufferPoolSize="524288" 
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous" 
        bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" 
        keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous" 
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" 
        useDefaultWebProxy="true" requireClientCertificate="false" /> 
      </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://127.0.0.1:8741/MagazinService/" binding="customBinding" 
      bindingConfiguration="CustomBinding_IMagazinVirtual" contract="ServiceReference.IMagazinVirtual" 
      name="CustomBinding_IMagazinVirtual" /> 
    </client> 
</system.serviceModel> 

これはclientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="*"> 
     <domain uri="http://*" /> 
     <domain uri="https://*" /> 
     </allow-from> 
     <grant-to> 
     <resource path="/" include-subpaths="true" /> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

ためのコードであり、これは、私はこれで苦労していたcrossdomain.xml

<?xml version="1.0" encoding="utf-8" ?> 
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="SOAPAction" secure="true" /> 
</cross-domain-policy> 

するためのコードで、助けてください!

答えて

0

あなたのサイトのルートにあるファイル名の呼び出しが行われたときにxmlを返すサービスを追加する必要があります。これはSilverlightの処理と同じです。

host.name.com/clientaccesspolicy.xmlへの要求が行われたときにIISが提供するので、実際のファイルを持つIISでホストされていると十分です。自己ホスティングがデフォルトでは行われないので、この呼び出しが行われたときにXMLが正しく返されるようにするために、追加する必要があります。

<service name="CrossDomainService"> 
    <endpoint address="" behaviorConfiguration="CrossDomainServiceBehavior" binding="webHttpBinding" bindingConfiguration="" contract="ICrossDomainService"></endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8732/"/> 
     </baseAddresses> 
    </host> 
    </service> 


    <endpointBehaviors> 
    <behavior name="CrossDomainServiceBehavior"> 
     <webHttp/> 
    </behavior> 

これはで私の作品:その後、実装

[ServiceContract] 
public interface ICrossDomainService 
    { 
    [WebGet (UriTemplate = "clientaccesspolicy.xml")] 
    Stream ProvidePolicyFile(); 

    [WebGet (UriTemplate = "crossdomain.xml")] 
    Stream ProvideDomainFile(); 
    } 

public class CrossDomainService : ICrossDomainService 
    { 
    #region ICrossDomainService Members 

    public Stream ProvidePolicyFile() 
     { 
     string result = 
      @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers=""*""> 
     <domain uri=""*""/> 
     </allow-from> 
     <grant-to> 
     <resource include-subpaths=""true"" path=""/""/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy>"; 

     WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 

     return new MemoryStream (Encoding.UTF8.GetBytes (result)); 
     } 

    public Stream ProvideDomainFile() 
     { 
     string result = 
      @"<?xml version=""1.0""?> 
<!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd""> 
<cross-domain-policy> 
    <allow-access-from domain=""*"" /> 
</cross-domain-policy>"; 

     WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 

     return new MemoryStream (Encoding.UTF8.GetBytes (result)); 
     } 

    #endregion 
    } 

は、その後、あなたのサイトのルートに実装をホストし

サービス・インターフェースを作成します自己ホスト環境

+0

私はこの新しいサービスを作成しました。私は今何をしなければならないのですか?新しく作成されたサービスを指し示すSilverlightクライアントにサービス参照を追加する必要がありますか? CrossDomainServiceからメソッドを呼び出す必要がありますか?セキュリティ保護された最初のサービスはhttps://127.0.0.1:8741にあり、私が今作成したサービスはhttp:// localhost:8732でリッスンしています。これは大丈夫ですか? – lex87

+0

私は新しい作成されたサービスへの参照を追加しました。今や、完了したイベントは、保護されたサービスからメソッドを呼び出した後に起動されたようですが、私はまだ同じクロスドメイン例外を持っています。私は何が間違っているのか分かりません。 – lex87

+0

何もする必要はありません。彼らは私が思うのと同じポートで走っているはずです。 8741で実行するようにクロスドメインサービスを変更してみてください。 –

関連する問題