1. 程式人生 > >asp.net Forms Authentication

asp.net Forms Authentication

前言

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

l  使用者註冊(包括密碼的加密儲存)

l  使用者登入(包括密碼的驗證、設定安全Cookie)

l  使用者實體替換(使用自己的型別作為HttpContext.User的型別)

  有關Forms Authentication的原理等內容不屬於本文的討論範疇,大家可以通過在Google等搜尋引擎中輸入“Forms Authentication”、“Forms身份驗證”、“窗體身份驗證”等關鍵詞來檢視更多資源。本文僅從實用的角度介紹如何使用這一技術。

不使用Membership

  本文介紹的實現方式不依賴ASP.NET 2.0提供的Membership功能。這主要是因為,如果使用Membership,就必須用aspnet_regsql.exe實用工具配置資料庫,否則就得自己寫自定義的MembershipProvider。

  如果用aspnet_regsql.exe配置資料庫,就會導致資料庫中出現很多我們實際並不需要的表或欄位。此外更重要的是,預設的SqlMembershipProvider給很多資料表添加了ApplicationID列,其初衷可能是希望可以將多個應用程式的使用者全部放在一個庫裡,但又能彼此隔離。但實際情況是,每個應用程式都在其自身的資料庫中儲存使用者資料。因此,引入這個ApplicationID無端地在每次查詢使用者時增加了額外的條件。

  另一方面,如果考慮自己實現一個MembershipProvider,因為工作量巨大,有點得不償失。

  但是,如果不使用Membership,也就無法享受ASP.NET 2.0中新增的Login等控制元件的便利了。

與Forms Authentication相關的配置

  在web.config檔案中,<system.web>/<authentication>配置節用於對驗證進行配置。為<authentication>節點提供mode="Forms"屬性可以啟用Forms Authentication。一個典型的<authentication>配置節如下所示:

<authentication mode="Forms">

     <forms

         name=".ASPXAUTH"

         loginUrl="login.aspx"

         defaultUrl="default.aspx"

         protection="All"

         timeout="30"

         path="/"

         requireSSL="false"

         slidingExpiration="false"

         enableCrossAppRedirects="false"

         cookieless="UseDeviceProfile"

         domain=""

     />

</authentication>

  以上程式碼使用的均是預設設定,換言之,如果你的哪項配置屬性與上述程式碼一致,則可以省略該屬性例如<forms name="MyAppAuth" />。下面依次介紹一下各種屬性:

l  name——Cookie的名字。Forms Authentication可能會在驗證後將使用者憑證放在Cookie中,name屬性決定了該Cookie的名字。通過FormsAuthentication.FormsCookieName屬性可以得到該配置值(稍後介紹FromsAuthentication類)。

l  loginUrl——登入頁的URL。通過FormsAuthentication.LoginUrl屬性可以得到該配置值。當呼叫FormsAuthentication.RedirectToLoginPage()方法時,客戶端請求將被重定向到該屬性所指定的頁面。loginUrl的預設值為“login.aspx”,這表明即便不提供該屬性值,ASP.NET也會嘗試到站點根目錄下尋找名為login.aspx的頁面。

l  defaultUrl——預設頁的URL。通過FormsAuthentication.DefaultUrl屬性得到該配置值。

l  protection——Cookie的保護模式,可取值包括All(同時進行加密和資料驗證)、Encryption(僅加密)、Validation(僅進行資料驗證)和None。為了安全,該屬性通常從不設定為None。

l  timeout——Cookie的過期時間。

l  path——Cookie的路徑。可以通過FormsAuthentication.FormsCookiePath屬性得到該配置值。

l  requireSSL——在進行Forms Authentication時,與伺服器互動是否要求使用SSL。可以通過FormsAuthentication.RequireSSL屬性得到該配置值。

l  slidingExpiration——是否啟用“彈性過期時間”,如果該屬性設定為false,從首次驗證之後過timeout時間後Cookie即過期;如果該屬性為true,則從上次請求該開始過timeout時間才過期,這意味著,在首次驗證後,如果保證每timeout時間內至少傳送一個請求,則Cookie將永遠不會過期。通過FormsAuthentication.SlidingExpiration屬性可以得到該配置值。

l  enableCrossAppRedirects——是否可以將以進行了身份驗證的使用者重定向到其他應用程式中。通過FormsAuthentication.EnableCrossAppRedirects屬性可以得到該配置值。為了安全考慮,通常總是將該屬性設定為false。

l  cookieless——定義是否使用Cookie以及Cookie的行為。Forms Authentication可以採用兩種方式在會話中儲存使用者憑據資訊,一種是使用Cookie,即將使用者憑據記錄到Cookie中,每次傳送請求時瀏覽器都會將該Cookie提供給伺服器。另一種方式是使用URI,即將使用者憑據當作URL中額外的查詢字串傳遞給伺服器。該屬性有四種取值——UseCookies(無論何時都使用Cookie)、UseUri(從不使用Cookie,僅使用URI)、AutoDetect(檢測裝置和瀏覽器,只有當裝置支援Cookie並且在瀏覽器中啟用了Cookie時才使用Cookie)和UseDeviceProfile(只檢測裝置,只要裝置支援Cookie不管瀏覽器是否支援,都是用Cookie)。通過FormsAuthentication.CookieMode屬性可以得到該配置值。通過FormsAuthentication.CookiesSupported屬性可以得到對於當前請求是否使用Cookie傳遞使用者憑證。

l  domain——Cookie的域。通過FormsAuthentication.CookieDomain屬性可以得到該配置值。

  以上針對<system.web>/<authentication>/<forms>節點的介紹非常簡略,基本上是Anders Liu個人對於文件進行的額外說明。有關<forms>節點的更多說明,請參見MSDN文件(http://msdn2.microsoft.com/zh-cn/library/1d3t3c61(VS.85).aspx)。

FormsAuthentication類

  FormsAuthentication類用於輔助我們完成窗體驗證,並進一步完成使用者登入等功能。該類位於system.web.dll程式集的System.Web.Security名稱空間中。通常在Web站點專案中可以直接使用這個類,如果是在類庫專案中使用這個類,請確保引用了system.web.dll。

  前一節已經介紹了FormsAuthentication類的所有屬性。這一節將介紹該類少數幾個常用的方法。

  RedirectToLoginPage方法用於從任何頁面重定向到登入頁,該方法有兩種過載方式:

public static void RedirectToLoginPage ()

public static void RedirectToLoginPage (string extraQueryString)

  兩種方式均會使瀏覽器重定向到登入頁(登入頁的URL由<forms>節點的loginUrl屬性指出)。第二種過載方式還能夠提供額外的查詢字串。

  RedirectToLoginPage通常在任何非登入頁的頁面中呼叫。該方法除了進行重定向之外,還會向URL中附加一個ReturnUrl引數,該引數即為呼叫該方法時所在的頁面的URL地址。這是為了方便登入後能夠自動回到登入前所在的頁面。

  RedirectFromLoginPage方法用於從登入頁跳轉回登入前頁面。這個“登入前”頁面即由訪問登入頁時提供的ReturnUrl引數指定。如果沒有提供ReturnUrl引數(例如,不是使用RedirectToLoginPage方法而是用其他手段重定向到或直接訪問登入頁時),則該方法會自動跳轉到由<forms>節點的defaultUrl屬性所指定的預設頁。

  此外,如果<forms>節點的enableCrossAppRedirects屬性被設定為false,ReturnUrl引數所指定的路徑必須是當前Web應用程式中的路徑,否則(如提供其他站點下的路徑)也將返回到預設頁。

  RedirectFromLoginPage方法有兩種過載形式:

public static void RedirectFromLoginPage (string userName, bool createPersistentCookie)

public static void RedirectFromLoginPage (string userName, bool createPersistentCookie, string strCookiePath)

  userName引數表示使用者的標識(如使用者名稱、使用者ID等);createPersistentCookie引數表示是否“記住我”;strCookiePath引數表示Cookie路徑。

  RedirectFromLoginPage方法除了完成重定向之外,還會將經過加密(是否加密取決於<forms>節點的protection屬性)的使用者憑據存放到Cookie或Uri中。在後續訪問中,只要Cookie沒有過期,則將可以通過HttpContext.User.Identity.Name屬性得到這裡傳入的userName屬性。

  此外,FormsAuthentication還有一個SignOut方法,用於完成使用者登出。其原理是從Cookie或Uri中移除使用者憑據。

小結

  好了,至此所需要掌握的基礎知識就齊備了,接下來我們將實現使用者註冊、登入等功能。

相關推薦

asp.net Forms Authentication

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

【轉】權限管理學習 一、ASP.NET FORMS身份認證

datetime archive 什麽 void ole data nbsp onf href 【轉】權限管理學習 一、ASP.NET Forms身份認證 說明:本文示例使用的VS2017和MVC5。系統無論大小、牛逼或屌絲,一般都離不開註冊、登錄。那麽接下來我們就來分析下

細說ASP.NET Forms身份認證

使用者登入是個很常見的業務需求,在ASP.NET中,這個過程被稱為身份認證。 由於很常見,因此,我認為把這塊內容整理出來,與大家分享應該是件有意義的事。在開發ASP.NET專案中,我們最常用的是Forms認證,也叫【表單認證】。 這種認證方式既可以用於區域網環境,也可用於網際

ASP.NET Forms驗證

/// <summary> /// 執行使用者登入操作 /// </summary> /// <param name="config">授權配置資訊</param> /

asp.net Forms 身份驗證 html頁面

IIS 中預設是不支援靜態頁面進行Forms驗證,在網上找個了好多答案,配置都太過繁瑣 想讓IIS的Forms驗證 支援HTML靜態頁面其實只需要在web.config下進行簡單的配置就可以了 1、在  system.web節點 配置  Forms驗證 <sys

ASP.NET Forms 認證流程

class XML 設置 empty 成功 style .net () https ASP.NET Forms 認證 Forms認證基礎 HTTP是無狀態的協議,也就是說用戶的每次請求對服務器來說都是一次全新的請求,服務器不能識別這個請求是哪個用戶發送的。 那服務器如何去

.net core 共享 .Net Forms Authentication cookie

asp cnblogs ims ati iou 遷移 實現 沒有 rev Asp.net 項目遷移到 asp.net core 項目後需要 兼容以前老的項目的登錄方式。 Forms Authentication cookie 登錄。 從網上搜集到關於這個問題的

ASP.NET Core Authentication and Authorization

最近把一個Asp .net core 2.0的專案遷移到Asp .net core 3.1,專案啟動的時候直接報錯: ``` InvalidOperationException: Endpoint CoreAuthorization.Controllers.HomeController.Index (Core

ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal

前言 === 首先我們來看一下在ASP\.NET時代,Authentication是如何使用的。下面介紹的是`System.Web.Security.FormsAuthentication`: ``` // 登入 System.Web.Security.FormsAuthentication.SetAu

ASP.NET Core Authentication系列(二)實現認證、登入和登出

前言 === 在[上一篇文章](https://www.cnblogs.com/liang24/p/13910368.html)介紹ASP\.NET Core Authentication的三個重要概念,分別是Claim, ClaimsIdentity, ClaimsPrincipal,以及claims-b

ASP.NET Core Authentication系列(四)基於Cookie實現多應用間單點登入(SSO)

前言 === 本系列前三篇文章分別從ASP\.NET Core認證的三個重要概念,到如何實現最簡單的登入、登出和認證,再到如何配置Cookie 選項,來介紹如何使用ASP\.NET Core認證。感興趣的可以瞭解一下。 - [ASP.NET Core Authentication系列(一)理解Claim,

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

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

Asp.net authentication mode="Forms"

淘到的Form驗證過程:(如果所有頁面繼承了同一個判斷是否登入的類,路徑的判斷是個問題,檔案所處的位置可能不同,有的是二級選單,有的三級。。。還有的是通過Request.Url.LocalPath來獲取的,xp/iis5.1下如果設定虛擬目錄,取到的路徑是http://

[轉]asp.net權限認證:摘要認證(digest authentication)

imp 2個 端端 不一致 輸入 解析 操作 hash ostc 本文轉自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要認證簡單介紹 摘要認證是對基本認證的改進,即是用摘要代替賬戶密碼,從而防止明文傳輸中

asp.net Web API 身份驗證 不記名令牌驗證 Bearer Token Authentication 簡單實現

驗證 tca star ati manager ace .com return public 1. Startup.Auth.cs文件 添加屬性 1 public static OAuthBearerAuthenticati

Authentication and Authorization in ASP.NET Web API

module to server -h alter prop strong bar isa som ?You‘ve created a web API, but now you want to control access to it. In this series o

asp.netforms身份驗證 單用戶身份驗證

for dir rom conf orm author 驗證 name edi asp.net的forms身份驗證 單用戶身份驗證 首先要配置Web.config文件 <system.web> <authentication mode="For

ASP.NET Core 2.0 Cookie Authentication

pen builder class end collect exce enc ati develop using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder

ASP.NET Core [5]: Authentication(筆記)

login service 核心 體驗 ini .get aspnet eba 成功 原文連接:http://www.cnblogs.com/RainingNight/p/authentication-in-asp-net-core.html 在現代應用程序中,認證已不再

asp.net web formsasp.net mvc比較

https://www.cnblogs.com/liangxiaofeng/p/5583803.html asp.net web forms和asp.net mvc比較 ASP.NET Webforms Behind Code的好處和存在的問題 ASP.NET Webforms是一