Pro ASP.NET 2.0 In CSharp 2005 (2005) [eng]
.pdf
x ■C O N T E N T S
Application Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Application Directory Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
The Global.asax Application File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Demonstrating Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
ASP.NET Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
The Machine.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
The Web.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Configuration Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Reading and Writing Configuration Sections Programmatically . . . . . . . . . . . . . 168
The Website Administration Tool (WAT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Extending the Configuration File Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Encrypting Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
.NET Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Creating a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Using a Component Through the App_Code Directory . . . . . . . . . . . . . . . . . . . . 179
Using a Component Through the Bin Directory . . . . . . . . . . . . . . . . . . . . . . . . . 180
Extending the HTTP Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
HTTP Handlers and HTTP Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Creating a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Configuring a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Registering HTTP Handlers Without Configuring IIS . . . . . . . . . . . . . . . . . . . . . . 186
Creating an Advanced HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Creating a Custom HTTP Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
■CHAPTER 6 State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
ASP.NET State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
A View State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Storing Objects in View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Retaining Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Assessing View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Trimming View State in a List Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
View State Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Transferring Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
The Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Cross-Page Posting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Cross-Page Posting and Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Custom Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Session Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Using Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Configuring Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Securing Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
■C O N T E N T S xi
Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Static Application Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
PART 2
■CHAPTER 7
■ ■ ■ Data Access
ADO.NET Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
The ADO.NET Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 ADO.NET Data Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Standardization in ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Fundamental ADO.NET Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
The Connection Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Testing a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Connection Pooling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Connection Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
The Command and DataReader Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Command Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 The DataReader Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 The ExecuteReader() Method and the DataReader . . . . . . . . . . . . . . . . . . . . . . 242 The ExecuteScalar() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 The ExecuteNonQuery() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 SQL Injection Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Using Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 Calling Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Transactions and ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Isolation Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 Savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Nested Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Creating the Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 Create Objects with Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 A Query with Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
■CHAPTER 8 |
Data Components and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . |
265 |
|
Building a Data Access Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
265 |
|
The Data Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
267 |
|
The Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
267 |
|
The Data Utility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
268 |
|
Testing the Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
274 |
xii |
■C O N T E N T S |
|
|
|
|
Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
276 |
|
|
Web Applications and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
277 |
|
|
XML Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
277 |
|
|
The DataSet Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
278 |
|
|
The DataTable Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
279 |
|
|
The DataRow Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
280 |
|
|
The DataAdapter Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
280 |
|
|
Filling a DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
280 |
|
|
Working with Multiple Tables and Relationships . . . . . . . . . . . . . . . . . . . . . . . . |
282 |
|
|
Searching for Specific Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
286 |
|
|
Using the DataSet in a Custom Data Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
286 |
|
|
Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
287 |
|
|
The DataView Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
288 |
|
|
Sorting with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
288 |
|
|
Filtering with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
290 |
|
|
Advanced Filtering with Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
292 |
|
|
Calculated Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
292 |
|
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
294 |
|
■CHAPTER 9 |
Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
295 |
|
|
Basic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
296 |
|
|
Single-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
296 |
|
|
Other Types of Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
298 |
|
|
Repeated-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
302 |
|
|
Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
309 |
|
|
The Page Life Cycle with Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
310 |
|
|
The SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
311 |
|
|
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
312 |
|
|
Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
314 |
|
|
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
318 |
|
|
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
318 |
|
|
Disadvantages of the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
322 |
|
|
The ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
323 |
|
|
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
324 |
|
|
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
328 |
|
|
Updating with a Data Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
329 |
|
|
The Limits of the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
331 |
|
|
The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
331 |
|
|
Adding the Extra Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
332 |
|
|
Handling the Extra Options with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . |
333 |
|
|
Handling the Extra Options with the ObjectDataSource . . . . . . . . . . . . . . . . . . . |
334 |
|
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
334 |
cfcc92341c6f899259450967e289be90
■C O N T E N T S xiii
■CHAPTER 10 Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
The GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Defining Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Formatting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GridView Row Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Using Selection to Create a Master-Details Form . . . . . . . . . . . . . . . . . . . . . . . 346
The SelectedIndexChanged Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Using a Data Field As a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Sorting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Sorting and Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Advanced Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Automatic Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Custom Pagination with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . 357
Customizing the Pager Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Binding to a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Editing with a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
The DetailsView and FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Advanced Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Summaries in the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
A Parent/Child View in a Single Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Serving Images from a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Detecting Concurrency Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
■CHAPTER 11 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
391 |
Understanding ASP.NET Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Declarative Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Caching and the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Caching with Specific Query String Parameters . . . . . . . . . . . . . . . . . . . . . . . . 395
Custom Caching Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Caching with the HttpCachePolicy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Post-Cache Substitution and Fragment Caching . . . . . . . . . . . . . . . . . . . . . . . . 398
xiv |
■C O N T E N T S |
|
|
|
|
Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
400 |
|
|
Caching to Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
401 |
|
|
Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
401 |
|
|
Adding Items to the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
402 |
|
|
A Simple Cache Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
404 |
|
|
Cache Priorities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
405 |
|
|
Caching with the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
406 |
|
|
Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
409 |
|
|
File and Cache Item Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
410 |
|
|
Aggregate Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
410 |
|
|
The Item Removed Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
411 |
|
|
Understanding SQL Cache Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
413 |
|
|
Cache Notifications in SQL Server 2000 or SQL Server 7 . . . . . . . . . . . . . . . . . |
415 |
|
|
Cache Notifications in SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
419 |
|
|
Custom Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
420 |
|
|
A Basic Custom Cache Dependency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
421 |
|
|
A Custom Cache Dependency Using Message Queues . . . . . . . . . . . . . . . . . . . |
422 |
|
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
424 |
|
■CHAPTER 12 |
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
425 |
When Does Using XML Make Sense? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
An Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
The Advantages of XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Well-Formed XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
XML Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Writing and Reading XML Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Writing XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Reading XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Validating XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Displaying XML Content with XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
A Basic Stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Using XslTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Using the Xml Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
XML Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Nonhierarchical Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Using XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Nested Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Hierarchical Binding with the TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Using XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Binding to XML Content from Other Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Updating XML Through the XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
XML and ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Converting the DataSet to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Accessing a DataSet As XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Executing an XML Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■C O N T E N T S xv
■CHAPTER 13 Files and Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Working with the File System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The DirectoryInfo and FileInfo Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Working with Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Filter Files with Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Retrieving File Version Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
The Path Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
A File Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Reading and Writing Files with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Making Files Safe for Multiple Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
PART 3 ■ ■ ■ Building ASP.NET Websites
■CHAPTER 14 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
505 |
User Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Creating a Simple User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Converting a Page to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Adding Code to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Handling Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Adding Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Using Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
Adding Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Exposing the Inner Web Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Dynamically Loading User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Portal Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Partial Page Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
VaryByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Sharing Cached Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
■CHAPTER 15 Themes and Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
525 |
Standardizing Website Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Theme Folders and Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Applying a Simple Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
xvi |
■C O N T E N T S |
|
|
|
|
Handling Theme Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
531 |
|
|
Creating Multiple Skins for the Same Control . . . . . . . . . . . . . . . . . . . . . . . . . . |
532 |
|
|
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
533 |
|
|
Using CSS in a Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
535 |
|
|
Applying Themes Through a Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . |
536 |
|
|
Applying Themes Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
536 |
|
|
Standardizing Website Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
538 |
|
|
Master Page Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
538 |
|
|
A Simple Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
539 |
|
|
A Simple Content Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
541 |
|
|
Design-Time Quirks with Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
543 |
|
|
Default Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
546 |
|
|
A More Practical Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
546 |
|
|
Master Pages and Relative Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
548 |
|
|
Master Pages and Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
549 |
|
|
Applying Master Pages Through a Configuration File . . . . . . . . . . . . . . . . . . . . |
549 |
|
|
Advanced Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
549 |
|
|
Specifying a Title and Metatags for a Content Page . . . . . . . . . . . . . . . . . . . . . |
550 |
|
|
Interacting with the Master Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
550 |
|
|
Dynamically Setting a Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
552 |
|
|
Nesting Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
552 |
|
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
554 |
|
■CHAPTER 16 |
Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
555 |
Pages with Multiple Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
The MultiView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
The Wizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Defining a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Binding to a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Breadcrumbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Binding Portions of a SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Programmatic Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Binding Other Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Adding Custom Site Map Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Creating a Custom SiteMapProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
URL Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
The TreeView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
The TreeNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Populating Nodes on Demand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
TreeView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Menu Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Menu Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Menu Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
■C O N T E N T S xvii
■CHAPTER 17 |
Resources and Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
599 |
|
Resources in .NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
599 |
|
Localization of Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
607 |
|
Localization and the Common Language Runtime . . . . . . . . . . . . . . . . . . . . . . |
607 |
|
Local Resources for a Single Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
611 |
|
Sharing Resources Between Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
615 |
|
Localizing Static Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
617 |
|
Text Directions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
618 |
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
618 |
■CHAPTER 18 |
Website Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
619 |
|
Internet Information Services (IIS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
619 |
|
IIS and URL Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
620 |
|
Request Processing with IIS and ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
622 |
|
IIS 5.x Process Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
623 |
|
IIS 6.0 Process Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
626 |
|
Installing IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
631 |
|
Managing Websites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
634 |
|
Creating a Virtual Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
634 |
|
Virtual Directories and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
636 |
|
Folder Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
637 |
|
Managing Application Pools in IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
641 |
|
Creating Application Pools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
641 |
|
Application Pools and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
644 |
|
Custom Application Pool Identities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
644 |
|
Deploying Your ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
647 |
|
Verifying the ASP.NET Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
648 |
|
ASP.NET Side-By-Side Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
650 |
|
Configure HTTP Runtime Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
651 |
|
Compilation Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
652 |
|
Deploying with Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
653 |
|
The VirtualPathProvider in ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
655 |
|
Health Monitoring in ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
660 |
|
Understanding the Basic Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
660 |
|
Events and Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
660 |
|
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
664 |
PART 4 ■ ■ ■ Security
■CHAPTER 19 The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
667 |
What It Means to Create Secure Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
667 |
Understanding Potential Threats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
668 |
Secure Coding Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
668 |
Understanding Gatekeepers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
669 |
xviii ■C O N T E N T S
Understanding the Levels of Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Confidentiality and Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Pulling It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Internet Information Services Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
IIS Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
IIS Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
IIS and Secure Sockets Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
ASP.NET Security Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
The Security Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Membership and Roles APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
■CHAPTER 20 Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Introducing Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Why Use Forms Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Why Would You Not Use Forms Authentication? . . . . . . . . . . . . . . . . . . . . . . . . 692
Why Not Implement Cookie Authentication Yourself? . . . . . . . . . . . . . . . . . . . . 693
The Forms Authentication Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Implementing Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Creating a Custom Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Custom Credentials Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
Persistent Cookies in Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
■CHAPTER 21 Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
709 |
Introducing the ASP.NET Membership API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Using the Membership API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Creating the Data Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
Configuring Connection String and Membership Provider . . . . . . . . . . . . . . . . . 718
Creating and Authenticating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Using the Security Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
The Login Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
The LoginStatus Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
The LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
The PasswordRecovery Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
The ChangePassword Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
The CreateUserWizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Using the Membership Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Retrieving Users from the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
■C O N T E N T S xix
Updating Users in the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Creating and Deleting Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 748
Validating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
■CHAPTER 22 Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Introducing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Why Use Windows Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Why Would You Not Use Windows Authentication? . . . . . . . . . . . . . . . . . . . . . . 752
Mechanisms for Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Implementing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Configuring IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Configuring ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Accessing Windows User Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
Impersonation in Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Impersonation on Windows XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
Impersonation and Delegation on Windows Server 2003 . . . . . . . . . . . . . . . . . 767
Configured Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Programmatic Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
■CHAPTER 23 Authorization and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
URL Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Authorization Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
File Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Authorization Checks in Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Using the IsInRole() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784
Using the PrincipalPermission Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
Using the Roles Service for Role-Based Authorization . . . . . . . . . . . . . . . . . . . . . . . . . 787
Using the LoginView Control with Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Accessing Roles Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Using the Roles Service with Windows Authentication . . . . . . . . . . . . . . . . . . . 796
Protecting Non-Web-Page Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Adding a File Type Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Writing a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
■CHAPTER 24 Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
803 |
Understanding Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Profile Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
How Profiles Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Profiles and Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Profiles vs. Custom Data Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
