.NET Web的身份認證

来源:http://www.cnblogs.com/yubaolee/archive/2016/03/01/5229167.html
-Advertisement-
Play Games

百度一下”asp.net身份認證“,你會得到很多相關的資料,這些資料通常上來就會介紹諸如”Form認證“”Windows認證“等內容,而沒有給出一個完整的流程。初學者對此往往一頭霧水,我也曾經被坑過很多回,於是寫下此文,算是複習。 現代的Windows Server系統都是基於嚴格的用戶機制的,當你


    百度一下”asp.net身份認證“,你會得到很多相關的資料,這些資料通常上來就會介紹諸如”Form認證“”Windows認證“等內容,而沒有給出一個完整的流程。初學者對此往往一頭霧水,我也曾經被坑過很多回,於是寫下此文,算是複習。

    現代的Windows Server系統都是基於嚴格的用戶機制的,當你想操作伺服器時肯定需要賬號密碼驗證的。當我們把開發好的Web應用程式部署在伺服器後,用戶通過瀏覽器訪問該站點,實際上就是該用戶通過HTTP操作這台伺服器的過程,本質上也是用戶操作伺服器(至少是讀)的過程。這就產生了一個被大多數人忽略的問題:網路用戶根本不知道伺服器的賬號密碼,怎麼會有讀寫伺服器的許可權?答案可以用下麵一個簡單的圖給出:

              

  1 

         用戶發起一個請求後,授權主要經歷IIS階段和ASP.NET階段。經過IIS時會得到系統賬號相關許可權標識(或票據),使用該標識進入站點,這是asp.net運行時會把該標識轉化成.NET的一個用戶實體對象,我們就可以在自己的代碼中對該實體進行處理。通過一個具體的實例來認識一下,首先我們新建一個【不進行身份認證】的MVC項目(WebForm項目亦可),為了方便描述,就叫WebAuth吧!

1

        項目預設有HomeController和三個Action:Index/About/Contact。編譯生成,並把它部署到iis上,為了方便我直接部署成http://localhost。就從這裡開始身份認證之旅吧!

IIS階段

一、匿名身份認證

        一般公司或個人開發ASP.NET的網站用的都是這種方式。比如剛剛部署的Web,我們在IIS的功能視圖中打開身份驗證:

2

        可以看到預設的就是匿名身份認證。這種情況下不需要任何的認證,我們就可以訪問伺服器上的內容。之所以能這麼方便的訪問伺服器的內容,是因為IIS在後臺幫我們做了很多事情。當我們安裝IIS時,安裝程式會自動創建 IUSR_ComputerName 帳戶(其中 ComputerName 是正在運行 IIS的電腦名稱),普通用戶使用瀏覽器訪問該站點時,就是直接使用這個賬號來操作伺服器。我們在開發過程中常常碰到讀寫伺服器某文件沒有許可權,這時百度一下,都會告訴你要修改IUSR_Computername用戶許可權,就是這個原因。

二、基本身份認證

        不修改任何代碼。我們在IIS中禁用”匿名身份認證“,啟用”基本身份認證“,這時我們再訪問項目的項目中的時,瀏覽器會彈出一個對話框要求用戶輸入自己的用戶名和密碼,如下圖:

2

        這個賬號必須是伺服器系統的賬號,且擁有對站點根目錄讀(寫)的許可權。可以在目錄的文件夾屬性->安全性上設置。我專門添加了個賬號test,如下:

3

        返回瀏覽器,輸入用戶名test和設置的密碼即可訪問項目的所有頁面。在不需要複雜用戶邏輯的項目中使用該方法,可以不用修改任何代碼實現認證。

        不過基本身份認證有個非常嚴重的安全問題,通過這種方式的用戶名和密碼都以明文形式在網路間進行發送,很容易被攔截獲取。而且要知道這個賬號可是伺服器的賬號!可以用SSL加密來解決這個問題。

三、摘要式身份認證

        摘要式身份驗證提供與基本身份驗證相同的功能,即當用戶訪問http://localhost 時同樣彈出輸入賬號和密碼的對話框。但是這種認證方式在通過網路發送用戶憑據方面提高了安全性。具體流程如下:

4

  1. 客戶從運行 IIS 的伺服器請求文件。
  2. IIS 拒絕請求,告訴給客戶端正在使用摘要式身份驗證,併發送領功能變數名稱稱。
  3. Internet Explorer 提示用戶輸入憑據(用戶名和密碼)。然後,Internet Explorer 合併這些憑據和領功能變數名稱稱以創建一個 MD5 哈希,並從運行 IIS 的伺服器重新提交文件請求,此時發送的是 MD5 哈希。
  4. 運行 IIS 的伺服器接收哈希,並將客戶端的哈希發送到域控制器以進行驗證。
  5. 域控制器向運行 IIS 的伺服器通知驗證結果。
  6. 如果客戶端已經過身份驗證,則 IIS 將請求的文檔或數據發送到客戶端。

這裡特別註意一下:什麼是Active Directory?它就是一個普通的Windows服務,通過資料庫把系統的網路對象信息存儲起來,比如系統的賬號,用戶組,共用資源等。可以方便使用者方便的查找和使用這些信息。

四 Windows身份認證

        同上,這種認證方式對於客戶端用戶來說和基本認證並沒有什麼區別,但實際上它比基本認證要複雜的多。這種方式在通過網路發送用戶名和密碼之前,先將它們進行哈希計算。當啟用集成 Windows 身份驗證時,用戶的瀏覽器通過與 Web 伺服器進行密碼交換(包括哈希)來證明其知曉密碼。集成 Windows 身份驗證是 Windows Server 2003 家族成員中使用的預設驗證方法。

        Windows 身份認證主要有兩種方式:NTLM 方式和Kerberos V5。如果在 Windows 2000 或更高版本域控制器上安裝了 Active Directory 服務,並且用戶的瀏覽器支持 Kerberos v5 驗證協議,則使用 Kerberos v5 驗證,否則使用 NTLM 驗證。這兩種方式的詳細講解可參考A大的這篇文章:http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html

asp.net階段

       上面四種是IIS伺服器提供的驗證方式,當用戶通過IIS的用戶驗證後,就可以得到一個Windows的身份,這個身份將會被傳到我們自己的項目WebAuth中。打開工程的Web.config文件,有一項authentication配置:

<authenticationmode="Windows"/>

        這裡的Windows和IIS里的Windows身份認證不同。這裡指將IIS獲取的Windows用戶直接傳到網站中使用,可以在index.cshtml中添加以下代碼訪問:

當前登錄狀態:@Request.IsAuthenticated<br/>
當前登錄用戶:@User.Identity.Name

        IIS使用匿名認證以外的任何帶輸入框的認證,效果如下:

_3

        通常情況這種方式並沒什麼卵用,絕大多說情況我們的IIS都只用“匿名身份認證”方式。然後在自己的站點里開發自己的用戶邏輯,將authentication的mode設置為forms,即我們耳熟能詳的Form認證。

        Form認證的核心原理很簡單,用戶在請求信息中攜帶自己的身份證明(用戶名&密碼),站點驗證通過後,向用戶頒發一張證明身份的票據,客戶端通過Cookie的方式來存儲這個票據,在以後的請求中,通過在請求中附帶票據來證明身份。園子里有位大神通過以系列的實例講的非常清楚:http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html,微軟官方為Form認證提供了全方位的支持與擴展----Membership及Identity!關於這兩種方式,騰飛兄在他的博客裡面講解的也非常詳細:http://www.cnblogs.com/jesse2013/p/membership.html


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

-Advertisement-
Play Games
更多相關文章
  • 作為老牌的 Visual Studio 控制項集,ComponentOne 今後的發展方向是什麼?新的一年會在哪些方面有所增強?且聽 ComponentOne 全球產品經理的 2016年規劃。
  • 1.調用統一下單介面驗簽失敗 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_1 開始的時候是string Format格式填寫參數,錯。後來翻看其他博客和微信demo,才得知應該這樣寫: //將數據添加到字典中 SortedDict
  • 後臺創建了一個DntHub的集線器 前臺在調用的時候出現了問題(經檢查是代理對象創建失敗) 於是到StackOverflow上面找了下: http://stackoverflow.com/questions/14146913/signalr-cannot-read-property-client-o
  • 軟體開發中,有時迫不得已要用到第三方的軟體,這時就涉及到在C#應用程式需要對第三方軟體打開、顯示、隱藏以及關閉。 下麵列舉了幾個常用的方式 打開應用程式,下麵是2種簡單用法: 第一種: public enum ShowWindowCommands : int { SW_HIDE = 0, SW_SH
  • 自從在ASP.NET MVC中使用NuGet添加SignalR類庫之後,再次運行程式時,它出現了一個異常: Server Error in '/' Application. The following errors occurred while attempting to load the app.
  • 依雲成績查詢系統,一款學校學生成績查詢軟體,管理員只需錄入學生信息、添加成績模板、上傳學生成績,學生即可網上查詢成績。查詢成績更加方便,實現無紙化成績查詢,大大節省列印裁剪成績條時間。
  • ASP.NET網站部署到IIS中的關鍵點:1、Windows XP運行IIS的帳號為“電腦名\ASPNET”,Windows Vista、Windows Server 2003運行IIS的帳號為“NETWORK SERVICE”。如果網站下的某個文件夾供用戶上傳圖片、文件,則運行IIS的帳號必須擁
  • 最近做了個服務用來分解料單、計算可用庫存,日消耗一類的操作,以WebService的方式發佈並掛在IIS上,客戶端啟動任務後可能會關閉(等第二天過來看結果) 基本的做法都是在獨立的線程中運行任務併在運行過程中寫一些狀態/進度到全局變數中如(static類型的變數或Application等),客戶端每
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...