Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Pro ASP.NET 2.0 In CSharp 2005 (2005) [eng]

.pdf
Скачиваний:
107
Добавлен:
16.08.2013
Размер:
29.8 Mб
Скачать

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