2

私はC#を使用してデータベースWebサイトを作成するためのMVCチュートリアルのいくつかで遊んでいますが、ユーザーがユーザー名とパスワードを使用してログインした後でのみWebサイトのセクションにアクセスできるようにする方法について質問があります。

ユーザー名とパスワードを取得し、データベースレコードに対してユーザーを認証するログオンページ(以下のコード)があります。「ログイン」ボタンをクリックすると、リターンURLによってWebサイトの管理セクションに移動します(フルパスは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()
{...

ちなみに、あなたは私が見ることができるものからあなたのDB接続を閉じていません。データコンテキスト.Dispose()は、終了時にそれを呼び出す必要があります。

編集

さらに、getメソッドはauthorizeで装飾されていないようです。そのため、誰でもそこに移動できます。投稿のみが承認フィルターで装飾されているか、コメントアウトされるまで続きました。[HttpGet]は基本的なリクエストに使用されますが、[HttpPost]通常はフォームの投稿から取得されます(ajaxを介して行われる場合もあります)。

于 2012-04-05T09:37:25.787 に答える