1. 程式人生 > >初識ASP.NET MVC窗體驗證與許可權過濾---1.窗體身份驗證

初識ASP.NET MVC窗體驗證與許可權過濾---1.窗體身份驗證

         一直不懂如何解決web系統的登入許可權控制問題,在最開始的時候,我用了一個很土的方法。使用者登入成功後就把使用者的身份資訊寫到一個會話cookie中。這種方法非常的脆弱而且不安全。比如a使用者登入後沒有退出功能頁面,此時他又登入了b使用者的賬戶,身份cookie已經被改寫成了b。如果此時他回到a使用者的功能頁上繼續操作,輕則他會看到b使用者的相關資訊,重則會出現系統錯誤。
         就算使用者正常登入了,如何保證系統對用於做出恰當的許可權識別,防止他進入非授權的頁面。使用這種簡單的土辦法同樣解決不了。
         雖然知道mvc中已經集成了窗體身份驗證,並且可以通過過濾器來進行訪問控制,但一直沒有時間研究(全是藉口^_^)。昨天搞到半夜,總算是有點眉目了,特記錄備忘。
          mvc的窗體身份驗證和我的土辦法其實原理是一樣的。要想服務端知道客戶端是誰,肯定要為客戶端打上某種“標記”,mvc使用了一個稱為 FormsAuthenticationTicket的東東,待登陸後,你建立一個鑑權票據加密後儲存到客戶端。伺服器來根據這個加密cookies判斷你的身份,很簡單吧。頁面程式碼如下,為了方便演示,沒有采集任何輸入,直接向服務端傳送了非同步請求,並指定自己的角色。

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <script  src="~/Scripts/jquery-1.8.2.min.js">    </script>
    <script>
        $(function () {
            $('#btn_login_index').click(function () {
                $.ajax({
                    url: '/Home/LogOn',
                    cache: false,
                    data: { UserName: "Andy", Role: "Manager" },
                    success: function () {
                        location.replace('/Main/index');
                    }
                });
            });
        });
    </script>
    <title>Login</title>
</head>
<body>
    <div>
        <button id="btn_login_index">登入</button>    
    </div>
</body>
</html>
       獲得授權後跳轉到另一個頁面。伺服器端程式碼如下:
  public string LogOn(string username, string role)
        {
            //在實際程式碼中,以下應該為根據使用者名稱和密碼從業務層進行驗證並獲取許可權
            //使用者名稱和密碼可以採用Base64加密
            UserModel user = new UserModel { ID = 2, Name = "Andy", Password = "123456", Roles = new string[] { role } };
            //將使用者身份存入Session,過期時間為30分鐘
            Session["username"] = username;
            Session["userid"] = user.ID;
            Session["roles"] = user.Roles.Aggregate((x, y) => x + "," + y);
            //建立窗體驗證票據
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1,
                user.Name,
                DateTime.Now,
                DateTime.Now.Add(FormsAuthentication.Timeout),
                false,
                user.Roles.Aggregate((i, j) => i + "," + j)
                );
            //加密後寫入cookies
            HttpCookie cookie = new HttpCookie(
               FormsAuthentication.FormsCookieName,
               FormsAuthentication.Encrypt(ticket));
            //將cookies新增到響應
            Response.Cookies.Add(cookie);
            return "yes";
        }
             登陸後,伺服器向瀏覽器傳送了兩個cookies,.ASPXAUTH就是窗體驗證的鑑權cookies,由於我們使用了session,所以服務端又傳送了一個sessionid來標示session。若不使用session,則不會發送第二個cookies。

           至此,我們就完成了窗體身份驗證,是不是很簡單。

相關推薦

初識ASP.NET MVC窗體驗證許可權過濾---1.窗體身份驗證

         一直不懂如何解決web系統的登入許可權控制問題,在最開始的時候,我用了一個很土的方法。使用者登入成功後就把使用者的身份資訊寫到一個會話cookie中。這種方法非常的脆弱而且不安全。比如a使用者登入後沒有退出功能頁面,此時他又登入了b使用者的賬戶,身份coo

初識ASP.NET MVC窗體驗證許可權過濾---3.自定義過濾器驗證Session超時

        為了防止使用者在seesion過期之後進行操作,可以新增自定義過濾器驗證session是否過期,為了便於測試將過期時間設定為1分鐘,在Filters資料夾下新增一個自定義過濾器。namespace AuthStudy.Filters { public

初識ASP.NET MVC窗體驗證許可權過濾---2.基於角色的訪問控制

          上一篇完成了窗體身份驗證並在客戶端儲存了鑑權cookies,系統已經知道我已經登入並獲得了授權。但僅僅知道登入了是不夠的,還要對能夠訪問的區域做出控制。男人不能進女廁所,女人不能進男廁所O(∩_∩)O哈哈~           這裡就要來扯一扯AOP了,

Asp.net MVC中的全域性許可權驗證方法及實現

       開發過MVC的人都知道,MVC是三個單詞的縮寫,分別為: 模型(Model),檢視(View)和控制Controller)。 MVC模式的目的就是實現Web系統的職能分工。 Model層實現系統中的業務邏輯。 View層用於與使用者的互動。 Controlle

ASP.NET MVC URL重寫優化(初級篇)-使用Global路由表定製URL

在現今搜尋引擎制霸天下的時代,我們不得不做一些東西來討好爬蟲,進而提示網站的排名來博得一個看得過去的流量。   URL重寫與優化就是搜尋引擎優化的手段之一。   假如某手機網站(基於ASP.NET MVC)分類頁面URL是這樣的,   http://www.xxx.

Asp.NET MVC用System.Web自帶方法寫入FormsAuthentication驗證

/// <summary> /// 登入 /// </summary> /// <param name="userId"></param> /// <param name="isKeepLogin">是

ASP.NET MVC底層原理框架

前言 鄙人有一毛病,喜歡鑽研原理性的東西,感覺只知道怎麼用還不太夠,更想知道如何實現的以及為什麼會這樣。 暑假的時候做積分系統是第一次接觸MVC,感覺MVC就是一個框架,分為Module ,view和controller,瀏覽器傳過來的資訊先到達contro

ASP.NET MVC URL重寫優化(進階篇)-繼承RouteBase玩轉URL

在初級篇中,我們介紹瞭如何利用基於ASP.NET MVC的Web程式中的Global檔案來簡單的重寫路由。也介紹了它本身的侷限性-依賴於路由資訊中的鍵值對:   如果鍵值對中沒有的值,我們無法將其利用湊出我們想要的URL表示式。   在進階篇中,我們將介紹ASP.

ASP.NET MVC】ViewController之間傳遞數據

avg 信息 per $.ajax click 表單 tin manager 大小 1 概述 本篇文章主要從操作上簡要分析Controller<=>View之間相互傳值,關於頁面之間傳值,如果感興趣,可參考我另外一篇文章ASP.NET 頁面之間傳值的幾

ASP.NET MVC/Core表單提交後臺模型二級屬性驗證問題

起因 這個是網友在官網論壇的提問:https://fineui.com/bbs/forum.php?mod=viewthread&tid=22237     重新問題 本著務實求真的態度,我們先來複現這個問題。首先頁面截圖是這樣的:   類 

Asp.Net MVC3 簡單入門詳解過濾器Filter(身份驗證、快取、防盜鏈、國際化等)

下面我們說幾個系統的Filter三、AcceptVerbs規定頁面的訪問形式,如 [AcceptVerbs(HttpVerbs.Post)]public ActionResult Example(){return View(); }頁面只能以Post形式訪問,即表單提交。四、Ac

ASP.NET MVC搭建專案後臺UI框架—1、後臺主框架

目錄 準備做一個新的專案,從網頁設計師手中拿到了html靜態頁面(沒有一行js),但是都一個個零散的介面,我需要做的是: 1、  把這些零散的html介面連線起來 2、  自己編寫js或者jquery實現選單效果 3、  把html頁面整合在我們的MVC Razor檢視中 本想著使用第三方的UI

在Linux離線部署ASP.NET MVC,運用mono-3.12.1+jexus-5.6.3

之前寫的忘記檢查了,結果大部分是沒有顯示出來的,今天查了回收站,才發現出問題了。下面是全部內容 寫在前面: 這段時間,因為專案條件限制,需要在Linux伺服器上,離線部署ASP.NET MVC4的

ASP.NET MVC窗體身份驗證及角色許可權管理示例

前言   本來使用Forms Authentication進行使用者驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋友則發文詢問如何從頭到尾完整第實現使用者的註冊、登入。因此,Anders Liu在這

轉:ASP.NET MVC窗體身份驗證及角色許可權管理示例

前言   本來使用Forms Authentication進行使用者驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋友則發文詢問如何從頭到尾完整第實現使用者的註冊、登入。因此,Anders Liu在這一系列文章中計劃通過一個實際

ASP.NET MVC窗體身份驗證及角色權限管理示例

rms 客戶端請求 系統 contex config 尋找 sign 分享圖片 更多 前言   本來使用Forms Authentication進行用戶驗證的方式是最常見的,但系統地闡明其方法的文章並不多見,網上更多的文章都是介紹其中某一部分的使用方法或實現原理,而更多的朋

ASP.NET MVC 入門8、ModelState資料驗證

ViewData有一個ModelState的屬性,這是一個型別為ModelStateDictionary的ModelState型別的字典集合。在進行資料驗證的時候這個屬性是比較有用的。在使用Html.ValidationMessage()的時候,就是從ViewData.ModelState中檢測是否有指定的K

Asp.net MVC 模型驗證如何做到模型欄位action 動作的解耦

1場景 某一天我在教我學生搭建Asp.net 框架做專案的時候 發現做一個登入 後臺模型驗證需要用到驗證“使用者名稱”和“密碼”不能為空。 然後我建立了一個模型 帶有這兩個欄位非空的特性 後面我學生問我老師如果我要修改使用者資訊的時候不需要驗證使用者名稱和密碼為空 這剛才的模型好像不能用

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(7.1) 模組管理,驗證許可權,展示模組列表

索引 簡述 今天我們來做模組管理的 展示 模組列表 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。

asp.net mvc 最簡單身份驗證 [Authorize]通過的標準

dmi api 什麽 rgs new auth 單身 mar name [Authorize] public ContentResult Index2() { return Content("驗證通過了");