1. 程式人生 > >Asp.Net MVC中身份認證和授權

Asp.Net MVC中身份認證和授權



MVC自帶的ActionFilter

在Asp.Net WebForm的中要做到身份認證微軟為我們提供了三種方式,其中最常用的就是我們的Form認證,需要配置相應的資訊。例如下面的配置資訊:

[xhtml] view plaincopyprint?
  1. <authenticationmode="Forms">
  2.     <formsloginUrl="Login.aspx"defaultUrl="Default.aspx"protection="All"/>
  3. </authentication>
  4. <authorization>
  5.     <denyusers
    ="?"/>
  6.     <allowusers="*"/>
  7. </authorization>

說明我們登入頁面是Login.aspx,登入成功後的預設頁面是Default.aspx,而我們使用者資訊採用驗證和加密兩種方式。而且最重要的是我們要寫好授權方式(下面的授權一定要寫否則只說明使用Forms認證然後設定相關屬性是沒有用的),拒絕所有匿名使用者,只有登入使用者可以正常訪問。這樣之後我們設定點選登入按鈕將使用者名稱寫進cookie(也就是執行FormsAuthentication.SetAuthCookie(name, false);)就可以了。

0在Asp.Net MVC中我們同樣可以使用Forms認證,但是如果你按照WebForm中的做法去做就不行了。例如你這樣配置資訊:

[xhtml]
view plaincopyprint?
  1. <authenticationmode="Forms">
  2.     <formsloginUrl="~/Account/Login"defaultUrl="~/Home/Index"protection="All"/>
  3. </authentication>
  4. <authorization>
  5.     <denyusers="?"/>
  6.     <allowusers="*"/>
  7. </authorization>

你在Login.aspx中設定登入來觸發AccountController中的Logon來登入,其中Logon程式碼:

[c-sharp] view plaincopyprint?
  1. public ActionResult Logon(string name,string password)   
  2. {   
  3.     if (name == "jianxin160" && password == "123456")   
  4.     {   
  5.         FormsAuthentication.SetAuthCookie(name, false);   
  6.         return Redirect("~/Home/Index");   
  7.     }   
  8.     else
  9.     {   
  10.         return Redirect("/");   
  11.     }   
  12. }  

這樣的操作之後你會發現你的Logon是不會執行的。原因是什麼呢?怎麼同樣的設定為什麼到了MVC中就不行了?原因就是二者機制不同,因為你設定的授權方式讓Logon無法訪問了。那麼我們怎麼來做呢?

其實在Asp.Net MVC中我們有更好的方式來做這一切,我們不需要授權方式,也就是說我們的配置資訊像這樣:

[xhtml] view plaincopyprint?
  1. <authenticationmode="Forms">
  2.             <formsloginUrl="~/Account/Login"defaultUrl="~/Home/Index"protection="All"/>
  3. </authentication>

不需要說明匿名使用者不能登入等。當然了,你會發現僅僅就這樣做肯定不行的我們還要換一種方式告訴系統哪些是需要登入才能訪問的。你或許想,o(︶︿︶)o 唉,那太麻煩了吧。其實不是這樣的,很簡單,我們只需要在需要認證的Action上標記[Authorize]就可以了。例如我在Home資料夾中有兩個頁面Index和Home,我現在想讓Index經過認證才能訪問,而Home不需要,那麼只需要給Index這個Action標記[Authorize],也就是:

[c-sharp] view plaincopyprint?
  1. [Authorize]   
  2. public ActionResult Index()   
  3. {   
  4.     return View();   
  5. }   
  6. public ActionResult Home()   
  7. {   
  8.     return View();   
  9. }  

這樣Index就必須登入之後才能訪問,而Home是不需要登入的。如果你需要進行角色授權那麼您就可以在標記Authorize的時候指明角色(例如[Authorize(Role=Administrators)] ),不過您這是就必須使用微軟給我們提供的Membership機制了,因為您的Role不可能是平白無故有的,而是存在於對應的資料庫中的,這個我在另一篇部落格中提到過就不多說了。

自定義ActionFilter

有時候這樣的認證或許您還不能夠滿足,或者說您覺得不夠靈活,那麼也沒有關係,Asp.Net MVC是允許您自定義ActionFilter的。例如我現在自定義身份認證:

[c-sharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using System.Web.Security;   
  7. namespace FormFormsAuthenticationMvc  
  8. {  
  9.     publicclass RequiresAuthenticationAttribute:ActionFilterAttribute  
  10.     {  
  11.         publicoverridevoid  OnActionExecuting(ActionExecutingContext filterContext)  
  12.         {  
  13.             if (!filterContext.HttpContext.User.Identity.IsAuthenticated)  
  14.             {  
  15.                 string returnUrl = filterContext.HttpContext.Request.Url.AbsolutePath;  
  16.                 string redirectUrl = string.Format("?ReturnUrl={0}", returnUrl);  
  17.                 string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;  
  18.                 filterContext.HttpContext.Response.Redirect(loginUrl, true);  
  19.             }  
  20.         }   
  21.     }  
  22. }  

如果需要進行使用者管理,我再定義角色相關的Filter:

[c-sharp] view plaincopyprint?
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Web;   
  5. using System.Web.Mvc;   
  6. using System.Web.Security;   
  7. namespace MvcApplication1.MyClass   
  8. {   
  9.     publicclass RequiresRoleAttribute:ActionFilterAttribute   
  10.     {   
  11.         publicstring Role { getset; }   
  12.         publicoverridevoid OnActionExecuting(ActionExecutingContext filterContext)   
  13.         {   
  14.             if (!string.IsNullOrEmpty(Role))   
  15.             {   
  16.                 if (!filterContext.HttpContext.User.Identity.IsAuthenticated)   
  17.                 {   
  18.                     string returnUrl = filterContext.HttpContext.Request.Url.AbsolutePath;   
  19.                     string redirectUrl = string.Format("?ReturnUrl={0}", returnUrl);   
  20.                     string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;   
  21.                     filterContext.HttpContext.Response.Redirect(loginUrl, true);   
  22.                 }   
  23.                 else
  24.                 {   
  25.                     bool isAuthenticated = filterContext.HttpContext.User.IsInRole(Role);   
  26.                     if (!isAuthenticated)   
  27.                     {   
  28.                         thrownew UnauthorizedAccessException("You have no right to view the page!");   
  29.                     }   
  30.                 }   
  31.             }   
  32.             else
  33.             {   
  34.                 thrownew InvalidOperationException("No Role Specified!");   
  35.             }   
  36.         }   
  37.     }   
  38. }  

相關推薦

Asp.Net MVC身份認證授權

 MVC自帶的ActionFilter 在Asp.Net WebForm的中要做到身份認證微軟為我們提供了三種方式,其中最常用的就是我們的Form認證,需要配置相應的資訊。例如下面的配置資訊: [xhtml] view plaincopyprint? &l

ASP.NET MVC4 身份認證授權

        寒假準備對我們團隊開發的各個小系統進行整合和重寫,由於這些系統需求分析並不夠仔細,所以在後期縫縫補補,加上人員交替,使得程式碼結構凌亂不堪,讓我這個有程式碼潔癖的人難受的要死,所以打算重新梳理,由於我們團隊主攻asp.net mvc開發,(我對asp.net

asp.net mvc 的Form身份認證

預設的MVC4程式在配置檔案web.config中有以下配置     <authentication mode="Forms">       <forms loginUrl="~/Account/Login" timeout="2880" />   

ASP.NET Core 3.0 gRPC 身份認證授權

一.開頭聊騷 本文算是對於 ASP.NET Core 3.0 gRPC 研究性學習的最後一篇了,以後在實際使用中,可能會發一些經驗之文。本文主要講 ASP.NET Core 本身的認證授權和gRPC接入,認證方式採用目前主流的 JWT 結合 IdentityServer4。 二.服務端配置 我們首先需要在服

ASP.NET MVCSection、Partial View Child Action(轉載)

概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個

ASP.NET MVC使用區域來方便管理controllerview

空間 查看 span name 新建 文件 img info con 在ASP.NET MVC中使用區域來方便管理controller和view 在mvc架構中,一般在controllers和views中寫所有控制器和視圖, 太多控制器時候,為了方便管理,想要將關於per

ASP.NET MVC,使用Bundle來打包壓縮jscss

在ASP.NET MVC4中(在WebForm中應該也有),有一個叫做Bundle的東西,它用來將js和css進行壓縮(多個檔案可以打包成一個檔案),並且可以區分除錯和非除錯,在除錯時不進行壓縮,以原始方式顯示出來,以方便查詢問題。 這裡僅簡單記錄下如何使用。 首先

ASP.Net MVC連接MySQLCode First的使用

config文件 onf tsql .com mysql字符串 spa set web 不同 首先要準備一下的工具作為環境 MySQL Community Server 5.7.x My Workbench 6.3 VS2017 新建一個項目,NetMySQLCodeF

Asp.net MVC如何獲取控制器的名稱

tex 如何 route 控制 this .get data control str 如果在代碼中 當前controller、action的獲取RouteData.Route.GetRouteData(this.HttpContext).Values["controlle

asp.net mvchtml helper的一大優勢

ont size color 優勢 其中 系統 per .net strong 剛上手這個框架,發現其中的html helper用起來很方便,讓我們這些從web form 過渡來的coder有一種使用控件的快感,嘻嘻! 言歸正傳,我要說的是在使用它時,系統會自動執行表單的現

淺析Asp.net MVC Ajax的使用

x11 生成 table ex18 review arp javascrip tle func 在ASP.NET MVC beta中我們可以使用Ajax.BeginForm, Ajax.ActionLink來進行Ajax調用,同樣我們也可以使用一些支持Ajax 框架如jQ

ASP.NET MVC 路徑的解惑

src javascrip pan 開頭 失效 如果 語言 baidu rip 很多人在寫代碼的時候關於路徑這個問題很頭疼,其實路徑是很簡單的,只是沒人幫我們點投!初次學習程序的人,我相信肯定會遇到和我一樣的問題,比如說,“/”和“~”引用路勁的區別,接下來看吧,這篇文章肯

Asp.net mvc使用配置Unity

ges mage bsp 使用 cacti .cn 技術 效果展示 onf 第一步:添加unity.mvc 第二步:在添加之後會在app_start中生成UnityConfig.cs,UnityMvcActivator.cs 第三步:使用 第四步:效果展示 Asp

asp.net mvc如何處理字符串與對象之間的序列化與反序列化(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

ASP.NET MVC利用Aspose.cells 將查詢出的數據導出為excel,並在瀏覽器下載。

width tdi 新增 column 需求 options 解決 印象 ats 正題前的嘮叨 本人是才出來工作不久的小白菜一顆,技術很一般,總是會有遇到一些很簡單的問題卻不知道怎麽做,這些問題可能是之前解決過的。發現這個問題,想著提升一下自己的技術水平,將一些學的新的‘好

log4net 使用總結- (1)在ASP.NET MVC 使用

站點 href 還需 配置文件 str nag org src stat 1. 去官網下載log4net.dll,增加引用到站點下(你也可以通過nuget 安裝) http://logging.apache.org/log4net/download_log4net.cgi

ASP.NET MVC使用Castle Windsor

tac col sta undle 文件中 isp path http start 平常用Inject比較多,今天接觸到了Castle Windsor。本篇就來體驗其在ASP.NET MVC中的應用過程。 Visual Studio 2012創建一個ASP.NET

ASP.NET MVC為DropDownListFor設置選中項的方法

相等 ret info href submit value and number else 在MVC中,當涉及到強類型編輯頁,如果有select元素,需要根據當前Model的某個屬性值,讓Select的某項選中。本篇只整理思路,不涉及完整代碼。 □ 思路 往前臺視圖傳的類型

asp.net mvc 使用單例

客戶端 using led sta .get list() ice 單例 namespace 有這樣一個service,需要運行的asp.net站點上,但要保證這個實例是唯一的。單例用來啟用聊天機器人,保證唯一,以免啟動多個,造成客戶端發送消息的時候,會造成每個機器人都發送