verbrauchen webservice mittels https-Protokoll
Entwickle ich eine Anwendung, wo ich Sie zu verbrauchen webservice in Java entwickelt mit http-Protokoll.
ich bin der Entwicklung der Anwendung verwenden C#.NET winforms.alles funktioniert einwandfrei tillnow.aber der webservice ist nun mit ssl-Sicherheit, damit Sie die Dienst-url-Protokoll geändert von http zu https.jetzt bin ich fcing die Probleme beim Zugriff auf die https-webservice.
ich habe versucht, den Zugriff auf die https-webservice von der SoapUI, indem Sie die Authenticaion Parameter (Benutzername und Passwort) aus der Auth-Registerkarte, wie unten gezeigt:
Es ist in Ordnung, die von SoapUI.
aber wen ich die Authenticaion Parameter aus dem code, wie unten seine nicht funktioniert:
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "*******";
Ich bin mit Sicherheit Modus : TransportWithMessageCredential
und
ClientCredentialTtype
als : Basic
Meine App.Config
- Datei ist wie folgt:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint address="https://xyz:8001/HelloWorldAPI/HelloWorldWebService"
binding="wsHttpBinding"
bindingConfiguration="myhttpsbinding" contract="API.HelloWorldWebService"
name="HelloWorldWebServicePort" />
</client>
<bindings>
<wsHttpBinding>
<binding name="myhttpsbinding">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
<system.net>
<defaultProxy useDefaultCredentials="true" />
</system.net>
</configuration>
Mein Code wie folgt:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using testingtool.API;
namespace testingtool
{
class Program
{
static void Main(string[] args)
{
new APITool();
}
}
class APITool
{
UserInfo userinfo = new UserInfo();
HelloWorldWebServiceClient client = new HelloWorldWebServiceClient();
private bool ValidationCallBack(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}
public APITool()
{
try
{
//Authentication parameters
client.ClientCredentials.UserName.UserName = "admin";
client.ClientCredentials.UserName.Password = "*****";
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidationCallBack);
//client ClientCredentials @ Application level
userinfo.userid = "myusername";
userinfo.password = "*****";
GetHelloWorldAPIVersionRequest request = new GetHelloWorldAPIVersionRequest();
APIVersionInfo versioninfo = new APIVersionInfo();
versioninfo.userinfo = userinfo;
request.APIVersionInfo = versioninfo;
APIVersionInfoResponse response = client.GetHelloWorldAPIVersion(versioninfo);
Console.WriteLine(response.Version);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}
Ich bin immer folgende exception:
System.ServiceModel.Sicherheit.MessageSecurityException: HTTP
- Anforderung ist nicht autorisierte mit client-Authentifizierungsschema "Anonym".
Der authentication header vom server empfangen wurde 'Basic
realm="EJBServiceEndpointServlet Reich"'. --->
System.Net.WebException: Der Remoteserver hat einen Fehler zurückgegeben: (401)
Unberechtigte.
EDIT: vom client habe ich überprüft mit Fiddler die request-Fenster, wie unten:
aus der AUth-tab es ist zu sagen, dass es keine Autherization Header vorhanden.
Fiddler Raw Anfrage wie folgt:
CONNECT 10.10.10.110:8001
HTTP/1.1 Host: 10.10.10.110:8001
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
jede Hilfe, die möglichen sehr geschätzt.
- Können Sie bestätigen, dass auf dem server, der die Anfrage kommt, wie HTTPS? Vielleicht mit Fiddler, können Sie extrahieren Sie die eigentliche Nachricht gesendet.
- Vielen Dank für Ihre Antwort,von der client-Seite habe ich versucht mit fiddler , ich bin immer Fehler 401.bitte siehe meinen bearbeiteten post.
- Also wenn ich das richtig verstehe haben wir klar, dass dies ein client problem? Dass die Regeln aus der server-Seite.
- Okay, Danke,so, jetzt könnte Sie bitte führe mich bei der Lösung dieses Problems.
- Wenn ich die Antwort wusste, ich würde auf jeden Fall posten. WCF ist so schwer zu diagnostizieren. Wenn ich noch etwas Zeit übrig haben, ich werde in diesem tiefer.
- Danke somuch.wenn Sie keine Ahnung hat bitte nicht vergessen zu beantworten, danke.
- Da sind Sie mit "TransaportWithMessageCredentials" sollten Ihre security-element so etwas wie dieses : <security mode="Message"> <message clientCredentialType="UserName"/> </Sicherheits - >
- wenn ich, dass es wirft dann die exception :
The provided URI scheme 'https' is invalid; expected 'http'.
- Da könnten Sie den Zugriff auf den service von SOAPUI kann man vergleichen die raw-Anfrage von SOAPUI mit, dass Ihre client-Anwendung mit Fiddler
- Vielen Dank für Ihre Antwort.ich brauche, um zu überprüfen, dass, ich werde das überprüfen und lassen Sie wissen.
- Haben Sie demo-server-side-code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage mich, ob das Problem könnte mit der Bindung, obwohl das sicher schwer zu sagen ohne überprüfung der service-Konfiguration, oder sehen die erfolgreiche soapUI Anfrage. (Hinweis: Sie können einen Ausschnitt aus der Nachricht, einschließlich der soap-header, die von der soapUI-HTTP-Protokoll.)
In jedem Fall, möchten Sie vielleicht, um sicherzustellen, dass der service wirklich mit ws-security (message-level security) verwenden, indem Sie versuchen, die folgenden binden:
Sollten Sie Ihre app-config:
Auf transport-Ebene haben Sie keine Authentifizierung, so
<transport clientCredentialType="None" />
und auf message-Ebene haben Sie die Benutzername|Passwort-Authentifizierung, so<message clientCredentialType="UserName"
System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Basic realm="EJBServiceEndpointServlet Realm"'. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.
SOAP UI
es funktioniert gut.ich glaube, ich mustbe fehlt etwas sehr Grundsätzliches.http
url funktioniert es einwandfrei.useDefaultCredentials
Eigenschafttrue
.Tunneling to circumvent firewall policy
gehst du über einen proxy-server? Wenn ja, werden die eingegebenen Daten in IE ? Sind Sie in der Lage zu durchsuchen https-Seiten im IE? Wenn ja, dies sollte abgeholt werden, die von jedem
WebRequest
macht eine https-Aufruf, wie es braucht, um ein ProblemCONNECT
an den proxy-server (was Ihr tut), aber in Ihrem Aufruf dieProxy-Authorization
- header fehlt. Dies sollte Ihre Fokus - versuchen Sie, einen einfachenWebRequest
zu sagen, https://google.com und sehen, was Sie bekommen in fiddler.Haben Sie möglicherweise ein Problem bei Ihrer proxy-server-Weiterleitung auf Ihre Anfrage. Sind Sie in der Lage, um zu versuchen, von https auf einem anderen Netzwerk befindet sich nicht hinter einem proxy?
Vielleicht dieser link helfen können.
Es erklärt, wie zu konfigurieren, die Ihren Endpunkt im Fall von REST/SOAP WebServices
Kann nicht call web service mit basic-Authentifizierung mithilfe von WCF
Seine verbindliche Ausgabe, die Sie verwenden müssen, um benutzerdefinierte Bindung hier ist Beispiel.
http://webservices20.blogspot.com/