2010-05-25 30 views
29

Tôi có một trang web chạy trên một máy chủ IIS 7.5 với ASP.NET 4.0 trên một máy chủ chia sẻ, nhưng hoàn toàn tin tưởng.Làm cách nào để bảo vệ các tệp tĩnh với xác thực mẫu ASP.NET trên IIS 7.5?

Trang web là trình duyệt tệp "cơ bản" cho phép khách truy cập đăng nhập và có danh sách tệp sẵn có cho họ hiển thị và rõ ràng là tải xuống tệp. Các tệp tĩnh (chủ yếu là tệp pdf) được đặt trong thư mục con trên trang web được gọi là dữ liệu, ví dụ: http://example.com/data/ ...

Trang web sử dụng xác thực mẫu ASP.NET.

Câu hỏi của tôi là: Làm cách nào để công cụ ASP.NET xử lý các yêu cầu cho tệp tĩnh trong thư mục dữ liệu, do đó yêu cầu tệp được xác thực bởi ASP.NET và người dùng không thể liên kết sâu vào một tập tin và lấy các tập tin mà họ không được phép có?

Trân trọng, Egil.

Trả lời

40

Nếu hồ bơi ứng dụng của bạn đang chạy ở chế độ Tích hợp, bạn có thể thực hiện các thao tác sau.

Thêm nội dung sau vào web.config cấp cao nhất của bạn.

<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
    </system.webServer> 

Bây giờ bạn có thể sử dụng quyền ASP.NET chuẩn trong web.config để buộc xác thực biểu mẫu cho tất cả các tệp trong thư mục.

<system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <authentication mode="Forms" /> 
</system.web> 
+0

Cảm ơn Joel. Một bình luận mặc dù. Tôi không được phép sử dụng phần "xác thực" trong web.configs mà không phải là gốc của trang web, dù sao có vẻ như nó hoạt động với người dùng. Tuy nhiên, tôi không thể làm việc khi tôi có , họ sẽ không xác thực, nhưng nếu tôi thêm người dùng vào danh sách cho phép và từ chối tất cả người dùng đã được xác thực khác thì nó hoạt động. Tôi có thiếu thứ gì đó trong phần mô-đun máy chủ web để thực hiện công việc này với vai trò cũng như người dùng không? –

+0

Ugh, cảm ơn bạn! Điều này không nên quá khó khăn để tìm ra. Làm việc cho tôi ngay bây giờ. –

+0

Tác phẩm này hoạt động, nhưng cũng chặn bất kỳ tệp css/gif nào được sử dụng trên trang đăng nhập. Bất kỳ cách nào để có được những người để hiển thị? – eych

12

Tôi gặp vấn đề tương tự với việc nhận vai trò để xác thực. Qua thử và sai Cuối cùng tôi đã nhận nó để làm việc với một chỉnh sửa nhỏ để @Joel đang Cunningham:

<modules runAllManagedModulesForAllRequests="true" > 

tôi đã sử dụng hai trang web này như là tài liệu tham khảo: http://forums.iis.net/t/1177964.aspxhttp://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/

+0

Tác phẩm này !!!! ;) – NitroxDM

+5

Đây chỉ là crap, bằng cách làm cho nó hoạt động và bạn không biết tại sao. Điều này gây ra các vấn đề về HIỆU SUẤT lớn vì tất cả các mô-đun được quản lý đều nắm bắt được tất cả các yêu cầu. @ Giải pháp của John là những gì bạn cần. – Adaptabi

+2

Xin chào, tôi đồng ý với @DotNetWise. Nếu bạn phải, sau đó hãy chắc chắn rằng bạn cherry chọn các mô-đun sẽ được thực hiện cho tất cả các yêu cầu thay vì chạy tất cả các mô-đun được quản lý cho tất cả các yêu cầu. ví dụ: - lưu ý rằng điều kiện tiên quyết trống. – Anton

9

Đây là một chủ đề cũ, nhưng tôi đã xảy ra trên nó và chạy vào cùng một vấn đề như Egil. Dưới đây là phiên bản của sửa chữa của Joel bao gồm vai trò:

<modules runAllManagedModulesForAllRequests="false"> 
     <remove name="FormsAuthenticationModule" /> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="RoleManager" /> 
     <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
</modules> 
4

Phụ Lục:

Như @eych lưu ý này khối cũng truy cập vào các thư mục ~/Content (hoặc bất cứ nơi nào bạn có CSS ​​của bạn), và ~/Scripts, vv trên.

Nếu bạn muốn cho phép ngoại lệ - nghĩa là cho phép người dùng chưa được xác thực truy cập tệp/thư mục nhất định - bạn có thể thực hiện điều đó bằng phần tử location. Thêm dòng sau vào web.config:

<location path="Content"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 

Cập nhật: Một giải pháp tốt hơn là để là để lại truy cập vào theo mặc định - mà sẽ cho phép truy cập vào CSS của bạn/JavaScript/vv - và áp dụng các "khóa" (chỉ) vào thư mục nơi mà các nội dung tĩnh được lưu trữ:

<location path="data"> 
    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 
</location> 

Nên biết trước: trong trường hợp của chúng tôi (một trang web MVC) chúng tôi cần để trang trí tất cả các hành động điều khiển của chúng tôi (ngoại trừ đăng nhập) với [AuthorizeAttribute].Tuy nhiên, đó là một ý tưởng hay, nhưng trước đây không cần thiết (vì trước đây mọi yêu cầu bất hợp pháp được chuyển hướng đến trang đăng nhập).

6

Tôi muốn biết lý do tại sao cần phải thêm lại mô-đun (với tùy chọn mặc định) được thêm theo mặc định cho Đường ống tích hợp, vì vậy tôi đào sâu hơn một chút.

Bạn cần xóa và thêm lại mô-đun vì, theo mặc định, các mô-đun không được thêm vào với các tùy chọn mặc định. Chúng có điều kiện tiên quyết được thêm vào để tương thích ngược để chỉ chạy cho nội dung được xử lý bởi trình xử lý ASP.NET đã đăng ký (ví dụ: các trang .aspx).

Giá trị mặc định trông như thế này:

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
     preCondition="managedHandler" /> 

Bằng cách loại bỏ các mô-đun và tái bổ sung chúng mà không có một điều kiện tiên quyết, những mô-đun riêng chạy cho mọi yêu cầu (bao gồm cả nội dung tĩnh của bạn). Chi tiết hơn là kích hoạt runAllManagedModulesForAllRequests.

Bạn có thể đọc về nó trong một vài bài viết từ khi đường ống Tích hợp được giới thiệu với IIS 7:

Lưu ý rằng có một lỗi đánh máy hoặc các mô-đun tên trong bài viết thứ hai (và câu trả lời của @ John) đã được thay đổi từ FormsAuthenticationModule thành FormsAuthentication tại một số thời điểm.

Tập hợp các module làm việc trong IIS 7,5-8,5 vẻ như thế này đối với tôi:

<system.webServer> 
    <modules> 
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests --> 
    <remove name="FormsAuthentication" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <remove name="DefaultAuthentication" /> 
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    <remove name="RoleManager" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <remove name="UrlAuthorization" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    </modules> 
</system.webServer> 
+0

Có thể rõ ràng, nhưng tôi sẽ chỉ ra rằng tùy thuộc vào tình huống cụ thể của bạn, bạn có thể không cần tất cả các mô-đun này (tôi không cần RoleManager chẳng hạn) và bạn có thể cần những người khác có những hạn chế tương tự như System.Web.SessionState. SessionStateModule – Shaun

1

Nếu bạn ứng dụng hồ bơi đang chạy trong chế độ Classic, bạn có thể làm như sau. Bạn sẽ phải lặp lại các bước này cho từng tiện ích mở rộng tệp mà bạn muốn xử lý, nhưng tôi đang sử dụng .html tại đây.

Đầu tiên, thêm một nhà cung cấp trang xây dựng vào Web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <compilation> 
     <buildProviders> 
     <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/> 
     </buildProviders> 
    </compilation> 
    </system.web> 
</configuration> 

Sau đó, thêm một nhà máy xử lý trang:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <httpHandlers> 
     <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/> 
    </httpHandlers> 
    </system.web> 
</configuration> 

Sau đó, thêm một handler page:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" /> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/> 
    </handlers> 
    </system.webServer> 
</configuration> 

Điều này làm việc cho tôi. (Tín dụng: http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages.)

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