2012-04-05 4 views
2

Ich habe mit einigen der MVC-Tutorials beim Erstellen einer Datenbank-Website mit C# gespielt und habe eine Frage, wie man einen Abschnitt der Website macht Nur wenn ein Benutzer sich mit einem Benutzernamen und einem Passwort angemeldet hat.ASP.Net C# Wie man eine Seite auf der Website zugänglich macht, nachdem ich mich authentifiziert habe

Ich habe eine Anmeldeseite (Code unten), die den Benutzernamen und das Passwort akzeptiert und dann einen Benutzer gegen einen Datenbankeintrag authentifiziert. Sobald Sie auf den "Login" -Button geklickt haben, gelangen Sie mit der Return-URL in einen Admin-Bereich der Website (vollständiger Pfad ist: http://localhost:53559/Data/update). Dieses bisschen bin ich glücklich mit. Das Problem, das ich habe, ist jedoch, dass die "update" Seite immer noch zugänglich ist, wenn du dich NICHT eingeloggt hast. wenn ich im Browser den obigen Pfad eingebe (http: // localhost: 53559/Data/update), ohne sich vorher einzuloggen, wird kein Problem auftreten.

Wie schränke ich die Aktualisierungsseite ein, sodass sie nur verfügbar ist, wenn der Benutzer sich angemeldet hat?

(NB: total Anfänger, kleine Wörter bitte!)

=============================== ================================================= =

Controller-Code für die Anmeldung:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 
using System.Web.Security; 
using DFAccountancy.Models; 

namespace DFAccountancy.Controllers 
{ 
public class AdminController : Controller 
{ 

    // 
    // GET: /Admin/LogOn 

    public ActionResult LogOn() 
    { 
     return View(); 
    } 

    // 
    // POST: /Account/LogOn 

    [HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Update", "Data"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 

    // 
    // GET: /Account/LogOff 

    public ActionResult LogOff() 
    { 
     FormsAuthentication.SignOut(); 

     return RedirectToAction("Index", "Home"); 
    } 

================================ =================================================

Dies ist der Ansichtscode für die Aktualisierungsseite (das ist die Abschnitt Admin und sollte nur zugänglich sein, sobald der Benutzer angemeldet hat):

@model DFAccountancy.Models.Data 

@{ 
    ViewBag.Title = "Update"; 
} 



<h2>Update</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">  </script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"   type="text/javascript"></script> 

<script type="text/javascript"> 
$(function() { $("#cl_button1").click(function() { $("#para1").val(""); }); }); 
$(function() { $("#cl_button2").click(function() { $("#para2").val(""); }); }); 
</script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Data</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.para1) 
    </div> 
    <div class="editor-field"> 
     @Html.TextAreaFor(model => model.para1, new { cols = 75, @rows = 5 }) 
     @Html.ValidationMessageFor(model => model.para1) 
    <input id="cl_button1" type="button" value="Clear Paragraph" /> 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.para2) 
    </div> 
    <div class="editor-field"> 
     @Html.TextAreaFor(model => model.para2, new { cols = 75, @rows = 5 }) 
     @Html.ValidationMessageFor(model => model.para2) 
     <input id="cl_button2" type="button" value="Clear Paragraph" /> 
    </div> 

    <p> 
     <input type="submit" value="Update" /> 
     <input type="reset" value="Re-Set to begining" /> 
    </p> 

</fieldset> 
} 

<div> 
@Html.ActionLink("Back to List", "Index") 
</div> 

=========================== ================================================= =====

Dies ist der Controller-Code (Datacontroller), die hinter der Update-Ansicht Seite sitzt:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using DFAccountancy.Models; 

namespace DFAccountancy.Controllers 
{ 
    public class DataController : Controller 
    { 
    private DataDBContext db = new DataDBContext(); 

    // 
    // GET: /Data/ 

    public ViewResult Index() 
    { 
     return View(db.Data.ToList()); 
    } 

    // 
    // GET: /Data/Details/5 

    public ViewResult Details(string id) 
    { 
     Data data = db.Data.Find(id); 
     return View(data); 
    } 



    // 
    // GET: /Data/Update 

    public ActionResult Update() 
    { 
     var model = db.Data.FirstOrDefault(); 
     return View(model); 
    } 

    // 
    // POST: /Data/Update 

    [HttpPost] 
    //[Authorize(Roles = "Administrator")] //Created Validataion so inaccessible from outside 
    [ValidateInput(false)] 
    public ActionResult Update(Data data) 
    { 
     if (ModelState.IsValid) 
     { 
      data.ID = 1; //EF need to know which row to update in the database.  
      db.Entry(data).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index", "Home"); 
     } 
     return View(data); 
    } 


} 
} 

Antwort

3

Verwenden Sie den [Authorize] Filter. Sie können es auf einen Controller oder auf eine einzelne Aktion anwenden.

[Authorize] 
public class DataController : Controller 
{... 

Oder

[Authorize] 
public ActionResult Update() 
{... 

Als Randbemerkung, Sie schließen nicht die DB-Verbindung von dem, was ich sehen kann. Ihr Datenkontext muss .Dispose() aufgerufen haben, wenn es fertig ist.

EDIT

Außerdem sieht es aus wie Ihre get-Methode mit dem Autorisieren nicht eingerichtet, weshalb dort navigieren jemand kann. Nur der Beitrag ist mit dem Autorisierungsfilter dekoriert oder wurde bis zu einem Kommentar auskommentiert. [HttpGet] wird für eine Basisanforderung verwendet, während die [HttpPost] im Allgemeinen aus einem Formularpost stammt (manchmal geschieht dies über Ajax).

+1

können Sie eine große Anleitung finden Sie hier: http://www.asp.net/mvc/tutorials/nerddinner/secure-applications-using-authentication-and-authorization –

+0

@paxty - Ja, nerddinner ist ein großartiges Beispiel, und so ist das Produkt für den fortgeschrittenen Benutzer :) –

+0

Vielen Dank Jungs, ich werde mir die obigen und die Tutorials ansehen. Es wird Zeit brauchen ... verstehe es noch nicht! :-) Danke noch einmal. – Harry

Verwandte Themen