ASP.NET MVC使用AuthenticationAttribute驗證登錄

来源:http://www.cnblogs.com/godbell/archive/2017/08/02/7277118.html
-Advertisement-
Play Games

首先,添加一個類AuthenticationAttribute,該類繼承AuthorizeAttribute,如下: using System.Web; using System.Web.Mvc; namespace Zhong.Web { public class AuthenticationAt ...


首先,添加一個類AuthenticationAttribute,該類繼承AuthorizeAttribute,如下:

using System.Web;
using System.Web.Mvc;

namespace Zhong.Web
{
    public class AuthenticationAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //base.OnAuthorization(filterContext);
            //如果控制器沒有加AllowAnonymous特性或者Action沒有加AllowAnonymous特性才檢查
            if (!filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true) && !filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute),true))
            {
                //此處寫判斷是否登錄的邏輯代碼
                //這裡使用cookie來判斷是否登錄,為了簡單說明特性的使用方式,cookie記錄的是用戶名和明文密碼(實際當中需要經過諸如加密等處理)
                HttpCookie cookie = filterContext.HttpContext.Request.Cookies["Member"];
                if (!(cookie!=null && cookie.Values["name"] == "test" && cookie.Values["pass"] == "123"))
                {
                    filterContext.Result = new RedirectResult("/Member/Login");
                }
            }
        }
    }
}
View Code

在MemberControll中加上特性Authentication,Member控制器下有三個Action方法,一個是首頁Index,一個是登錄頁Login,一個是處理Post方式的登錄頁Login,Index對應的視圖代碼如下:

@{
    ViewBag.Title = "Index";
}

<h2>這是會員中心</h2>

Login對應的視圖代碼如下:

@{
    ViewBag.Title = "Login";
}

<h2>會員登錄</h2>
@using (Html.BeginForm())
{
    <label>用戶名:</label><input type="text" name="name" /><br />
    <label>密碼:</label><input type="password" name="password" /><br />
    <input type="submit" value="登錄" /> 
}

 

當沒有登錄直接訪問Member/Index時,會跳轉到Login。當輸入正確的用戶名密碼登錄時,會跳轉到Index頁面。

 

 

 

 

 

完整的MemberController代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Zhong.Web.Controllers
{
    [Authentication]
    public class MemberController : Controller
    {
        // GET: Member
        public ActionResult Index()
        {
            return View();
        }
        [AllowAnonymous]
        public ActionResult Login()
        {
            return View();
        }
        [AllowAnonymous]
        [HttpPost]
        public ActionResult Login(string name,string password)
        {
            //這裡為了簡單演示一下登錄的判斷,主要是驗證AuthenticationAttribute的作用,實際的運用中可能要查詢資料庫、
            //密碼判斷需要加密處理等
            if (name == "test" && password == "123")
            {
                HttpCookie cookie = new HttpCookie("Member");
                cookie.Values["name"] = "test";
                cookie.Values["pass"] = "123";
                Response.Cookies.Add(cookie);
                return RedirectToAction("Index");
            }
            return View();
        }
    }
}
View Code

特別說明:由於控制器使用了Authentication特性,所以請求其下的所有Action都要先通過授權/登錄 驗證,Login是登錄頁面,訪問這個頁面一般是沒有登錄的狀態,所以需要允許匿名訪問,於是加了[AllowAnonymous]

 

 

 上面的AuthorizationAttribute的另一種寫法是繼承FilterAttribute 並實現介面IAuthorizationFilter,方式與系統的AuthorizeAttribute類似,

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Zhong.Web
{
    public class TestAttribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            //throw new NotImplementedException();
            //TODO: 此處寫需要實現登錄驗證的代碼

        }
    }
}
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • sed介紹sed:stream editor是一個行編輯器,或叫流編輯器,每次處理一行,處理完一行再處理下一行。sed並不直接處理源文件,而是讀取一行後放入模式空間(patten space)里,在這個模式空間中完成編輯,並輸出顯示。當然sed加上 –i 參數也可以直接原處理文件。sed不僅有模式空... ...
  • Linux 系統(我特指發行版, 沒說內核) 下大部分軟體的風格就是不會仔細去考慮向後 的相容性, 比如你上個版本能用這種程式配置, 沒準到了下一個版本, 該程式已經不見了. 比如 sysvinit 這種東西. 設置時區同樣, 在 CentOS 7 中, 引入了一個叫 timedatectl 的設置 ...
  • 本例中以CentOS 7舉例說明如何設置Linux開機自動獲取IP地址和設置固定IP地址。 自動獲取動態IP地址 1.輸入“ip addr”並按回車鍵確定,發現無法獲取IP(CentOS 7預設沒有ifconfig命令),記錄下網卡名稱(本例中為ens33,下圖黃色框內)。 2.輸入“cd /etc ...
  • Linux 系統版本:Opensuse 13.2 GMT版本: GMT5.4.2 根據README文件: 37 CMake 38 39 40 Install CMake (>=2.8.5) from http://www.cmake.org/cmake/resources/software.html ...
  • 1.keras模型可視化 keras.utils.vis_utils模塊提供了畫出Keras模型的函數(利用graphviz) 該函數將畫出模型結構圖,並保存成圖片: plot_model接收兩個可選參數: show_shapes:指定是否顯示輸出數據的形狀,預設為False show_layer_ ...
  • 一、前言: ssh遠程登錄密碼認證的方式有三種,password、Keyboard Interactive、Public Key 前面兩種方式就是密碼認證,含義都是一樣大同小異。第三種是登錄方式最安全的一種。 下麵我們就來實現第三種方式public key秘鑰認證方式。 二、原理: ssh客戶端利用 ...
  • 1、與用戶(user)和用戶組(group)相關的配置文件; 1)與用戶(user)相關的配置文件;/etc/passwd 註:用戶(user)的配置文件;/etc/shadow 註:用戶(user)影子口令文件; 2)與用戶組(group)相關的配置文件;/etc/group 註:用戶組(grou ...
  • 幾天前,我和我的朋友們使用 ASP.NET Core 開發了一個API ,使用的是GET方式,將一些數據返回到客戶端 APP。我們在前端進行了分頁,意味著我們將所有數據發送給客戶端,然後進行一些data.length操作,以獲得items count用於分頁邏輯。為了減少HTTP請求的負荷,我們決定 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...