1. 程式人生 > >asp.net中常用的幾種身份驗證方式

asp.net中常用的幾種身份驗證方式

前言

在B/S系統開發中,經常需要使用“身份驗證”。因為web應用程式非常特殊,和傳統的C/S程式不同,預設情況下(不採用任何身份驗證方式和許可權控制手段),當你的程式在網際網路/區域網上公開後,任何人都能夠訪問你的web應用程式的資源,這樣很難保障應用程式安全性。通俗點來說:對於大多數的內部系統、業務支撐平臺等而言,使用者必須登入,否則無法訪問和操作任何頁面。而對於網際網路(網站)而言,又有些差異,因為通常網站的大部分頁面和資訊都是對外公開的,只有涉及到註冊使用者個人資訊的操作,或者網站的後臺管理等才需要提示登入。(如果不做嚴格驗證,後果將很嚴重,人家一旦猜出你web目錄下面的頁面名,可以隨意訪問。當然,一般的開發人員是不會犯這種低智商的錯誤的)。

如何實現“身份驗證”

記得N年前我最早接觸Servlet + JSP開發的時候,有一種叫做“過濾器”(Filter)的東西,真是很神奇。有了這件神奇的東西后,我再也不需要去每個頁面判斷什麼“session”或者“cookie”了,就能把未登入使用者給彈出去(水平實現有限)。當然,在傳統webform開發中,也可以寫一個“BasePage的雞肋”,在該類中去做判斷,讓每個頁面對應的類都去實現這個"雞肋",我看以前很多公司都是這麼幹的。

在asp.net中,其實微軟提供了一整套的完整的機制來實現“成員角色管理”。包含有:”登入控制元件”、“membership”、“個性化資料庫”等等。但是大多數開發人員是從來不用這些的(例如我,用微軟的asp.net三四年,還從來沒見過“登入控制元件”長啥樣)。在asp.net身份驗證中,主要有三四種。因為有些身份驗證的方式是依賴於IIS和windows作業系統的,所以在不同版本的作業系統和IIS上還是有些差異的。由於筆者暫時使用的是windows 7的作業系統,所以就拿IIS 7.5為例子。

首先開啟IIS,然後雙擊右側“身份驗證”,會顯示出當前IIS支援的所有的身份驗證方式(由於我安裝IIS時候,在“安全性”那裡我是全部勾選的)。可以看到如圖:

大致分為如下幾種:

1.活動目錄的客戶端證書(這個很可能是收費的),不常用,不細說。

2.ASP.NET模擬(MSDN:如果要在 ASP.NET 應用程式的非預設安全上下文中執行 ASP.NET 應用程式,請使用 ASP.NET 模擬。),機器人說的我聽不懂。

3.Form身份驗證:這個用的很多,後面會細說。

4.windows身份驗證:基於windows作業系統的使用者或者域使用者的身份驗證。

5.基本身份驗證:其實也是基於windows作業系統的賬戶驗證的。

6.匿名身份驗證:誰都可以訪問,其內部也是通過指定一個特定的windows系統的user賬戶來訪問的。

7.摘要身份驗證:使用 Windows 域控制器對請求訪問 Web 伺服器內容的使用者進行身份驗證。

再來看看經典的 IIS 6的截圖:

 注:.NET Passport 可以理解為微軟對“單點登入”的一種實現方案,這裡不細說。感興趣的朋友可以參考http://baike.baidu.com/view/1182418.htm及相關資料。在“Open API”  "SOA"  “雲端計算”大行其道的今天,作為一個web程式設計師,如果你還沒聽說過“單點登入”,請自行購買開往福州方向的動車票。

先在IIS 7上測試一下基本身份驗證:

首先把其他的身份驗證方式全部禁用掉,然後僅僅啟用“基本身份驗證”。有圖有真相:

然後開啟IE、FireFox、chrome等瀏覽器,敲入localhost,等待開啟IIS上的預設網站。你會發現,瀏覽器端都會彈出提示框資訊,而且在不同瀏覽器上彈出框的樣式和表現形式也有所差異。(長期不用IE,發現360這個老流氓把哥的首頁給改了,還號稱”安全上網“,這明顯是篡改行為嘛。搞不懂。)

FireFox中:

如果你在彈出框中,輸入正確的windows賬戶和密碼,則可以正常的瀏覽你請求的網頁。如果你不輸或者輸錯了,等待你的將是401錯誤(401,你懂得)。

”沒有為網站啟用SSL,將通過電纜以明文的方式.....”,機器人說的話聽起來很彆扭,這裡,我解釋一下。

當你沒有花錢去買SSL證書(安全套接層,你可以簡單的理解為:正常http請求都是明文傳送,使用SSL後可以幫你把http報文自動加密,就算有人在網際網路上截獲了也無法解密。我們偶爾訪問有些網站的時候,看到的“https://www.xxx.com”,就極可能是基於SSL證書的形式)。至於“通過電纜以明文的方式...”,其實這句話說的很不對,首先,電纜只是一種傳輸介質,裡面傳送的只是電脈衝、光訊號等等,而不是網路協議報文(學過計算機網路的都知道)。至於說“採用明文的形式”,也不對,其實“基本身份驗證”中,是將使用者名稱和密碼採用了Base64編碼的,感興趣的讀者,可以用httpwatch或者Fiddler之類的工具去監視一下http請求,我這裡就不做演示了 。只是由於Base 64編碼很容易反編碼,所以和明文沒啥區別。這樣一來,你會發現“基本身份驗證”方式,確實存在很多不安全因素。

在IIS 7上測試一下 windows 身份驗證:

和之前的基本身份驗證差不多,我就不再截圖演示了。如果使用者輸入正確的windows使用者名稱和密碼,則能夠正常訪問網站。如果輸入錯誤的,則返回的401.1(前面基本身份驗證是401.2)。值得一提的就是,記得之前有位asp.net MVP 曾告訴過我,使用windows身份驗證的時候,只能使用者在使用IE瀏覽器時候才能夠正常訪問。因為這種情況下,不是使用http報文傳輸的形式,而是瀏覽器端直接與作業系統內部互動,進行使用者名稱和密碼的驗證。經過證實,發現這話的後半句是對的,確實監視不到http實體內容。但不僅僅侷限於IE瀏覽器,我在firefox中也能夠正常的訪問和使用。

匿名身份驗證:

所謂匿名身份驗證,其實就可以理解為“不驗證”。就是匿名使用者都可以訪問資源,沒有任何限制。通常我們的網站,都要啟用匿名方式驗證,整合windows身份驗證。不難發現,其實匿名身份驗證,也是通過windows使用者組裡面的一個特定的使用者來通過驗證的,如圖所示:

最後一種,Form身份驗證:

前面所講的那些身份驗證方式,其實都和asp.net沒有直接的聯絡,都是IIS 和作業系統級別的驗證方式。而Form 身份驗證,則需要asp.net提供支援。因為通常網站的身份驗證和成員管理都非常複雜,而不是通過單純的某一種驗證方式能夠實現的。對於大部分網際網路的網站而言,使用者可以訪問部分頁面,但部分頁面必須登入後才能訪問和操作,而且不同使用者角色登入,操作許可權也不一樣。這又會涉及到很多方面的知識,而且實現方式也有很多種。

由於篇幅和時間有限,今天就先到此。後期我再詳細地去整理關於Form身份驗證的詳細及成員管理,許可權管理方面的文章,敬請期待。

相關推薦

asp.net常用身份驗證方式

前言 在B/S系統開發中,經常需要使用“身份驗證”。因為web應用程式非常特殊,和傳統的C/S程式不同,預設情況下(不採用任何身份驗證方式和許可權控制手段),當你的程式在網際網路/區域網上公開後,任何人都能夠訪問你的web應用程式的資源,這樣很難保障應用程式安全性。通俗

ASP.NET彈出框提示基本實現方法

sys find xxxxx 文章 hello sage rtu msg CI 我們在.NET程序的開發過程中,常常需要和用戶進行信息交互,比如執行某項操作是否成功,“確定”還是“取消”,以及選擇“確定”或“取消”後是否需要跳轉到某個頁面等,下面是本人對常用對話框使用的小結

Asp.Net的三分頁方式總結

rom chang clas 綁定 select proc dll xtend tinc 本人ASP.net初學,網上找了一些分頁的資料,看到這篇文章,沒看到作者在名字,我轉了你的文章,只為我可以用的時候方便查看,2010的文章了,不知道這技術是否過期。 以下才是正文

asp.net常用頁面間傳遞引數的方法,及各自優缺點

1、頁面重定向方式中常用的兩 (1)Redirect 方法將客戶端重定向到新的頁面,只是簡單地終止當前頁面,並轉入新的頁面開始執行,對轉入的頁面無任何限制。 (2)Transfer 方法終止當前頁的執行,併為當前請求開始執行新的頁面。把執行流程從當前頁面轉到同一伺服器中的

請寫出在ASP.NET常用頁面間傳值的方法,並說出它們的特點。

QueryString 傳遞一個或多個安全性要求不高或是結構簡單的數值。但是對於傳遞陣列或物件的話,就不能用這個方法了  session(viewstate) 簡單,但易丟失 作用於使用者個人,過量的儲存會導致伺服器記憶體資源的耗盡。   application 物件的作用範

[ASP.NET]ASP.NET常用的26個優化性能方法

障礙 SQ 處理請求 cache 可能性 減少 調用服務 打開 tostring 1. 數據庫訪問性能優化  數據庫的連接和關閉訪問數據庫資源需要創建連接、打開連接和關閉連接幾個操作。這些過程需要多次與數據庫交換信息以通過身份驗證,比較耗費服務器資源。ASP.NET中提供了

ASP.Net Core WebApi版本控制對比

 一、版本控制的好處: (1)有助於及時推出功能, 而不會破壞現有系統。 (2)它還可以幫助為選定的客戶提供額外的功能。 API 版本控制可以採用不同的方式進行控制,方法如下: (1)在 URL 中追加版本或作為查詢字串引數, (2)通過自定義標頭和通過接受標頭 在這篇文章中, 讓我們來看看如何支

Asp.net下載檔案方式

protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response物件提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite 下載超過400mb的檔案時導致Aspnet_wp.

ASP.NET 的表單身份驗證(Forms Authentication)

表單驗證可以通使用一個登入頁面驗證使用者的使用者名稱和密碼。未通過驗證的請求會被重定向到登入頁面,要求使用者輸入其憑據資訊(同常是使用者名稱和密碼)。如果請求通過驗證,系統將簽發一個身份驗證票據,在使用者會話期間,這個票據維護使用者的身份標識資訊以及使用者角色。通過FormsAuthentication 類

asp.net 下載檔案方式

protected void Button1_Click(object sender, EventArgs e)   {   /*   微軟為Response物件提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite   下載超過400mb的檔案時導

asp.net 執行js 方法

方法二: <asp:Literal ID="ltScript" runat="server"></asp:Literal> 然後使用Literal類,在後臺程式碼使用時 private void Button1_Click(object sender

asp.net core 3.1多種身份驗證方案,cookie和jwt混合認證授權

開發了一個公司內部系統,使用asp.net core 3.1。在開發使用者認證授權使用的是簡單的cookie認證方式,然後開發好了要寫幾個介面給其它系統呼叫資料。並且只是幾個簡單的介面不準備再重新部署一個站點,所以就直接在MVC的專案裡面加了一個API區域用來寫介面。這時候因為是介面所以就不能用cookie方

Makefile賦值方式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android網路請求方式詳解

Android應用經常會和伺服器端互動,這就需要手機客戶端傳送網路請求,下面介紹四種常用網路請求方式,我這邊是通過Android單元測試來完成這四種方法的,還不清楚Android的單元測試的同學們請看Android開發技巧總結中的Android單元測試的步驟一文。 java

Android 監聽方式

這篇部落格主要寫的是Android中的幾種監聽的方式  簡單易用 第一種方式 b1.setOnClickListener(new OnClickListener(){               @Override             publicvoid on

Laravel跳轉方式

$(function(){ $.ajaxSetup({ headers: { 'X-CSRF-TOKEN' : '{{ csrf_token() }}' } }); $("#generate").click(function(){ $.ajax({

ASP.Net頁面傳值的方式

webconfig local 區別 重啟 Nid 傳遞對象 app too BE 大致概括一下,ASP.NET 頁面之間傳遞值得方式大致可以分為如下幾種:Request.QueryString["name"],Request.Form("name"),Session,Co

關於ASP.NET MVC 5 的一簡單的身份驗證方式:FormsAuthentication.Authenticate

在ASP.NET MVC 5中,身份驗證分別有三種方式。分別為使用FormsAuthentication、MemberShip和Identity進行驗證。   (PS:本系列的邏輯程式碼請勿直接用於生產,請自己多加一層抽象後再投入使用)   為了展示這三種方式,我們先新建一個MVC

ASP.NET 得到網站絕對路徑的方法

在編寫 ASP.NET 應用程式的時候,有時為了更好地進行控制靜態檔案的路徑,如在模板頁或者使用者控制元件中設定js或者css檔案的路徑等,採用絕對路徑是難免的。下面就是幾種獲取絕對路徑的幾種方法。 C# 程式碼 VirtualPathUtility.ToAbsolute( " ~/ " ) HttpR

Asp.net 檔案下載方式

C# code ASP.NET檔案下載 //TransmitFile實現下載 protected void Button1_Click(object sender, EventArgs e) { /* 微軟為Response