2012-11-29 3 views
7

Ich möchte meiner Website sehr einfache temporäre Sicherheit hinzufügen.Verwenden von Global.asax, um Sitzungsvariable festzulegen und zu überprüfen (für Benutzertests)

Ich habe eine Seite bei Home/UnderConstruction erstellt, wo Leute, die die Site testen, ein fest codiertes Passwort eingeben können, das dann die Sitzungsvariable "underconstruction" auf "false" setzt.

Das ist, was ich bisher, aber es führt zu viele Umleitungen:

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"); 
        } 
       } 

    } 

Ist dies nahe, was ich brauchen würde, zu tun?

Hier ist der Code, den wir zur Arbeit bekam:

-Controller-Code für under Ansicht

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

Haben Sie es versucht? Das ist, wo ich anfangen würde – Tad

+0

Ja, aber wie ich schon sagte, es ergibt sich eine endlose Schleife. Ich bin mir nicht sicher, wie ich das beheben soll. – Dave

+0

Nur ein Gedanke, aber kannst du deine if-Anweisung in 'if (oc ==" true ") ändern, weil du sie nicht trimmst oder unterlegst? – Mightymuke

Antwort

9

Ist ~/Home/UnderConstruction in einem anderen Webseite? Wenn nicht, wird es immer umleiten, weil oc immer wahr ist? dh - müssen Sie auch eine Überprüfung für die von Ihnen angeforderte Seite hinzufügen, damit Sie die Weiterleitung umgehen können, wenn Sie bereits auf die Seite UnderConstruction gehen?

UPDATE

nicht sicher, ob die Überprüfung der Seitenname ist eine großartige Idee, aber so etwas wie dies funktionieren könnte:

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"; 
    } 
} 

Bitte beachte, dass ich würde das aufzuräumen, war das Beispiel nur geben Sie die allgemeine Idee.

UPDATE

Wenn Sie Rollen verwenden, wie in den Kommentaren erwähnt, helfen this article from ScottGu's Blog kann dann. Es ist ein wenig komplizierter, aber hat den zusätzlichen Vorteil der Einführung von temporären Code wie die obige Lösung wird

+0

Neue Antwort scheint zu helfen, aber es scheint, wenn ich ein zweites Mal auf die Seite gehe, ohne ein Passwort einzugeben, lässt es mich rein. Es ist fast da. Ich schaue mir das an und werde bald wieder posten. – Dave

+0

@ MightMuke, Wenn ich es richtig verstanden habe, dann versteckst du hier den ursprünglichen Fehler. Der ursprüngliche Fehler von "zu vielen Weiterleitungen" liegt darin, dass Sie nach der Berechnung einiger Bedingungen und dem Festlegen der Sitzung zur Seite "Underconstruction" auf global.asax navigieren. Beim nächsten Roundup wird globales Asax erneut denselben Zyklus durchlaufen. Es gibt keinen Ausgangspunkt. Das Session_Start-Ereignis wird nicht zum Erstellen einer Sitzung verwendet. Es enthält die Logik, die beim Start der Sitzung auftritt. – CodeSpread

+0

@CodeSpread Ja, mehr als wahrscheinlich. Ich habe lediglich darauf hingewiesen, dass Sie eine Weiterleitungsschleife eingeben würden, wenn nicht ein Häkchen hinzugefügt wurde, um die Navigation zur Seite "Unterkonstruktion" zu ermöglichen. Mein Code ist sicherlich nicht schön.Durch die Geräusche davon, ich vermute, dass Sie eine viel bessere Lösung haben :) – Mightymuke

Verwandte Themen