2013-08-06 43 views
5

Chính xác bây giờ, tôi đã xác thực webservice của tôi, nhưng tôi đã làm điều này gọi một phương thức bên trong WebMethod, như thế này:WebService Headers Xác thực

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

Tôi muốn ngay bây giờ để xác thực WebMethod này mà không gọi là "LoginAuthentication () "phương thức, chỉ sử dụng tiêu đề SOAP - SoapHeader (" LoginSoapHeader ") - ở trên bên trong mã.

Sau đó, câu hỏi của tôi là làm thế nào tôi có thể xác thực WebMethod của tôi chỉ bằng cách sử dụng tiêu đề?

Xin cảm ơn trước.

+0

Có * thực sự cần thiết * để sử dụng giao thức SOAP cũ? Có rất nhiều lựa chọn thay thế chỉ sử dụng HTTP. Ví dụ: Web API mỏng, linh hoạt và cho phép dễ dàng triển khai các kịch bản xác thực khác nhau (xem [tại đây] (http://www.asp.net/web-api/overview/security)). – Oleg

+0

Không thực sự cần thiết, nhưng tôi muốn học cách làm điều này bằng cách sử dụng SOAP. – guisantogui

+0

Theo quan điểm của tôi, SOAP đã chết. Vì vậy, tôi nghĩ rằng việc học SOAP gần với công việc của người khám nghiệm tử thi. Bạn có làm theo các mục tiêu giáo dục thuần túy hay bạn có một số vấn đề mà bạn cố gắng thực hiện bằng cách sử dụng SOAP? – Oleg

Trả lời

11

Yêu cầu là ứng dụng khách dịch vụ web phải cung cấp tên người dùng và mật khẩu khi truy cập các phương pháp web.

Chúng ta sẽ đạt được điều này bằng các tiêu đề xà phòng tùy chỉnh không phải là tiêu đề http

.NET Framework cho phép bạn tạo tiêu đề SOAP tùy chỉnh bằng cách bắt nguồn từ lớp SOAPHeader, vì vậy chúng tôi muốn thêm một tên người dùng và mật khẩu

using System.Web.Services.Protocols; 

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

để buộc việc sử dụng các header SOAP mới của chúng tôi, chúng ta phải thêm thuộc tính sau cho phương thức

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

Bao gồm thứ e tên lớp trong 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; 
}    
} 

chúng tôi xác thực bằng cách sử dụng xà phòng: yếu tố Header trong một yêu cầu SOAP, đừng hiểu lầm các tiêu đề HTTP gửi với yêu cầu. Yêu cầu SOAP trông giống như sau:

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

Nếu bạn đang sử dụng tư cách thành viên, hãy sử dụng dòng sau để xác thực người dùng: Membership.ValidateUser (Authentication.Username, Authentication.Password) –

+0

@AtronSeige - Có bạn đã đúng! –

+0

@AtronSeige - Nếu bạn nghĩ câu trả lời của tôi là hữu ích ... bạn có thể upvote câu trả lời của tôi để người trả lời sẽ biết khả năng sử dụng của câu trả lời.Cảm ơn –

Các vấn đề liên quan