2

我一直在玩一些关于使用 C# 制作数据库网站的 MVC 教程,并且有一个关于如何使网站的一部分只能在用户使用用户名和密码登录后才能访问的问题。

我有一个登录页面(下面的代码),它接受用户名和密码,然后根据数据库记录对用户进行身份验证。单击“登录”按钮后,返回 URL 会将您带到网站的管理部分(完整路径为:http://localhost:53559/Data/update)。这一点我很满意。但是,我遇到的问题是,如果您没有登录,“更新”页面仍然可以访问,即如果我在浏览器中输入上面的路径(http://localhost:53559/Data/update)而没有登录首先它会加载没有问题)。

如何限制更新页面,使其仅在用户登录后可用?

(注意:初学者,请少说!)

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

登录的控制器代码:

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

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

这是更新页面的查看代码(这是管理部分,只有在用户登录后才能访问):

@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>

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

这是位于更新视图页面后面的控制器代码 (DataController):

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


}
}
4

1 回答 1

3

使用[Authorize]过滤器。您可以将其应用于控制器或单个操作。

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

或者

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

作为旁注,您并没有从我所看到的情况下关闭您的数据库连接。您的数据上下文需要.Dispose()在完成时调用它。

编辑

此外,您的 get 方法似乎没有用授权装饰,这就是任何人都可以在那里导航的原因。只有帖子使用授权过滤器进行了修饰,或者直到被注释掉。[HttpGet]用于基本请求,而[HttpPost]通常来自表单帖子(有时通过 ajax 完成)。

于 2012-04-05T09:37:25.787 回答