about me

Xác thực Web Service bằng SOAP Header

| 25 thg 11, 2009

Xác thực Web Service bằng SOAP Header

Một công ty nọ bán cho khách hàng dịch vụ gửi tin nhắn của mình. Họ cung cấp dịch vụ web ASMX để khách hàng sử dụng gửi tin nhắn với số lượng nhiều trong cùng một lúc. Tình huống được đặt ra là họ muốn xác thực người dùng để kiểm soát xem ai thì có quyền sử dụng dịch vụ web và ai thì không. Một cách xác định đơn giản và thường thấy là khách hàng phải cung cấp thông tin cá nhân như là username & password, nếu trùng khớp với thông tin trong CSDL thì lệnh gửi tin nhắn được thực hiện, còn không thì dịch vụ web sẽ không hoạt động và báo lại rằng Invalid Account information.

Để giải quyết vấn đề này, giả sử như chúng ta - những lập trình viên, là nhân viên của công ty đó, được sếp yêu cầu là phải làm ra được một hệ thống xác thực người dùng như vậy. Về phương diện kỹ thuật, chúng là có thể đưa thêm username & password làm tham số trong mỗi hàm của dịch vụ web như sau:
Ví dụ:
_
Public Sub SendMessage(sendTo As String, message As String, username As String, password As String)


Với dịch vụ web có hàm trăm hàm, thì cách này tỏ ra không tổng quát và không khả thi. Bài viết này giới thiệu một phương pháp hợp lý và dễ thao tác hơn, đó là phương pháp đưa các thông tin xác thực vào trong SOAP (Simple Object Access Protocol) header.

Bước 1: Tạo ra một class chứa các thông tin xác thực:
' User must provide valid username and password in order to
' use web service functions
Public Class AuthHeader
    Inherits SoapHeader

    Public Username As String
    Public Password As String

End Class

Bước 2: Tạo một biến xác thực nằm trong dịch vụ web và ngang cấp với các hàm
Public Authentication As AuthHeader

Bước 3: Viết một hàm dùng để xác thực người dùng:
Private Sub TestAuthentication()

    If (Authentication Is Nothing) _
        OrElse (String.Compare(Authentication.Username, "admin", True) <> 0 OrElse Authentication.Password <> "password") _
    Then
        Throw New Exception("User authentication is not valid.")
    End If

End Sub

Với hàm xác thực mà chúng ta vừa viết thì chỉ những khách hàng có username "admin" và password "password" mới được cho phép vào trong.

Bước 4: Chỉnh sửa hàm SendMessage của chúng ta:
_
Public Sub SendMessage(sendTo As String, message As String)
    TestAuthentication()
    // Do the rest of the job
End Sub
Thông tin xác thực người dùng post lên sẽ được tự động lưu vào biến Authentication. Nếu người dùng không được xác minh thì dịch vụ web sẽ báo lỗi và không chạy tiếp phần tiếp theo.

Đến đây chúng ta xong phần xử lí trên server, bây giờ đến lượt lần client. Trước khi gửi yêu cầu lên server, phía client phải đính kèm thêm thông tin xác thực như sau:
_service = New Service("http://www.vcprojects.com/Message.asmx");
_service.AuthHeaderValue = New AuthHeader
_service.AuthHeaderValue.Username = "admin"
_service.AuthHeaderValue.Password = "password"
_service.SendMessage("0902891409", "you did a great job")

Hy vọng bài hướng dẫn này sẽ có ích cho các bạn. VitCon viết bằng VB.NET vì tỷ lệ sai sót khi code tay ngôn ngữ này thấp hơn là đối với C#. Ai không quen thì có thể lên http://www.developerfusion.com/tools/convert/vb-to-csharp/ để convert qua lại nha.

0 nhận xét:

Đăng nhận xét