2012-11-29 20 views
7

Tôi muốn thêm bảo mật tạm thời rất đơn giản vào trang web của mình.Sử dụng Global.asax để đặt/kiểm tra biến phiên và chuyển hướng (để kiểm tra người dùng)

Tôi đã tạo trang tại Trang chủ/UnderConstruction nơi mọi người kiểm tra trang web có thể nhập mật khẩu mã hóa cứng, sau đó sẽ đặt biến phiên "underconstruction" thành "false".

Đây là những gì tôi có cho đến nay, nhưng nó kết quả trong quá nhiều chuyển hướng:

protected void Session_Start(Object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["underconstruction"] = "true"; 
    } 

    protected void Application_AcquireRequestState(Object sender, EventArgs e) 
    { 
       if (HttpContext.Current != null && HttpContext.Current.Session != null) 
       { 
        var underconstruction = HttpContext.Current.Session["underconstruction"]; 
        if (underconstruction != null) 
        { 
         string oc = underconstruction.ToString(); 
         if (oc != "false") Response.Redirect("~/Home/UnderConstruction"); 
        } 
       } 

    } 

Đây có phải là gần với những gì tôi cần phải làm gì?

Đây là mã chúng tôi đã nhận làm việc:

điều khiển Mã cho nhật Xem

public ViewResult UnderConstruction() 
    { 
     return View(); 
    } 


    [HttpPost] 
    public ActionResult UnderConstruction(string ocp) 
    { 
     if (ocp == "mypassword") 
     { 
      Session["underconstruction"] = "false"; 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      Session["beingredirected"] = "false"; 
      return View(); 
     } 
    } 

Global.asax

protected void Session_Start(Object sender, EventArgs e) 
    { 
     HttpContext.Current.Session["underconstruction"] = "true"; 
     HttpContext.Current.Session["beingredirected"] = "false"; 
    } 


    protected void Application_AcquireRequestState(Object sender, EventArgs e) 
    { 
     if (HttpContext.Current != null && HttpContext.Current.Session != null) 
     { 
      bool uc = false; 
      var underconstruction = HttpContext.Current.Session["underconstruction"]; 
      if (underconstruction != null) 
      { 
       uc = Boolean.Parse(underconstruction.ToString()); 
      } 

      bool redirected = false; 
      var beingredirected = HttpContext.Current.Session["beingredirected"]; 
      if (beingredirected != null) 
      { 
       redirected = Boolean.Parse(beingredirected.ToString()); 
      } 

      if (uc && !redirected) 
      { 
       if (Request.HttpMethod == "GET") 
       { 
        HttpContext.Current.Session["beingredirected"] = "true"; 
        Response.Redirect("~/Home/UnderConstruction"); 
       } 
       else if (Request.HttpMethod == "POST") 
       { 
       } 

      } 

      HttpContext.Current.Session["beingredirected"] = "false"; 
     } 
    } 
+0

Bạn đã thử nó chưa? Đó là nơi tôi sẽ bắt đầu – Tad

+0

Có, nhưng như tôi đã nói, nó kết quả trong một vòng lặp vô tận. Tôi không chắc chắn làm thế nào để sửa chữa nó. – Dave

+0

Chỉ là một suy nghĩ, nhưng bạn có thể thay đổi câu lệnh if của bạn thành 'if (oc ==" true ")' khi bạn không cắt tỉa hoặc hạ thấp nó để so sánh không? – Mightymuke

Trả lời

9

~/Home/UnderConstruction trong một khác nhau trang mạng? Nếu không, nó sẽ luôn luôn chuyển hướng vì oc sẽ luôn luôn đúng? tức là - bạn cũng cần phải thêm một kiểm tra cho trang bạn đang yêu cầu để bạn có thể bỏ qua chuyển hướng nếu đã đi đến trang UnderConstruction?

CẬP NHẬT

Không chắc chắn nếu kiểm tra tên trang là một ý tưởng tuyệt vời, nhưng một cái gì đó như thế này có thể làm việc:

protected void Session_Start(Object sender, EventArgs e) 
{ 
    HttpContext.Current.Session["underconstruction"] = "true"; 
    HttpContext.Current.Session["beingredirected"] = "false"; 
} 

protected void Application_AcquireRequestState(Object sender, EventArgs e) 
{ 
    if (HttpContext.Current != null && HttpContext.Current.Session != null) 
    { 
     bool uc = false; 
     var underconstruction = HttpContext.Current.Session["underconstruction"]; 
     if (underconstruction != null) 
     { 
      uc = Boolean.Parse(underconstruction); 
     } 

     bool redirected = false; 
     var beingredirected = HttpContext.Current.Session["beingredirected"]; 
     if (beingredirected != null) 
     { 
      redirected = Boolean.Parse(beingredirected); 
     } 

     if (uc && !redirected) 
     { 
      HttpContext.Current.Session["beingredirected"] = "true"; 
      Response.Redirect("~/Home/UnderConstruction"); 
     } 

     HttpContext.Current.Session["beingredirected"] = "false"; 
    } 
} 

Lưu ý rằng tôi sẽ làm sạch mà lên, ví dụ đó là để chỉ đưa ra ý tưởng chung.

CẬP NHẬT

Nếu bạn muốn sử dụng vai trò như đã đề cập trong các ý kiến, sau đó this article from ScottGu's Blog có thể giúp đỡ. Hơi phức tạp hơn một chút, nhưng có thêm lợi ích khi không giới thiệu mã tạm thời như giải pháp trên sẽ

+0

Câu trả lời mới có vẻ hữu ích nhưng có vẻ như khi tôi truy cập trang lần thứ hai mà không cần nhập mật khẩu, nó cho phép tôi vào. Nó gần như ở đó. Tôi đang xem xét và sẽ sớm đăng lại. – Dave

+0

@ MightMuke, Nếu tôi đã hiểu nó một cách chính xác thì ở đây bạn đang ẩn các lỗi ban đầu. Lỗi gốc của "quá nhiều chuyển hướng" là do bạn đang điều hướng đến trang Underconstruction trên global.asax sau khi tính toán một vài điều kiện và thiết lập phiên. Trong vòng tiếp theo, toàn cầu asax sẽ lại trải qua cùng một chu kỳ. Không có điểm xuất cảnh. Sự kiện Session_Start không được sử dụng để tạo phiên, nó chứa logic sẽ xảy ra khi phiên bắt đầu. – CodeSpread

+0

@CodeSpread Yep, nhiều khả năng. Tôi chỉ đơn giản là chỉ ra rằng trừ khi một kiểm tra đã được thêm vào để cho phép điều hướng đến trang xây dựng, sau đó bạn sẽ nhập một vòng lặp chuyển hướng. Mã của tôi chắc chắn không phải là đẹp.Bởi âm thanh của nó, tôi nghi ngờ bạn có một giải pháp tốt hơn nhiều :) – Mightymuke

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