PDA

View Full Version : Chứng thực tài khoản Joomla trên ứng dụng ASP.NET



TheShinichi
15-11-2009, 07:14 PM
Chứng thực tài khoản Joomla trên ứng dụng ASP.NET


Xin chào các bạn,

Ắt hẳn mới đọc qua tiêu đề, một số bạn đã từng nghiên cứu qua Joomla (http://shinichi.microsync.net/blog/go.php/tags/joomla/) và ASP.NET (http://shinichi.microsync.net/blog/go.php/tags/asp-net/) sẽ ồ lên ngạc nhiên chăng ? Bởi vì Joomla được phát triển trên ngôn ngữ PHP (http://shinichi.microsync.net/blog/go.php/tags/php/), còn ASP.NET là một ngôn ngữ có rất nhiều khác biệt so với PHP. Mặt khác, môi trường vận hành chúng lại là hai đối thủ truyền kiếp, PHP chủ yếu chạy trên hệ điều hành Linux (http://shinichi.microsync.net/blog/go.php/tags/linux/) còn ASP.NET lại chạy trên hệ điều hành Windows (http://shinichi.microsync.net/blog/go.php/tags/windows/). Tuy nhiên, chủ đề tôi nêu lên trong bài viết này, ngược lại có lẽ không xa lạ với một số ít bạn đã trải qua trong thực tế. Một vài người bạn của tôi, trước kia có hỏi tôi một câu hỏi tương tự như tiêu đề bài viết trên kia: "Làm sao chứng thực tài khoản Joomla trên ASP.NET ?". Ở thời điểm đó, tôi không có nhu cầu "kỳ quặc" như vậy nên cũng không chú tâm tìm hiểu về nó.

Cho đến cách đây gần 2 tháng, tôi nhận phát triển một website như sau: Website này dùng Joomla và đã chạy được vài tháng - điều này có nghĩa cơ sở dữ liệu (http://shinichi.microsync.net/blog/go.php/tags/database/) đã có bài viết, chủ đề, chuyên mục, thành viên, bình chọn, phản hồi,.... Chủ xị, à nhầm :)), chủ nhân của website muốn thay đổi "bộ mặt" của trang web này (tức là phần Front-End (http://shinichi.microsync.net/blog/go.php/tags/front-end/)) nhưng vẫn giữ lại phần quản trị (Back-End (http://shinichi.microsync.net/blog/go.php/tags/back-end/)) của Joomla vì đã quen thao tác với nó, tất nhiên cơ sở dữ liệu cũng phải được giữ lại luôn. Nhưng "ác" một nỗi, cái phần Front-End đấy được yêu cầu phải viết bằng ASP.NET.

Lúc ấy, tôi thấy đây là một project (http://shinichi.microsync.net/blog/go.php/tags/project/) dễ (hơi chủ quan ) vì chỉ mỗi việc không phải viết phần Back-End đã giúp rút ngắn thời gian phát triển xuống nhiều lần rồi. Quả vậy, tôi chỉ mất áng chừng 1 tháng để viết hoàn tất theo yêu cầu. Nhưng bất ngờ vào thời điểm gần cuối, tôi nhận ra vấn đề là : làm sao người dùng, quản trị viên, có thể đăng nhập vào website (http://shinichi.microsync.net/blog/go.php/tags/website/) ? Tất nhiên đối với quản trị viên, họ có thể không cần đăng nhập ở trang chủ mà chỉ cần đăng nhập ở trang back-end của Joomla. Còn người dùng ? Họ muốn đăng nhập để viết phản hồi, bình chọn, thì sao ? Tôi tưởng chừng như đã chết vào phút 89...

Ngoài lề : Cấu trúc mật khẩu của Joomla

Hãy xem mật khẩu của tài khoản Joomla được lưu trong CSDL (http://shinichi.microsync.net/blog/go.php/tags/csdl/):

f4f6b82bb566d38abc17acba97a3aa3b:KoRzoQ0vbYbsnvR9B ZiEtD1yoYlBWQbz

Như chúng ta thấy, mật khẩu Joomla rõ ràng là một chuỗi hash (http://shinichi.microsync.net/blog/go.php/tags/hash/), nhưng tại sao lại dài quá vậy ? Hãy để ý kỹ một chút, chúng ta sẽ thấy có một dấu hai chấm ở giữa chuỗi này. Sau khi phân tách ra, chúng ta có:


f4f6b82bb566d38abc17acba97a3aa3b

KoRzoQ0vbYbsnvR9BZiEtD1yoYlBWQbz


Vậy thông tin trong chuỗi này là gì ? Đừng quên Joomla là một ứng dụng web open source (http://shinichi.microsync.net/blog/go.php/tags/open-source/), vậy hãy đơn giản là mở source nó ra xem. Theo tôi biết, Joomla có một lớp Joomla.User.Helper (http://shinichi.microsync.net/blog/go.php/tags/joomla-user-helper/) (/joomla/libraries/joomla/user/helper.php). Tôi xin phép không trích dẫn ra đây, vì nếu bạn đang nghiên cứu về Joomla thì ắt hẳn trong tay bạn phải có sẵn bộ source của nó rồi. Từ đó, chúng ta phác hoạ được quá trình tạo password của Joomla như sau:

http://img.photobucket.com/albums/v103/shinichi/tut/auth-joomla/PHP-Joomla-User-Helper.png

http://img.photobucket.com/albums/v103/shinichi/tut/auth-joomla/Jooma-User-Helper-Generate-PW.png

Trong tuần cuối cùng của hạn giao project, tôi dành gần hết thời gian của mình trên Google. Tôi thử mọi từ khoá mà mình có thể nghĩ ra. Tôi lang thang khắp các diễn đàn về tin học trong và ngoài nước. Hầu hết không có thông tin nào giá trị khả dĩ giúp tôi giải quyết được vấn đề. Thậm chí, tôi đã từng nghĩ đến cách là sử dụng phần Back-end của Joomla để authenticate rồi trả kết quả về cho trang ASP.NET của tôi xử lý:

http://img.photobucket.com/albums/v103/shinichi/tut/auth-joomla/PHP-Authentication-Joomla-User.png

Nhưng cách này không thực sự làm tôi vừa ý ! Sự "trộn lẫn" giữa hai ngôn ngữ không cùng một nền tảng, môi trường vận hành không phải là một ý hay. Nó sẽ dẫn tới nhiều hệ luỵ, phiền toái về sau. Thật may mắn, cuối cùng tôi đã nhận được nhiều sự trợ giúp, và một trong số đó đã góp phần tạo nên bài viết này. Hãy xem đoạn code dưới đây:

http://img.photobucket.com/albums/v103/shinichi/tut/auth-joomla/Joomla-Authentication-Class.png


Bạn cảm thấy thế nào ? Nó đơn giản đến không ngờ phải không ? Đến đây, bạn chỉ cần viết thêm một số hàm xử lý thao tác đăng nhập, đăng xuất, đổi mật khẩu, reset mật khẩu, tạo mới user,... là công việc đã hoàn tất.

Đó là cách của tôi, còn bạn có giải pháp nào khác muốn chia sẻ cùng mọi người không ?


P/s: Nếu bạn đăng lại bài viết này (http://shinichi.microsync.net/blog/go.php/tags/copyright/) trên website hoặc blog (http://shinichi.microsync.net/blog/go.php/tags/blog/) của bạn, đừng quên ghi rõ nguồn gốc (http://shinichi.microsync.net/blog/post/Chung-thuc-tai-khoan-Joomla-tren-ung-dung-ASP-NET.php) (http://shinichi.microsync.net/blog/post/Chung-thuc-tai-khoan-Joomla-tren-ung-dung-ASP-NET.php) nhé ! Xin cảm ơn !