ASP.NET MVC 3.1 使用Scaffold產生Controller, Action與View

在ASP.NET MVC中,如果你是Model First或Database first,那可以使用Scaffold ( 它就像使用樣版來產生程式架構)來加速你MVC程式的開發。在 ASP.NET MVC 3.1 (等一下我們解釋) 中透過與 Entity Framework 的合作,再加上Scaffold,我們不只可以產生Controller, Action,連View 都可以一併產生,而且是一個可完整使用CRUD程式。如果你的Model或Batabase設計的很好,使用ASP.NET MVC 3.1的Scaffold功能,是有可能連一行程式都不用寫就可以產生一個網站。

參考:Julie的「MVC3.1 Scaffolding Magic with Database (or Model) First , Not Just Code First」(MVC 3.1是從這裡來的)

我的步驟和他一點點不同:(以Visual Basic and Northwind為例)
  1. 產生ASP.NET MVC 3專案
  2. 加入新專案,類別庫
  3. 在類別庫中,新增「ADO.NET 實體資料模型」,依序產生 *.edmx
  4. 由 *.edmx 產生 DbContext ( *.tt )
  5. 回到ASP.NET MVC 3專案,將 app.config 的連線字串複製到 web.config
  6. 參考「類別庫」專案
  7. 到 Controllers 目錄,新增控制器
  8. 修改Global.asax,將 .controller = "Home" 修改為你想要的 Controller,例如,.controller = "Employees"
  9. Ctrl + F5

如果你要使用 ASP 或 ASP.NET 花CRUD就要花費你多少時間,使用使用ASP.NET MVC 的 scaffold 功能,可以快速幫我產生所有 CRUD 的 controller, action, view,讓我們花更少的力氣可以做更多的事。

ASP.NET MVC 基本開發流程

1. Database 規劃( 3NF / BCNF ) --> 2. Model 產生 ( *.edmx / *.tt ) --> 3. 設計Controller / Action --> 4. View

1. Database 規劃( 3NF / BCNF )

我走的是Database First,所以把資料庫放在第一順位。如果你是Model First或Code First,請自行調整。
快速正規化入門:
  1. 1NF:單值。
  2. 2NF:PFD;R(X, Y, Z, A),X --> Y, Z,A不能被X決定,A為PFD。
  3. 3NF:非PK,不存在FD;R(X, Y, Z, A, B),X -->Y,Z,A,B;A --> B;A為非Key,但能決定B。
  4. BCNF:R中所有「決定屬性(唯一性)」均為CK。R(X, Y, Z, A, B), X,Y --> Z,A,B;A --> B;A非CK,但能決定B。

2. Model 產生 ( *.edmx / *.tt )

這部份很簡單與複雜。
簡單的是,百分之百都是由工具產生。複雜的是,*.edmx、*.tt這些檔案內容。

3. 設計Controller / Action

Controller只是命名,比較有關係是Routing。大部份時間都是在寫Action。
Action做三件是:
  1. DataBinding 設定
  2. 驗證資料
    1. Bind 屬性設定
    2. DataAnnotations 的Class設定
  3. 撰寫程式碼

4. View

當資料由Action傳送過來,我們要如何「顯示」。

Download all MSDN and TechNet Library Document

我們走MS這條路的人,一定無法避免看MSDN,這是MS的聖經。有時候反方面想想,很少有公司願意花那麼多時間、金錢在搞這種東西。一個完整的參考資料來源對我們而言是非常重要的。

在 透過Help Library Manager時,我一直有個疑問,為什麼不讓我們可以選擇下載完整版的MSDN?在很早期之前,可以和MS可以簽MSDN合約,記得是每一季會寄一份最 新版的MSDN光碟(最早是CD後來改 DVD),讓我們可以透過光碟來安裝所需的Library,可以因為種種原因,就不在寄送光碟了。雖然網頁很方便,但還是不及離線安裝在自己本機來的好, 如不能上網,一切免談!

最後,我實在忍不住,我上去 connect 去問MS,等了近一個月後,終於給我一個滿意的答案。

Help Team回答:
Greetings,

Thank you for your suggestion. There is a CodePlex project, PackageThis (link below), which enables selection of online MSDN content and generates a package of selected content for addition to the local Help store.

http://packagethis.codeplex.com/SourceControl/list/patches

The latest patch contains an update for the SP1 Help Viewer format (MSHC).

The Help Team

他們提到一個軟體Package This,這個軟體可以將MSDN及TechNet上所有的文件下載成為離線檔案(mshc格式),然後匯入Help Library Manager。

先感謝 H3Viewer 的作者,我之前就介紹過了( H3Viewer,我最推薦的MSDN閱讀及管理工具 ),想不到最後解決我問題的還是他,他提供了另一個超棒的工具 Package This, 這個工具可以讓我們下載所有的MSDN及TechNet文件,然後匯出成 *.chm 或 *.HxS (Visual Studio 2008 ~ 2002之前 Help使用格式) 或 *.Mshc ( Visual Studio 2010 Help 使用格式 )。

我們先下載 Package This! 1.3.4.0版,直接執行,


Package This

下載執行Package This,首先選擇「Library」,看你是要下載「MSDN」或「TechNet」的文件,然備選擇「Locale」,擇選你要的語系。例如,我要下載MSDN裡的ASP.NET MVC 3文件,因為ASP.NET MVC 3文件還沒有正體中文,所以我們的Locale必須選擇「英文(美國)」。如果是要下載ASP.NET MVC 2,那Locale就可以選擇「中文(繁體,台灣)」。

圖一:

勾選「Select This Node and All Children...」,可以選擇目前節點之下所有內容。(它會一個一個勾選,時間會有點久)

旁邊的空間區域也會開始跑出相關內容,

圖二:

等全部勾選完畢,就可以執行File → Export Mshc File,將勾選的文件匯出成*.mshc。我下載ASP.NET MVC 2正體中文全部內容約 31MB左右。

圖三:

 Product Name及Book Name修改成你想要的名稱。按下OK,即可匯出mvc3r.mshc。(匯出也需要一些時間)

匯出*.mshc完成之後,從Package This的File → Install Mshc Help File,它會提醒需要管理者權限,按下Yes,即可匯入。

圖四:從Package This匯入

這裡會選擇一個安裝設定檔,它會幫我們設定相關安裝參數。如果不想切換說明文件的目錄,可以將最後一個參數改為「zh-TW」,離線文件會安裝到相同的目錄下。

圖五:從Disk安裝

圖六:需要管理者權限

圖七:合併索引


圖八:從刪除內容確認安裝


開啟H3View,即可看到我們想要的離線說明文件。

圖九:H3View
 
有了Package This,你就可以擁有一個完整的MSDN與TechNet的技術文件,讓你想怎麼看就怎麼看。

小禮物:

ASP.NET MVC 3 Reference for Mshc File
ASP.NET MVC 2 參考 for Mshc File

解壓縮密碼:kkbruce

LINQ and Entity Framework筆記

Entity Framework 架構


圖一

圖二

LINQ 分頁


Function GetPaging(index As Integer, size As Integer) As IEnumerable
Dim db As New NorthwindEntities()
' 要Skip的筆數
Dim SkipPageSize As Integer = index * size
Dim result = (From n In db.Products …).Skip(SkipPageSize).Take(size)
Return result

End Function

LINQ 是否有資料


If (result.Count() = 0) Then
' 無資料處理

End If

LINQ 預先編譯


' 1.宣告全域變數
ReadOnly cq = System.Data.Objects.CompiledQuery.Compile(Of QnoDCEntities, DateTime, IQueryable(Of Orders))(Function(ctx, orderDate) From o In ctx.Orders Where o.OrderDate < orderDate Order By orderDate Select o)

' Compile(Of 實體, 參數1型別, 參數2型別, … , 參數n, IQueryable(Of 物件)) 參數型別依查詢式所需,可以有多個。  IQueryable(Of 物件)即Data Source。


Function(實體參數, 參數1名稱, 參數2名稱, … , 參數n名稱)  From o In DataSource … 此處的DataSource必須與IQueryable(Of 物件)對應  Where … > 參數1名稱 AndAlso ... < 參數2名稱 … 以參數進行過濾

' 2.主程式
Dim Order = cq.Invoke(QnoDCEntities, orderdate) 傳入實體及參數

' 可參考:http://msdn.microsoft.com/zh-tw/library/bb896297.aspx

LINQ 之CURD

' LINQ to Entity
' 新增
context.AddTo(EntityClass)(Data)
context.SaveChanges()
' 更新
result.欄位 = …
context.SaveChanges()
' 刪除
context.DeleteObject(Data)
context.SaveChanges()

' Entity Framework 4.1
' 新增
context.物件.Add(Data)
' 例如: context.Blogs.Add(blog)
context.SaveChanges()
' 更新
Dim blog = context.Blogs.Find(id)
context.Entry(blog).State = System.Data.EntityState.Modified
db.SaveChanges()
' 刪除
Dim blog = context.Blogs.Find(id)
db.Entry(blog).State = System.Data.EntityState.Deleted
db.SaveChanges()

串連 LINQ


Function Query1(…) As IQueryable(Of …)
    Return From … In …
End Function

Function Query2(Q1 As IQueryable(Of …), …) As IQueryable(Of …)
    Return From … In Q1 …
End Function

把Query1當成Query2的Data Source。

LINQ交易

1. SaveChanges() 已預設使用交易。
2. 兩個DataContext:使用Explicit交易。
3. 兩個Database:使用TransactionScope交易。

EDM自動跳號

1. Identiry (自動跳號)
2. computed ( Insert, Update都會更新),例如,DateTime型別。

關聯載入

1. 預設Lazy Loading (需要時才載入)
2. Load() 方法
3. Include(…) 方法

Create Query

方便組裝E-SQL。(Dynamic Query更好)
例如,
Dim Rusult = context.CreateQurey(Of …)(“E-SQL”, ObjectParameter(“Name”, …))

Entity Client

用法與SqlClient一樣。
EntityClient + E-SQL。
SqlClient + T-SQL。

E-SQL

1. 使用別名。
2. Select Value 別名。

Dynamic Query

Dim Result = context.Orders.Where(“it.OrderId = @Id”, New ObjectParameter(“Id”, …))

it是關鍵字。

EDMX 之 POCO

.edmx --> 非POCO,繼承EntityObject --> 序列化(XML)肥大  Web Service
EF 4.1 --> 轉換為POCO --> 序列化(JSON) --> WCF

DbContext

ASP.NET MVC可使用DbContext。(EF 4.1)

' 新增:context.Orders.Add(Data)
' 更新:
' 刪除:context.Orders.Remove(Data)
' 更OOP。

State

改變State可更新、刪除(配合Find())
' 找到Data
Dim Result = context.Orders.Find(“PK”)
context.Entity(…).State=EntityState.{Modified | Deleted}
SaveChanges()

批次新增

批次新增可先Disable Changes Tracker
db.Configuration.AutoDetectChangesEnabled = False
批次新增完成後,再Enable。

單純Query

單純Query,使用No Tracker
Dim Result = From o In db.Orders.AsNoTracking() Select o

Local查詢

Local技術,將連線資料處理模式帶到離線資料處理模式。
Dim Result = From o In db.Orders.Local Where o.SerialNumber.StartsWith("AK42") Select o

使用T-SQL

' 查詢
Dim Result = db.Orders.SqlQuery("select * from orders")
' 異動
Dim Result = db.Database.ExecuteSqlCommand("Insert ... Value {0}, {1}", 參數1, 參數2)

DbContext使用E-SQL

Dim Result = CType(db, System.Data.Entity.Infrastructure.IObjectContextAdapter)
.ObjectContext.CreateQuery("E-SQL")

ASP.NET 2.0 表單身份認證心得筆記

在網網相連中,看到一篇「Explained: Forms Authentication in ASP.NET 2.0」覺得寫的很好,雖然第一行的黃色字有點…,還是自己寫點筆記留個記錄。

ASP.NET身分驗證流程有二:IIS --> ASP.NET。

第一,一般對外網站在IIS部分都會使用匿名身份驗證(anonymous authentication),然後將使用傳遞給ASP.NET。
第二,ASP.NET執行自己的身份驗證。我們可以在 web.config 設定檔裡由authentication設定 mode 屬性來決定驗證的模式。

FileAuthorizationModule 類別
<authentication mode="Forms" />

ASP.NET 表單身分驗證

在ASP.NET裡,我們一般都是使用表單來驗證使用者。我們可以在 web.config 設定檔裡設定表單身分驗證預設屬性值。

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Login.aspx"
           protection="All"
           timeout="30"
           name=".ASPXAUTH" 
           path="/"
           requireSSL="false"
           slidingExpiration="true"
           defaultUrl="default.aspx"
           cookieless="UseDeviceProfile"
           enableCrossAppRedirects="false" />
  </authentication>
</system.web>

forms 預設屬性值

  • loginUrl
    指定指向您的應用程式自訂的登入頁(Login.aspx)。
  • protection
    保護所有設置,身份驗證ticket,會使用machineKey元素來進行加密。
  • timeout
    用於指定的表單身份驗證Session的有效時間。預設值為 30 分鐘。
  • name
    name和path設置為應用程式的設定檔中定義的值。
  • requireSSL
    此設定是指該 cookie 可以傳輸不是 SSL 加密的身份驗證。如果您擔心Session劫持,則應考慮為true。
  • slidingExpiration
    執行滑動的Session生存期設定為true。只要在網站上的使用者仍處於活動狀態,定期重新設定timeout的Session。
  • defaultUrl
    Default.aspx 預設首頁。
  • cookieless
    無cookie來指定應用程式使用的所有流覽器都支援 cookie 的 cookie 設置為UseDeviceProfile。如果流覽器不支援 cookie 訪問該網站,然後 forms 身份驗證套裝程式 URL 上的身份驗證票。
  • enableCrossAppRedirects
    指示該表單身份驗證不支援自動處理的查詢字串或表單 POST 的一部分的應用程式之間傳遞的ticket。

通過身份驗證認證後,我們還必須給適當的權限。

授權配置

UrlAuthorizationModule 類別 驗證使用者確實擁有權限,可以存取所要求的 URL。

透過 authorization 元素來設定UrlAuthorizationModule

<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>

此使此設定後,未經身份驗證的所有使用者都被拒絕訪問您網站的任何頁面。而且會將使用者重新導向登入頁(loginUrl屬性)。

表單身份驗證流程


  1. 使用者請求 Default.aspx 從您的IIS應用程式。IIS 允許請求,因為 IIS 啟用匿名訪問。ASP.NET確認授權的元素包括<deny users="?" />。
  2. 伺服器將尋找為身份驗證 cookie。如果未能找到身份驗證 cookie,則將使用者重導向到設定的登入頁 (Login.aspx)。起始頁的資訊放在RETURNURL作為Key的查詢字串。伺服器的 HTTP 答覆如下所示:
    302 Found Location:
    http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx
  3. 瀏覽器請求 Login.aspx 頁面,並在查詢字串中包含RETURNURL參數。
  4. 伺服器將返回登入頁面和 200 OK HTTP 狀態碼。
  5. 使用者在登入頁面上輸入帳號密碼,返回到伺服器。
  6. 伺服器驗證使用者帳號密碼,從如 SQL Server 資料庫或AD。在登入頁面中的撰寫程式碼,建立一個包含表單的身份驗證ticket為Session設定的 cookie。
    我們可以使用成員資格(Membership)系統:

    If (Membership.ValidateUser(userName.Text, password.Text)) Then
    
        If (Request.QueryString["ReturnUrl"] IsNot Nothing) Then
            FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
        Else
            ' 設定Cookie
            FormsAuthentication.SetAuthCookie(userName.Text, false);
        End If
    
    Else
        Response.Write("Invalid UserID and Password")
    End If
    
  7. 身份驗證的使用者中,伺服器將瀏覽器重新導向到原始 URL 查詢字串中指定的RETURNURL參數。伺服器的 HTTP 答覆如下所示:
    302 Found Location:
    http://localhost/TestSample/default.aspx
  8. 重新導向瀏覽器再次請求 Default.aspx 頁。此請求包含該表單的身份驗證 cookie。
  9. FormsAuthenticationModule類別檢測表單身份驗證 cookie,並對使用者進行身份驗證。身份驗證成功之後,FormsAuthenticationModule類別寫入HttpContext物件,有關身份驗證的使用者的資訊將被公開為屬性。
  10. 由於伺服器已驗證身份驗證 cookie,它授予存取權限,並返回 Default.aspx 頁。

FormsAuthenticationModule

在ASP.NET 2.0的本機 Web.config 設定檔(指的是 C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG 之下的 Web.config),定義了一組httpModules。裡面包含了身分驗證模組的數量。
<httpModules>
            <add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/>
            <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
            <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/>
            <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
            <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/>
            <add name="RoleManager" type="System.Web.Security.RoleManagerModule"/>
            <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/>
            <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/>
            <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule"/>
            <add name="Profile" type="System.Web.Profile.ProfileModule"/>
            <add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        </httpModules>
只有一個身分驗證模組會用於每個請求。通常我們會在網站中的 Webconfig 裡指定身份驗證模式。
<authentication mode="Forms" />
FormsAuthenticationModule類別建構一個GenericPrincipal物件,並將其儲存在 HTTP content。GenericPrincipal物件包含表示目前已通過身份驗證的使用者的FormsIdentity實例的參考。您應該允許表單身份驗證為你管理這些任務。如果你的應用程式有特別的要求,如使用者屬性設定在自訂的類別中實現IPrincipal介面,你的應用程式應該處理PostAuthenticate事件。FormsAuthenticationModule已驗證表單身份驗證的 cookie 並建立的GenericPrincipal和FormsIdentity物件之後,將觸發PostAuthenticate事件。在此程式碼中,可以建構包含的FormsIdentity物件及自訂的IPrincipal物件,然後將它儲存在HttpContext。 請注意:如果你這樣做,您還需要設定IPrincipal參考Thread.CurrentPrincipal屬性,以確保HttpContext物件和執行緒指向相同的身份驗證資訊。

表單身份驗證 Cookie

FormsAuthentication.SetAuthCookie或FormsAuthentication.RedirectFromLoginPage的方法被呼叫時,FormsAuthentication類別將自動建立身份驗證 cookie。

在典型的表單身份驗證 cookie 中包含以下屬性:

  • Name:此屬性指定 cookie 的名稱。
  • Value:此屬性指定 cookie 的值。

在典型的表單的身份驗證 cookie中,Value包含加密和簽名的FormsAuthenticationTicket物件字串表示形式。Cookie 包含以下屬性:

  1. Expires:此屬性指定 cookie 的過期日期和時間。
  2. Domain:此屬性指定 cookie 相關聯的網域。預設值為空( null or Nothing ).
  3. HasKeys:此屬性指示是否該 cookie 有次項目。
  4. HttpOnly:此屬性指定用戶端指令碼(client script)是否可以訪問 cookie。在 ASP.NET 2.0,此值始終設定為true。請注意不支援HttpOnly 屬性的 web 流覽器忽略該 cookie,或忽略該屬性,這意味著該Session仍有跨網站腳本攻擊可能。
  5. Path:此屬性指定 cookie 的虛擬路徑。預設值是"/",指定根目錄。
  6. Secure:此屬性指定是否僅應通過 HTTPS 連接傳輸 cookie。安全屬性應設置為true,這樣,cookie 受 SSL 加密。
  7. Version:此屬性指定 cookie 的版本號。

建立表單的身份驗證 Cookie

FormsAuthentication類別,如下所示建立表單的身份驗證 cookie。一旦使用者進行驗證,FormsAuthentication類別內部建立一個FormsAuthenticationTicket物件指定 cookie 的各項屬性。

' FAT(版本,名稱,核發日期,到期日期,永續性,使用者特定資料,目錄路徑)
' 使用者特定資料:userData 參數不能為 Nothing
Dim ticket As New FormsAuthenticationTicket(1,
                                            "userName",
                                            DateTime.Now,
                                            DateTime.Now.AddMinutes(30),
                                            False,
                                            String.Empty,
                                            FormsAuthentication.FormsCookiePath)

如果表單元素的protection屬性設定為All或Encryption,表單身份驗證使用的加密方法加密和簽名表單的身份驗證ticket。

Dim encryptedTicket As String = FormsAuthentication.Encrypt(ticket)

下面的內容顯示時protection屬性設定為All的過程:

  • 建立序列化的表單身份驗證ticket。建立的ticket以byte陣列表示。
  • 簽錄表單身份驗證ticket。
  • 加密表單身份驗證ticket。
  • 根據需要建立 HTTP cookie 或查詢字串。
    Dim authcooket As New HttpCookie(FormsAuthentication.FormsCookieName,
                                     encryptedTicket)
    
  • 設定表單的身份驗證 cookie 為Secure。
    authcooket.Secure = True
  • 設定HttpOnly。
  • 設定適當的 cookie 屬性。
  • 加入該 cookie 到 cookie集合。
    Response.Cookies.Add(authcooket)

每次接收到後續身份驗證請求後,FormsAuthenticationModule類別檢查身份驗證 cookie 的身份驗證ticket, 對它進行解密, 計算雜湊值中,和將有助於確保 cookie 不被篡改的 MAC (message authentication code) 值進行比較。最後,驗證的表單身份驗證ticket內所記載的過期時間。

請注意,因為此日期可以很容易偽造,ASP.NET不依賴 cookie 的過期日期。

角色授權

.NET Framework 2.0包含角色管理 API 使您能夠建立和刪除角色,並增加使用者和從角色中刪除使用者。

  • SQL Server:這是預設的Provider,並將角色資訊存儲在 SQL Server 資料庫中。
  • 授權管理器 (AzMan)。此Provider使用 AzMan 策略存儲在 XML 檔中,在AD中,或在AD中應用模式 (ADAM, Active Directory Application Mode) 作為其角色儲存。它通常用於 intranet 或外部網路 Windows 身份驗證和 Active Directory 用於進行身份驗證。

Cookieless 的表單身份驗證

表單元素的屬性控制此 Cookieless 功能。

  • UseCookies:此值強制的FormsAuthenticationModule類別使用 cookie 傳輸的身份驗證ticket。
  • UseUri:此值指示FormsAuthenticationModule類別重寫該 URL 傳遞身份驗ticket。
  • UseDeviceProfile:此值指示依看瀏覽器功能來決定,如果瀏覽器支援 cookie,就使用 cookie ;否則,該 URL 會被重寫。
  • AutoDetect:此值指示FormsAuthenticationModule類別檢測瀏覽器是否支援通過動態檢測機制的 cookie。如果檢測邏輯表示不支援 cookie,然後該 URL 就會被重寫。

如果您的應用程式設定為使用 cookieless 的表單身份驗證,並且正在使用FormsAuthentication.RedirectFromLoginPage方法,FormsAuthenticationModule類別會自動設定表單身份驗證ticket在 URL 中,例如,

http://localhost/CookielessFormsAuthTest/(F(-k9DcsrIY4CAW81Rbju8KRnJ5o_gOQe0I1E_jNJLYm74izyOJK8GWdfoebgePJTEws0Pci7fHgTOUFTJe9jvgA2))/Test.aspx

在 url 括弧中部分包含的 cookie 會包含的資料。在請求處理過程中,這些資料會被刪除。

成員資格和登入控制項

會員服務provider的憑證儲存和管理應用程式的使用者。它還提供了 API,當使用表單身份驗證時,簡化了驗證使用者憑證的工作。成員資格功能是提供provider model的基礎上建立的。此 model 允許實施和配置不同的Provider,指向不同的使用者儲存區。

  • Active Directory membership provider
  • SQL Server membership provider

您還可以增加自訂的使用者儲存的支援。建立MembershipProvider抽象基礎類別繼承的自訂provider。

ASP.NET 登入控制項自動使用成員資格和表單身份驗證,並將提示使用者輸入憑證、 驗證使用者、 恢復或更換密碼,等所需的邏輯封裝。

Web Farm

在 Web Farm中,不能保證哪台伺服器連續處理請求。如果一台伺服器上通過身份驗證的使用者和下一個請求轉到另一個伺服器,身份驗證ticket將失敗的驗證,並要求使用者重新進行身份驗證。

MachineKey元素中的validationKey和decryptionKey屬性用於雜湊演算法和加密的表單身份驗證ticket。這些屬性的預設值是AutoGenerate.IsolateApps。每個應用程式會動產生Key,而且每台伺服器上不同。為解決這一問題,validationKey和decryptionKey的值必須在 Web Farm中的所有電腦上的相同。