1

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はまだ開発サイクルの初期段階にあることがわかりますが、最初に何か間違ったことをしているのではないかと確認したいだけです。

4

4 に答える 4

2

バインディングの不一致があってもサービスを機能させるには、

<security mode="TransportWithMessageCredential" enableUnsecuredResponse="true"  >
   <message clientCredentialType="UserName" />
 </security>

上記の例のwebconfig全体を追加の変更とともに含めました

 <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" enableUnsecuredResponse="true"  >
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</extensions>
于 2012-05-30T22:15:32.143 に答える
2

現時点では、MonoTouchはWS-Securityプロトコルをサポートしていません。これにより、クライアントはSOAPメッセージエンベロープ内で資格情報を送信できます。ただし、MonoTouchは、適切なClientCredentialTypeを指定することにより、HTTP基本認証資格情報をサーバーに送信する機能をサポートしています。

このページを参照してください:http: //docs.xamarin.com/android/guides/Application_Fundamentals/Introduction_to_Web_Services

于 2012-11-01T21:54:21.900 に答える
0

RestSharpと、サーバー側で認証されるカスタム認証ヘッダーの内容を使用しました。

于 2012-07-05T08:41:28.217 に答える
0

私の場合、host configファイルのaudienceUrisタグにサービスを追加すると、同じ例外で問題が修正されました。

<system.identityModel>
...
    <identityConfiguration>
    ...
        <audienceUris>
            <add value="serviceName.svc" />
        </audienceUris>
    ...
    </identityConfiguration>
...
</system.identityModel>
于 2014-12-11T15:47:58.017 に答える