Androidの安全なWCFサービス用のMonoの状態はどうなっていますか?まだSOAP1.2までですか?WCFサービスと対話するAndroidアプリのPOCを作成していますが、機能させるのに苦労しています。
セキュリティのあるサービスに接続しようとしていTransportWithMessageCredential
ます。ただし、サーバー側でエラーが発生します。
これはサーバー側のエラーです:
MessageSecurityException:セキュリティプロセッサがメッセージ内のセキュリティヘッダーを見つけることができませんでした。これは、メッセージがセキュリティで保護されていない障害であるか、通信するパーティ間にバインディングの不一致があることが原因である可能性があります。これは、サービスがセキュリティ用に構成されていて、クライアントがセキュリティを使用していない場合に発生する可能性があります。
サーバー構成:
<service name="BrandDirector.ApplicationServer.Core.Services.UI.Products.Specifications.IngredientService"
behaviorConfiguration="CredentialValidation">
<endpoint address="/BasicHttp"
binding="basicHttpBinding"
bindingConfiguration="BDBasicHttpBindingWithSecurity"
contract="BrandDirector.ApplicationServer.Core.Services.UI.Products.Specifications.IIngredientService" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
<behavior name="CredentialValidation">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<HttpStatusCode200Behavior />
<serviceCredentials type="BrandDirector.ApplicationServer.Core.Security.Authentication.PasswordServiceCredentials, BrandDirector.ApplicationServer.Core.Security, Version=1.0.0.0, Culture=neutral">
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="BrandDirector.ApplicationServer.Core.Security.CredentialValidator, BrandDirector.ApplicationServer.Core.Security" />
</serviceCredentials>
</behavior>
<extensions>
<behaviorExtensions>
<add name="HttpStatusCode200Behavior" type="BrandDirector.ApplicationServer.Core.Services.Common.ServiceModel.HttpStatusCode200BehaviorExtension, BrandDirector.ApplicationServer.Core.Services.Common" />
</behaviorExtensions>
<basicHttpBinding>
<binding name="BDBasicHttpBindingWithSecurity" messageEncoding="Text" maxReceivedMessageSize="655536">
<security mode="TransportWithMessageCredential" >
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>
</extensions>
クライアントコード:
public class Activity1 : Activity
{
private Button button;
const string address = "https://.../IngredientService.svc/BasicHttp";
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
var timeout = new TimeSpan(0, 1, 0);
var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential)
{
MessageEncoding = WSMessageEncoding.Text,
Security =
{
Transport =
{
ClientCredentialType = HttpClientCredentialType.None,
ProxyCredentialType = HttpProxyCredentialType.None
},
Message =
{
ClientCredentialType = BasicHttpMessageCredentialType.UserName,
}
},
HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
MaxReceivedMessageSize = 655536,
ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas
{
MaxArrayLength = 655536,
MaxStringContentLength = 655536,
},
SendTimeout = timeout,
OpenTimeout = timeout,
ReceiveTimeout = timeout,
};
System.Net.ServicePointManager.ServerCertificateValidationCallback += OnServerCertificateValidationCallback;
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate
{
client = new IngredientServiceClient(binding, new EndpointAddress(address));
var clientCredential = client.ClientCredentials.UserName;
clientCredential.UserName = "admin";
clientCredential.Password = "KDNSG7";
client.BeginGetIngredients("e", callBack, null);
};
}
IngredientServiceClient client;
private void callBack(IAsyncResult ar)
{
var result = client.EndGetIngredients(ar);
button.Text = result.First().Name;
}
private bool OnServerCertificateValidationCallback(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
}
このコードはWPFで正常に機能し、結果が返され、すべてが正常に行われます。古いスレッドから、WCFはまだ開発サイクルの初期段階にあることがわかりますが、最初に何か間違ったことをしているのではないかと確認したいだけです。