2010-10-19 34 views
16

Điều này sẽ đơn giản hơn nhiều so với nó đã được chứng minh là!Xác thực cơ bản IIS7 để bảo vệ trang web sử dụng xác thực mẫu

Tôi có một ứng dụng web ASP.Net sử dụng xác thực FORMS để bảo mật một phần của trang web (tức là khu vực đăng nhập thành viên).

Bây giờ tôi chỉ đơn giản muốn đặt một mật khẩu trình duyệt đơn giản/truyền thống (bảo mật thư mục) trên toàn bộ trang web vì chúng tôi đang thử nghiệm và không muốn bất kỳ ai vấp ngã trên trang web và xem phiên bản chưa hoàn thành, v.v.

Điều này được sử dụng để siêu đơn giản trong các phiên bản IIS cũ hơn.

Tôi đã "cài đặt xác thực cơ bản" (vì IIS7 không ra khỏi hộp với điều này ngay bây giờ). Nhưng khi tôi kích hoạt nó, nó nói với tôi rằng tôi không thể có được kích hoạt cùng một lúc như bất kỳ xác thực dựa trên chuyển hướng (đó là những gì xác thực FORMS của tôi sử dụng).

Vì vậy, điều đó thật ngu ngốc.

Phải có một cách đơn giản siêu đơn giản để đặt một mật khẩu popup giá rẻ trên toàn bộ trang web mà không ảnh hưởng đến phương pháp xác thực khác mà bạn đã thiết lập bên trong web.config cho ứng dụng thực tế.

Rất cám ơn ..

CẬP NHẬT hạn chế truy cập IP là không tốt cho một vài lý do: - IP của tôi là năng động và do đó thay đổi liên tục. - Tôi không muốn làm phiền bất cứ ai cần xem trang web bằng cách yêu cầu họ đưa lên bàn điều khiển trên máy của họ và tìm địa chỉ IP của họ hoặc kiểm tra bộ định tuyến của họ. Nhiều người trong số họ là người dùng doanh nghiệp phi kỹ thuật và sẽ mất một giờ để tìm ra địa chỉ IP của họ. - Cả auth và auth cửa sổ cơ bản đều không cho phép xác thực biểu mẫu cơ bản duy trì ở bên dưới.

Những gì chúng tôi có ở đây là một trường hợp lớn của Microsoft đang cố gắng để over-kỹ sư điều và kết quả là một yêu cầu tuổi già siêu đơn giản là không còn có thể hoặc dễ dàng đạt được. Điều này có thể bằng cách nào đó ... BẤT CỨ AI ???

Trả lời

2

Có một giải pháp đơn giản cho bạn kể từ khi bạn muốn sử dụng xác thực HÌNH THỨC ...

  1. Thêm phần này vào web.config của bạn bên dưới tiêu đề chính. Không hợp nhất - chỉ cần sao chép dán nó thành một khối. Thẻ vị trí sẽ tách biệt các quy tắc này khỏi phần còn lại của web.config và cho phép xóa dễ dàng sau này.

    <location allowOverride="false"> 
          <system.web> 
           <authentication mode="Forms"> 
            <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH"> 
            </forms> 
           </authentication> 
           <authorization> 
            <deny users="?" /> 
           </authorization> 
          </system.web> 
         </location> 
    
  2. Tạo trang có tên "frontdoor.aspx". Nhận nội dung của trang aspx đó từ liên kết này: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (cuộn xuống đến nơi có nội dung: "Để tạo trang đăng nhập")

  3. TẤT CẢ XONG! Điều này sẽ khóa toàn bộ trang web của bạn và cho phép bạn chỉ định tên người dùng và mật khẩu (tôi gọi quá trình này là "khóa cửa trước") cho cửa trước độc lập với phần còn lại của trang web.Các thông tin cửa trước được quy định trong hồ sơ cửa trước bản thân (không phải là rất an toàn nhưng đủ tốt cho những gì bạn (chúng tôi) cần) trong điều kiện này:

    [Dòng 6:]

    If ((UserEmail.Text = "TheSharedFrontDoorLogonName") And (UserPass.Text = "AndItsPassword")) Then 
    

Sửa đổi điều kiện cho phù hợp với nhu cầu của bạn và sau đó gửi email cho khách hàng của bạn/loại doanh nghiệp thông tin đăng nhập vào cửa trước.

+0

Giải pháp này sẽ không hoạt động nếu bạn muốn cấp quyền truy cập cho đồng nghiệp của công ty (với thông tin đăng nhập cơ bản) trong khi sử dụng tài khoản thử nghiệm cho thông tin đăng nhập dựa trên biểu mẫu. – Dementic

4

Tôi đang gặp sự cố tương tự. Tôi sẽ giới thiệu một trang web beta giới hạn cho một nhóm xem trước. Trang web sử dụng xác thực mẫu nhưng một số người từ nhóm xem trước sẽ có tài khoản trang web và những người khác thì không. Không phân biệt mọi người sẽ cần xác thực tại thư mục gốc để có quyền truy cập vào bản xem trước.

Cho đến nay, điều duy nhất tôi làm việc chính xác theo cách mình muốn là Helicon Ape. Tôi đang chạy thử nghiệm và cho đến nay rất tốt.

Tệp .htaccess chuẩn trong thư mục gốc.

AuthUserFile c:\fakepath\.htpasswd 
AuthType Basic 
AuthName "SITE SECURITY" 
Require valid-user 

Người dùng .htpasswd để thêm tên người dùng và mật khẩu: username:encryptedpassword.

+0

Bạn có gắn bó với giải pháp này không? Có bất kỳ hạn chế nào không? – marapet

3

Những gì bạn mô tả là giới hạn của ASP.NET mặc định, nó chỉ được xây dựng để chạy một mô-đun xác thực cùng một lúc. Giải pháp là xây dựng IHttpModule của riêng bạn để thực hiện xác thực tùy chỉnh của bạn và nếu thành công, hãy chuyển yêu cầu tới ASP.NET tiếp tục sử dụng Biểu mẫu.

Sau đây là cách triển khai cơ bản của mô-đun như vậy. Nó sẽ trả về số 401 Unauthorized và yêu cầu người dùng đăng nhập vào lĩnh vực WOPR. Sau đó, nó sẽ chấp nhận mật khẩu Joshua, bỏ qua tên người dùng được chỉ định.

Biên dịch thành một hội đồng riêng biệt và thêm nó vào web.config của bạn, trong các phần system.web/httpModulessystem.webServer/modules. Không yêu cầu sửa đổi ứng dụng web khác của bạn.

using System; 
using System.Text; 
using System.Web; 

namespace Research { 
    public class AuthenticationModule : IHttpModule { 
     public void Init(HttpApplication app) { 
      app.BeginRequest += (sender, e) => { 
       if (!Authenticate(app.Context)) { 
        app.Context.Response.Status = "401 Unauthorized"; 
        app.Context.Response.StatusCode = 401; 
        app.Context.Response.AddHeader("WWW-Authenticate", "Basic realm=WOPR"); 

        app.Response.ClearContent(); 
        app.Context.Response.End(); 
       } 
      }; 
     } 

     public void Dispose() { 
     } 

     public static Boolean Authenticate(HttpContext context) { 
      var authHeader = context.Request.Headers.Get("Authorization"); 
      if (String.IsNullOrEmpty(authHeader)) 
       return false; 

      if (!authHeader.StartsWith("Basic ")) 
       return false; 

      var base64Credentials = authHeader.Substring(6); 
      var binaryCredentials = Convert.FromBase64String(base64Credentials); 
      var asciiCredentials = Encoding.ASCII.GetString(binaryCredentials); 
      if (!asciiCredentials.Contains(":")) 
       return false; 

      var credentials = asciiCredentials.Split(new[] { ':' }, 2); 
      return credentials[1] == "Joshua"; 
     } 
    } 
} 
Các vấn đề liên quan