WCT RESTサービスを公開しようとしています。有効なユーザー名とパスワードを持つユーザーのみがアクセスできます。ユーザー名とパスワードはSQLデータベースに保存されます。ここでWebClientからWCF RESTサービスにユーザー資格情報を渡すにはどうすればよいですか?
は、サービス契約である:ここで
public interface IDataService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
byte[] GetData(double startTime, double endTime);
}
は、WCFの設定です:
<bindings>
<webHttpBinding>
<binding name="SecureBinding">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DataServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"CustomValidator, WCFHost" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="DataServiceBehavior" name="DataService">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="SecureBinding" contract="IDataService" />
</service>
</services>
私は、Silverlightアプリケーション内WebClientクラスを介してサービスにアクセスしています。しかし、私はどのようにユーザーの資格情報をサービスに渡すかを理解できませんでした。私はclient.Credentialsのために様々な値を試しましたが、それらのどれもカスタムバリデーターのコードをトリガーしていないようです。次のエラーが表示されます。基になる接続が閉じられました:送信時に予期しないエラーが発生しました。
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("name", "password", "domain");
client.OpenReadCompleted += new OpenReadCompletedEventHandler(GetData);
client.OpenReadAsync(new Uri(uriString));
を私はNoneにセキュリティモードを設定した場合、全部の作品:ここ
は、私が試してみましたいくつかのサンプルコードです。私も他のclientCredentialType値を試してみましたが、どれもうまくいきませんでした。私はまた、サービスがチャンスを得る前に、ユーザーを認証しようとするIISに関連する問題を解消するために、WCFサービスを自己ホストしました。
根本的な問題が何であるかに関するご意見は大変ありがたいです。ありがとう。
更新:Mehmetの優れた提案に感謝します。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IdentityModel" switchValue="Information,
ActivityTracing" propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\Traces.svclog" />
</sharedListeners>
</system.diagnostics>
しかし、Silverlightクライアントからのメッセージは表示されませんでした。 httpsとhttpについては、次のようにhttpsを使用しました。
string baseAddress = "https://localhost:6600/";
_webServiceHost = new WebServiceHost(typeof(DataServices),
new Uri(baseAddress));
_webServiceHost.Open();
ただし、私はSSL証明書を設定しませんでした。これは問題ですか?
アレックスでは、セキュアトランスポートチャネル(https)を使用するようにサービスを設定する必要があります。クライアントとサーバーのバインディングは一致する必要があります。 IISでサービスをホストする場合は、サイト用にSSLを構成する必要があります。詳細を知るには、トレースの冗長性を高める必要があるかもしれません。オプションを見てみましょう。 Service Configuration Editorを使用すると、WCF設定を簡単に編集できます。 –
メフメット、ありがとう。ベースアドレスURI内でhttpsを使用するように私のサービスを設定しました。 WebClientインスタンスの場合、同じアドレスを「https」(https:// localhost:6600)と指定しました。これらは間違っていますか?どのようにそれらを設定しますか?トレースについては、すべてを記録するVerboseに設定しました。それはより多くのものをログに記録しましたが、私はSilverlightクライアントから何も来ていません。ありがとう。 –
WCFはクライアントサイド、特にバインディングでどのように設定されていますか? SSLのためにIISとサービスを構成しましたか? –