2013-08-06 20 views
5

Genau jetzt, habe ich meine Webservice-Authentifizierung, aber ich habe diesen Aufruf einer Methode innerhalb WebMethod getan, wie folgt aus:WebService-Header-Authentifizierung

[WebMethod] 
[SoapHeader("LoginSoapHeader")] 
public int findNumberByCPF(string cpf) 
     { 
      try 
      { 
       LoginAuthentication(); 
       var retRamal = DadosSmp_Manager.RetornaRamalPorCPF(cpf); 
       var searchContent= String.Format("CPF[{0}]", cpf); 
       DadosSmp_Manager.insertCallHistory(retRamal, searchContent); 

       return retRamal.Ramal; 
      } 
      catch (Exception ex) 
      { 
       Log.InsertQueueLog(Log.LogType.Error, ex); 
       throw getException(ex.TargetSite.Name, cpf); 
      } 
     } 

ich jetzt möchte diese WebMethod authentifizieren, ohne dass die „LoginAuthentication nennen () "Methode, nur mit der SOAP-Header - SoapHeader (" LoginSoapHeader ") - das ist oben im Code.

Dann ist meine Frage, wie kann ich meine WebMethod nur mithilfe von Headern authentifizieren?

Vielen Dank im Voraus.

+0

Ist es * wirklich nötig * jetzt altes SOAP-Protokoll zu verwenden? Es gibt viele Alternativen, die nur HTTP verwenden. Zum Beispiel Web-API, die schlank und flexibel ist und die einfache Implementierung verschiedener Authentifizierungsszenarien ermöglicht (siehe [hier] (http://www.asp.net/web-api/overview/security)). – Oleg

+0

Nicht wirklich benötigt, aber ich möchte lernen, wie dies mit SOAP zu tun. – guisantogui

+0

Meiner Meinung nach ist SOAP tot. Ich denke also, dass das Lernen von SOAP dem Job von Autopsist nahe kommt. Folgst du reinen Bildungszielen oder hast du ein Problem, das du mit SOAP zu lösen versuchst? – Oleg

Antwort

11

Voraussetzung ist, dass der Web-Service-Client beim Zugriff auf die Web-Methoden Benutzernamen und Passwort angeben muss.

Wir werden diese mit benutzerdefinierten SOAP-Header nicht die HTTP-Header

Das .NET-Framework erreichen können Sie benutzerdefinierte SOAP-Header von der Soapheader-Klasse abgeleitet schaffen, so wollten wir einen Benutzernamen und ein Passwort hinzufügen

using System.Web.Services.Protocols; 

public class AuthHeader : SoapHeader 
{ 
public string Username; 
public string Password; 
} 

um die Verwendung unserer neuen SOAP-Header erzwingen wir das folgende Attribut der Methode

[SoapHeader ("Authentication", Required=true)] 

th hinzufügen müssen Include e Klassenname in CS-

public AuthHeader Authentication; 


[SoapHeader ("Authentication", Required=true)] 
[WebMethod (Description="WebMethod authentication testing")] 
public string SensitiveData() 
{ 

//Do our authentication 
//this can be via a database or whatever 
if(Authentication.Username == "userName" && 
      Authentication.Password == "pwd") 
{ 
    //Do your thing 
    return ""; 

} 
else{ 
    //if authentication fails 
    return null; 
}    
} 

authentifizieren wir die Seife: Kopfelement in einer SOAP-Anforderung, nicht falsch verstehen die HTTP-Header mit der Anfrage gesendet. Die SOAP-Anfrage sieht in etwa wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Header> 
    <AUTHHEADER xmlns="http://tempuri.org/"> 
    <USERNAME>string</USERNAME> 
    <PASSWORD>string</PASSWORD> 
    </AUTHHEADER> 
</soap:Header> 
    <soap:Body> 
    <SENSITIVEDATA xmlns="http://tempuri.org/" /> 
    </soap:Body> 
</soap:Envelope> 
+2

Wenn Sie Mitgliedschaft verwenden, verwenden Sie die folgende Zeile, um den Benutzer zu überprüfen: Membership.ValidateUser (Authentication.Username, Authentication.Password) –

+0

@AtronSeige - Ja, Sie haben Recht! –

+0

@AtronSeige - Wenn Sie denken, dass meine Antwort nützlich ist ... könnten Sie meine Antwort verbessern, so dass die Antwortsucher die Verwendbarkeit der Antwort wissen werden. Danke –