首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ASP.NET MVC 校友錄實戰(五):web.config 關鍵設定與 Filter 權限控制

     編輯:關於.NET

本篇解析 `web.config` 核心配置區段,並詳細說明如何利用 ASP.NET MVC 的 `ActionFilterAttribute` 實現輕量級權限控制,替代笨重的 Membership 系統。

一、web.config 核心配置解析

連接字串區段

<connectionStrings>
  <add name="ABConnection" 
       connectionString="Data Source=|DataDirectory|AlumniBook.sdf" 
       providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
  • 使用 SQL Server Compact 4.0 本地資料庫檔案(`.sdf`),適合中小型專案
  • `|DataDirectory|` 會自動解析為 `App_Data` 目錄

Entity Framework 設定

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters><parameter value="4.0" /></parameters>
  </defaultConnectionFactory>
</entityFramework>

Runtime 預設命名空間

第 70 行左右的 `` 區塊定義 Razor 視圖預設引入的命名空間,新增類別時自動可用,減少 `@using` 重複引用。

為何不使用 Membership?

  • 自動建立大量資料表(`aspnet_Users`、`aspnet_Membership` 等),欄位冗余
  • 強制綁定 `UserId` 為 `Guid`,且 `Profile` 屬性擴充困難
  • 對資料庫結構掌控度降低,不符合輕量級專案需求

二、自訂權限過濾器實作

設計理念

MVC 無 WebForm 的控制項拖拉模式,權限驗證需在 Action 執行前攔截。選擇 `Filter`(動作過濾器)而非基底 Controller 繼承,原因:

  1. 符合 MVC 屬性裝飾慣例,如 `[Authorize]`、`[HttpPost]`
  2. 不破壞預設 Controller 繼承結構,VS 建立 Controller 仍繼承 `Controller` 基類
  3. 可針對單一 Action 或整個 Controller 靈活套用

登入狀態檢查過濾器

using System.Web.Mvc;
using AlumniBook.Models;
using AlumniBook.Ensleep;

namespace AlumniBook.Filters
{
    public class IsLogedAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // 若 Session 中無使用者資訊,導向登入頁
            if (filterContext.HttpContext.Session["CurrentUser"] == null)
            {
                // 保存原請求 URL,登入後可導回
                string returnUrl = filterContext.HttpContext.Request.Url.PathAndQuery;
                filterContext.Result = new RedirectResult(
                    $"/Log/Login?returnUrl={HttpUtility.UrlEncode(returnUrl)}");
            }
            base.OnActionExecuting(filterContext);
        }
    }
}

管理員權限檢查過濾器

public class IsAdminAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var user = filterContext.HttpContext.Session["CurrentUser"] as User;
        if (user == null || !user.IsAdmin)
        {
            filterContext.Result = new RedirectResult("/Error/UnAuthorized");
        }
        base.OnActionExecuting(filterContext);
    }
}

控制器套用範例

[IsLoged] // 整個 Controller 需登入
public class ClassController : Controller
{
    [IsAdmin] // 僅此 Action 需管理員
    public ActionResult Delete(int id) { ... }

    public ActionResult Index(string className) { ... } // 一般登入用戶可存取
}

三、工具類:密碼雜湊與 Cookie 封裝

public static class CryptoHelper
{
    public static string GetMD5(string input)
    {
        using (var md5 = System.Security.Cryptography.MD5.Create())
        {
            byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
            return BitConverter.ToString(data).Replace("-", "").ToLower();
        }
    }
}

public static class CookieHelper
{
    public static void SetCookie(string name, string value, int days)
    {
        var cookie = new HttpCookie(name, value) { Expires = DateTime.Now.AddDays(days) };
        HttpContext.Current.Response.Cookies.Add(cookie);
    }
    public static void RemoveCookie(string name)
    {
        if (HttpContext.Current.Request.Cookies[name] != null)
        {
            var cookie = new HttpCookie(name) { Expires = DateTime.Now.AddDays(-1) };
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    }
}

四、本篇小結

精簡的 `web.config` 搭配自訂 `ActionFilter`,即可構建清晰、可維護的權限體系。避免 Membership 的過度設計,讓專案專注於業務邏輯。下一篇將展示系統整體架構圖與前台需求設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved