2008-11-21 15 views
5

Tôi đang sử dụng xác thực tùy chỉnh của riêng mình với IIS và tôi muốn máy chủ trên mỗi lần tải trang (bất kể loại tệp nào) trước tiên hãy kiểm tra biến Ứng dụng để xem liệu người dùng có được xác thực và được ủy quyền xem trang web hay không . Trong global.asax, điều này có thể là:lựa chọn thay thế nào để sử dụng global.asax?

void Application_Start(Object Sender, EventArgs e) 
{ 
    if(Application["username"] == null) 
    { 
    Response.redirect("login.aspx"); 
    } 
} 

Vấn đề là trang web này có nhiều nhánh phụ. Tức là, http://example.com/site1 là một trang web hoàn toàn khác với http://example.com/site2. Vì vậy, tôi muốn nói chức năng Application_Start để làm việc trên site1 nhưng không ảnh hưởng đến site2.

Nếu global.asax có thể tùy chỉnh ở cấp thư mục, thì đây không phải là vấn đề. Nhưng vì chỉ có một global.asax trên máy chủ Tôi không thể triển khai giải pháp này.

Có những lựa chọn thay thế nào cho global.asax? hoặc global.asax có thể khác nhau bằng cách nào đó cho mỗi thư mục?

Trả lời

9

HttpModules là một thay thế cho global.asax

(xem thêm https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx)

HttpModules được đăng ký trong web.config; trong đó, thuận tiện, có thể tùy chỉnh ở cấp thư mục. Vì vậy, mỗi thư mục có thể có tập các mô-đun độc nhất của riêng nó (được kế thừa trong các thư mục thấp hơn). Tất cả các mô-đun đều có chức năng giống như các chức năng được tìm thấy trong global.asax.

Về cơ bản, mọi yêu cầu trang được chuyển qua mỗi mô-đun đã đăng ký trước khi nó tự động truy cập vào mã trang thực. Điều này xảy ra bất kể những gì loại yêu cầu đó là:

 
"page.aspx" "page.html" 
    |    | 
( | module 1 | ) 
( | module 2 | ) 
( | module 3 | ) 
    V    V 
(handler 1) (handler 2) 

((một hình ảnh tốt hơn nhiều và mô tả có thể được tìm thấy tại https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm))

Vì vậy, sau đó tất cả các bạn cần làm là xác định mã của bạn như một mô-đun thay vì trong global.asax. Nếu người dùng không được xác thực, thì: response.redirect("login.aspx") sẽ ngừng kiểm soát từ khi tiếp cận trình xử lý và phân tích cú pháp/trả lại/chạy trang được yêu cầu.

Hơi phức tạp hơn một chút, vì vậy, bạn có thể tìm thấy mô tả/hướng dẫn tốt hơn tại trang web codeguru.

1

Tôi chắc chắn rằng mã của bạn sẽ cho phép truy cập vào tất cả mọi người khi một người đăng nhập - có thể không phải những gì bạn muốn.

Theo http://msdn.microsoft.com/en-us/library/ms178473.aspx:

"Được gọi là khi tài nguyên đầu tiên (chẳng hạn như một trang) trong một ứng dụng ASP.NET được yêu cầu Các Application_Start phương pháp là gọi là một lần duy nhất trong vòng đời của. một ứng dụng "

Hơn nữa, theo http://support.microsoft.com/kb/307598#1 " Biến trạng thái ứng dụng là, có hiệu lực, các biến toàn cục cho mỗi ứng dụng ASP.NET. "

Tôi khuyên bạn nên sử dụng API thành viên được xây dựng và hạn chế quyền truy cập bằng tệp web.config.

Nếu bạn đang mở để sử dụng API thành viên thay vì lăn cơ chế xác thực của riêng bạn, bạn có thể sử dụng web.config để kiểm tra xem người dùng có được ủy quyền cho một thư mục cụ thể hay không. Bạn cũng có thể tương đối đơn giản để người dùng đăng nhập vào một trang web và tự động đăng nhập vào các trang khác bằng cách chia sẻ vé xác thực - miễn là tất cả chúng đều nằm trên cùng một miền gốc.

Để chia sẻ vé xác thực xem: http://msdn.microsoft.com/en-us/library/ms998288.aspxhttp://www.netomatix.com/development/singlesignon.aspx

Đối với làm thế nào để sử dụng web.config để hạn chế truy cập: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

0

Trên thực tế tôi tin rằng chỉ có một global.asax cho mỗi ứng dụng asp.net . Nếu bạn muốn example.com/subsite1 là một ứng dụng khác từ example.com/subsite2, bạn có thể tạo hai ứng dụng khác nhau trong IIS. Kết quả là chúng sẽ chạy trong các miền ứng dụng hoàn toàn khác nhau (mặc dù chúng có thể nằm trong cùng một tiến trình (aspnet_wp.exe hoặc w3wp.exe) và thậm chí là chia sẻ các pool ứng dụng). Như vậy, nếu chúng là các ứng dụng khác nhau, chúng cũng phải có các tệp global.asax độc lập.

Để biến thư mục thành ứng dụng. Mở IIS-> Tìm thư mục/trang con, nhấp chuột phải-> Thuộc tính-> tab Thư mục chính-> Nhấp vào "Tạo".

Để biết thêm thông tin về miền ứng dụng và quy trình công nhân, hãy xem xét reading this blog entry. Hy vọng rằng sẽ giúp.