2013-08-06 16 views
5

Dokładnie teraz, mam moje uwierzytelniania WebService ale robiłem to wywołanie metody wewnątrz WebMethod, tak:WebService Główki Authentication

[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); 
      } 
     } 

chcę teraz uwierzytelniać to WebMethod bez nazywają „LoginAuthentication () ", używając tylko nagłówka SOAP - SoapHeader (" LoginSoapHeader ") - znajdującego się powyżej kodu.

Następnie, moje pytanie brzmi, w jaki sposób mogę uwierzytelnić mój WebMethod tylko za pomocą nagłówków?

Z góry dziękuję.

+0

Czy * naprawdę potrzebne * jest użycie starego protokołu SOAP? Istnieje wiele alternatyw, które używają tylko HTTP. Na przykład Web API, który jest cienki, elastyczny i pozwala na łatwe wdrażanie różnych scenariuszy uwierzytelniania (patrz [tutaj] (http://www.asp.net/web-api/overview/security)). – Oleg

+0

Nie jest to naprawdę potrzebne, ale chcę się tego nauczyć za pomocą SOAP. – guisantogui

+0

Moim zdaniem SOAP nie działa. Myślę więc, że nauka SOAP jest bliska pracy autopsisty. Czy podążasz za czystymi celami edukacyjnymi lub masz jakiś problem, który próbujesz wdrożyć za pomocą SOAP? – Oleg

Odpowiedz

11

Wymaganiem jest podanie przez klienta usługi internetowej nazwy użytkownika i hasła podczas uzyskiwania dostępu do metod internetowych.

Zamierzamy to osiągnąć przy użyciu niestandardowych nagłówków nie mydło nagłówkach HTTP

.NET Framework umożliwia tworzenie niestandardowych nagłówków SOAP przez pochodzący z klasy SoapHeader, więc chcieliśmy, aby dodać nazwę użytkownika i hasło

using System.Web.Services.Protocols; 

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

aby wymusić korzystanie z naszego nowego nagłówka SOAP musimy dodać następujący atrybut do metody

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

Include th e nazwa klasy w .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; 
}    
} 

możemy uwierzytelnić używając mydła: elementu nagłówka żądania SOAP, nie rozumieją nagłówki HTTP wysyłanych z żądaniem. Żądanie SOAP wygląda tak:

<?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

Jeśli korzystasz z członkostwa, użyj następującego wiersza do sprawdzenia poprawności użytkownika: Membership.ValidateUser (Authentication.Username, Authentication.Password) –

+0

@AtronSeige - Tak, masz rację! –

+0

@AtronSeige - Jeśli uważasz, że moja odpowiedź jest przydatna ... możesz odpowiedzieć na moją odpowiedź, dzięki czemu osoby sprawdzające odpowiedź będą znały użyteczność odpowiedzi. Dzięki –