Sdílet prostřednictvím


Ochrana připojovacích řetězců a dalších konfiguračních údajů (C#)

Scott Mitchell

Stáhnout PDF

Aplikace ASP.NET obvykle ukládá informace o konfiguraci do souboru Web.config. Některé z těchto informací jsou citlivé a zaručují ochranu. Ve výchozím nastavení tento soubor nebude obsluhován návštěvníkovi webu, ale správce nebo hacker může získat přístup k systému souborů webového serveru a zobrazit obsah souboru. V tomto kurzu se dozvíme, že ASP.NET 2.0 umožňuje chránit citlivé informace zašifrováním oddílů souboru Web.config.

Úvod

Informace o konfiguraci pro ASP.NET aplikace se běžně ukládají do souboru XML s názvem Web.config. V průběhu těchto kurzů jsme párkrát aktualizovali Web.config . Při vytváření Northwind typové datové sady v prvním kurzu, například připojovací řetězec informace byly automaticky přidány do Web.config oddílu<connectionStrings>. Později v kurzu Stránky předlohy a navigace na webu jsme ručně aktualizovali Web.configa přidali <pages> prvek označující, že všechny stránky ASP.NET v našem projektu by měly používat DataWebControls motiv.

Vzhledem k tomuWeb.config, že mohou obsahovat citlivá data, jako jsou připojovací řetězec, je důležité, aby byl obsah Web.config uchovány v bezpečí a skryt před neoprávněnými diváky. Ve výchozím nastavení každý požadavek HTTP na soubor s .config příponou zpracovává modul ASP.NET, který vrací tento typ stránky, není obsluhována zpráva zobrazená na obrázku 1. To znamená, že návštěvníci nemůžou obsah souboru Web.config zobrazit jednoduše zadáním http://www.YourServer.com/Web.config do adresního řádku prohlížeče.

Při návštěvě Web.config prostřednictvím prohlížeče se vrátí tento typ stránky, není obsluhována zpráva.

Obrázek 1: Při Web.config návštěvě v prohlížeči se nezobrazí zpráva typu Tento typ stránky (kliknutím zobrazíte obrázek v plné velikosti).

Ale co když útočník najde nějaké další zneužití, které jí umožní zobrazit obsah souboru Web.config ? Co by mohl útočník s touto informací dělat a jaké kroky je možné provést k další ochraně citlivých informací?Web.config Většina oddílů Web.config naštěstí neobsahuje citlivé informace. Jakou škodu může útočník použít, pokud zná název výchozího motivu používaného vašimi ASP.NET stránkami?

Některé Web.config části však obsahují citlivé informace, které mohou zahrnovat připojovací řetězec, uživatelská jména, hesla, názvy serverů, šifrovací klíče atd. Tyto informace se obvykle nacházejí v následujících Web.config částech:

  • <appSettings>
  • <connectionStrings>
  • <identity>
  • <sessionState>

V tomto kurzu se podíváme na techniky ochrany těchto citlivých informací o konfiguraci. Jak uvidíme, rozhraní .NET Framework verze 2.0 obsahuje chráněný systém konfigurací, který programově šifruje a dešifruje vybrané konfigurační oddíly hračkou.

Poznámka:

V tomto kurzu se podíváme na doporučení Microsoftu pro připojení k databázi z aplikace ASP.NET. Kromě šifrování připojovací řetězec můžete systém posílit zabezpečením tím, že zajistíte, že se k databázi připojujete zabezpečeným způsobem.

Krok 1: Zkoumání možností chráněné konfigurace ASP.NET 2.0

ASP.NET 2.0 obsahuje chráněný konfigurační systém pro šifrování a dešifrování informací o konfiguraci. To zahrnuje metody v rozhraní .NET Framework, které lze použít k programovému šifrování nebo dešifrování konfiguračních informací. Chráněný konfigurační systém používá model zprostředkovatele, který vývojářům umožňuje zvolit, jakou kryptografickou implementaci se používá.

Rozhraní .NET Framework se dodává se dvěma chráněnými poskytovateli konfigurace:

Vzhledem k tomu, že chráněný konfigurační systém implementuje vzor návrhu zprostředkovatele, je možné vytvořit vlastního chráněného zprostředkovatele konfigurace a zapojit ho do aplikace. Další informace o tomto procesu najdete v tématu Implementace zprostředkovatele chráněné konfigurace.

Poskytovatelé RSA a DPAPI používají klíče pro své rutiny šifrování a dešifrování a tyto klíče je možné ukládat na úrovni počítače nebo uživatele. Klíče na úrovni počítače jsou ideální pro scénáře, kdy webová aplikace běží na vlastním vyhrazeném serveru nebo pokud na serveru existuje více aplikací, které potřebují sdílet šifrované informace. Klíče na úrovni uživatele představují bezpečnější možnost ve sdílených hostitelských prostředích, kde by ostatní aplikace na stejném serveru neměly být schopny dešifrovat oddíly konfigurace chráněné aplikací.

V tomto kurzu použijeme zprostředkovatele DPAPI a klíče na úrovni počítače. Konkrétně se podíváme na šifrování oddílu <connectionStrings> v Web.config, ačkoli chráněný konfigurační systém lze použít k šifrování většiny oddílů Web.config . Informace o používání klíčů na úrovni uživatele nebo použití poskytovatele RSA najdete v části Další materiály na konci tohoto kurzu.

Poznámka:

DPAPIProtectedConfigurationProvider Zprostředkovatelé RSAProtectedConfigurationProvider jsou v machine.config souboru zaregistrováni s názvy RsaProtectedConfigurationProvider zprostředkovatelů a DataProtectionConfigurationProviderv uvedeném pořadí. Při šifrování nebo dešifrování informací o konfiguraci budeme muset zadat odpovídající název poskytovatele (RsaProtectedConfigurationProvider nebo DataProtectionConfigurationProvider) místo skutečného názvu typu (RSAProtectedConfigurationProvider a DPAPIProtectedConfigurationProvider). Soubor najdete machine.config ve $WINDOWS$\Microsoft.NET\Framework\version\CONFIG složce.

Krok 2: Programové šifrování a dešifrování konfiguračních oddílů

S několika řádky kódu můžeme šifrovat nebo dešifrovat konkrétní konfigurační oddíl pomocí zadaného poskytovatele. Kód, jak uvidíme krátce, jednoduše potřebuje programově odkazovat na příslušný oddíl konfigurace, volat jeho ProtectSection nebo UnprotectSection metodu a pak volat metodu Save pro zachování změn. Rozhraní .NET Framework navíc obsahuje užitečný nástroj příkazového řádku, který může šifrovat a dešifrovat konfigurační informace. Tento nástroj příkazového řádku prozkoumáme v kroku 3.

Abychom mohli ilustrovat programovou ochranu informací o konfiguraci, vytvoříme ASP.NET stránku, která obsahuje tlačítka pro šifrování a dešifrování oddílu <connectionStrings> v Web.configsouboru .

Začněte otevřením EncryptingConfigSections.aspx stránky ve AdvancedDAL složce. Přetáhněte ovládací prvek TextBox z panelu nástrojů do Návrháře, nastavení jeho ID vlastnosti na WebConfigContents, jeho TextMode vlastnost na MultiLinea jeho Width a jeho vlastnosti Rows na 95% a 15, v uvedeném pořadí. Tento ovládací prvek TextBox zobrazí obsah Web.config , který nám umožní rychle zjistit, jestli je obsah zašifrovaný nebo ne. Samozřejmě, v skutečné aplikaci byste nikdy nechtěli zobrazit obsah Web.config.

Pod TextBox přidejte dva ovládací prvky Button pojmenované EncryptConnStrings a DecryptConnStrings. Nastavte jejich textové vlastnosti na Šifrování připojovacích řetězců a dešifrování připojovacích řetězců .

V tomto okamžiku by měla obrazovka vypadat podobně jako na obrázku 2.

Snímek obrazovky znázorňující otevření sady Visual Studio na stránce EncryptingConfigSections.aspx, která obsahuje nové textové pole a dva ovládací prvky Tlačítko

Obrázek 2: Přidání webového ovládacího prvku TextBox a Two Button na stránku (kliknutím zobrazíte obrázek v plné velikosti)

Dále musíme napsat kód, který se načte a zobrazí obsah Web.config v textovém WebConfigContents poli při prvním načtení stránky. Do třídy kódu stránky přidejte následující kód. Tento kód přidá pojmenovanou DisplayWebConfig metodu a zavolá ji z Page_Load obslužné rutiny události, pokud Page.IsPostBack je false:

protected void Page_Load(object sender, EventArgs e)
{
    // On the first page visit, call DisplayWebConfig method
    if (!Page.IsPostBack)
        DisplayWebConfig();
}
private void DisplayWebConfig()
{
    // Reads in the contents of Web.config and displays them in the TextBox
    StreamReader webConfigStream = 
        File.OpenText(Path.Combine(Request.PhysicalApplicationPath, "Web.config"));
    string configContents = webConfigStream.ReadToEnd();
    webConfigStream.Close();
    WebConfigContents.Text = configContents;
}

Metoda DisplayWebConfig používá File třídu k otevření souboru aplikaceWeb.config,StreamReader třídy ke čtení jejího obsahu do řetězce aPath třída k vygenerování fyzické cesty k Web.config souboru. Všechny tyto tři třídy jsou nalezeny System.IO v oboru názvů. V důsledku toho budete muset přidat using System.IO příkaz na začátek třídy kódu za kódem nebo případně předponu těchto názvů tříd .System.IO.

Dále musíme přidat obslužné rutiny událostí pro dvě události ovládacích prvků Click button a přidat potřebný kód pro šifrování a dešifrování <connectionStrings> oddílu pomocí klíče na úrovni počítače s poskytovatelem DPAPI. V Návrháři poklikejte na každou z tlačítek a přidejte obslužnou rutinu Click události do třídy kódu a pak přidejte následující kód:

protected void EncryptConnStrings_Click(object sender, EventArgs e)
{
    // Get configuration information about Web.config
    Configuration config = 
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    // Let's work with the <connectionStrings> section
    ConfigurationSection connectionStrings = config.GetSection("connectionStrings");
    if (connectionStrings != null)
        // Only encrypt the section if it is not already protected
        if (!connectionStrings.SectionInformation.IsProtected)
        {
            // Encrypt the <connectionStrings> section using the 
            // DataProtectionConfigurationProvider provider
            connectionStrings.SectionInformation.ProtectSection(
                "DataProtectionConfigurationProvider");
            config.Save();
            
            // Refresh the Web.config display
            DisplayWebConfig();
        }
}
protected void DecryptConnStrings_Click(object sender, EventArgs e)
{
    // Get configuration information about Web.config
    Configuration config = 
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    // Let's work with the <connectionStrings> section
    ConfigurationSection connectionStrings = 
        config.GetSection("connectionStrings");
    if (connectionStrings != null)
        // Only decrypt the section if it is protected
        if (connectionStrings.SectionInformation.IsProtected)
        {
            // Decrypt the <connectionStrings> section
            connectionStrings.SectionInformation.UnprotectSection();
            config.Save();
            // Refresh the Web.config display
            DisplayWebConfig();
        }
}

Kód použitý ve dvou obslužných rutinách událostí je téměř stejný. Oba začínají získáním informací o aktuálním souboru aplikace Web.config prostřednictvímWebConfigurationManager metody třídy sOpenWebConfiguration. Tato metoda vrátí konfigurační soubor webu pro zadanou virtuální cestu. Dále se k oddílu <connectionStrings> Web.config souboru přistupuje prostřednictvímConfiguration metody třídy sGetSection(sectionName), která vrací ConfigurationSection objekt.

Objekt ConfigurationSection obsahuje SectionInformation vlastnost , která poskytuje další informace a funkce týkající se oddílu konfigurace. Jak ukazuje výše uvedený kód, můžeme určit, jestli je oddíl konfigurace zašifrovaný kontrolou SectionInformation IsProtected vlastnosti vlastnosti. Kromě toho je možné oddíl zašifrovat nebo dešifrovat prostřednictvím SectionInformation vlastností ProtectSection(provider) a UnprotectSection metod.

Metoda ProtectSection(provider) přijímá jako vstup řetězec určující název chráněného zprostředkovatele konfigurace, který se má použít při šifrování. V obslužné rutině EncryptConnString události Button s předáváme DataProtectionConfigurationProvider do ProtectSection(provider) metody, aby se použil zprostředkovatel DPAPI. Metoda UnprotectSection může určit zprostředkovatele, který byl použit k šifrování konfiguračního oddílu, a proto nevyžaduje žádné vstupní parametry.

Po zavolání nebo UnprotectSection metody je nutné zavolat ProtectSection(provider) metodu objektuSave Configuration , aby se změny zachovaly. Po zašifrování nebo dešifrování konfiguračních informací a uložených změn voláme DisplayWebConfig načtení aktualizovaného Web.config obsahu do ovládacího prvku TextBox.

Jakmile zadáte výše uvedený kód, otestujte ho tak, že přejdete na EncryptingConfigSections.aspx stránku v prohlížeči. Na začátku by se měla zobrazit stránka se seznamem obsahu oddílu zobrazeného <connectionStrings> ve formátu prostého Web.config textu (viz obrázek 3).

Snímek obrazovky zobrazující stránku EncryptingConfigSections.aspx načtenou ve webovém prohlížeči

Obrázek 3: Přidání webového ovládacího prvku TextBox a Two Button (Kliknutím zobrazíte obrázek v plné velikosti)

Teď klikněte na tlačítko Šifrovat připojovací řetězce. Pokud je povolené ověření požadavku, kód publikovaný zpět z textového WebConfigContents pole vytvoří HttpRequestValidationExceptionzprávu, která zobrazí zprávu, A potenciálně nebezpečná Request.Form hodnota byla zjištěna od klienta. Ověřování požadavků, které je ve výchozím nastavení povolené v ASP.NET 2.0, zakazuje zpětné útoky, které obsahují kód HTML bez kódování, a je navržená tak, aby zabránila útokům prostřednictvím injektáže skriptu. Tuto kontrolu je možné zakázat na úrovni stránky nebo aplikace. Pokud chcete tuto stránku vypnout, nastavte ValidateRequest nastavení v false direktivě @Page . Direktiva @Page se nachází v horní části deklarativní značky stránky.

<%@ Page ValidateRequest="False" ... %>

Další informace o ověření požadavku, jeho účel, jak ho zakázat na úrovni stránky a aplikace a jak kódovat kód HTML, najdete v tématu Ověření požadavku – Zabránění útokům na skripty.

Po zakázání ověření požadavku na stránku zkuste znovu kliknout na tlačítko Šifrovat připojovací řetězce. V případě zpětného odeslání bude konfigurační soubor přístupný a jeho <connectionStrings> oddíl se zašifruje pomocí zprostředkovatele DPAPI. Textové pole se pak aktualizuje tak, aby zobrazoval nový Web.config obsah. Jak ukazuje obrázek 4, <connectionStrings> informace se teď šifrují.

Kliknutí na tlačítko Šifrovat připojovací řetězce zašifruje <část connectionString>

Obrázek 4: Kliknutí na tlačítko Zašifrovat připojovací řetězce zašifruje <connectionString> oddíl (kliknutím zobrazíte obrázek v plné velikosti).

Šifrovaný <connectionStrings> oddíl vygenerovaný v mém počítači následuje, i když se část obsahu v <CipherData> prvku odebrala kvůli stručnosti:

<connectionStrings 
    configProtectionProvider="DataProtectionConfigurationProvider">
  <EncryptedData>
    <CipherData>
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/...zChw==</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

Poznámka:

Element <connectionStrings> určuje zprostředkovatele použitého k provedení šifrování (DataProtectionConfigurationProvider). Tyto informace používá UnprotectSection metoda při kliknutí na tlačítko Dešifrovat připojovací řetězce.

Když se k informacím připojovací řetězec dostaneme Web.config z kódu, který napíšeme, z ovládacího prvku SqlDataSource nebo automaticky vygenerovaného kódu z objektu TableAdapter v našich typed DataSets – automaticky se dešifruje. Stručně řečeno, k dešifrování šifrovaného <connectionString> oddílu nepotřebujeme přidat žádný další kód ani logiku. Pokud si to chcete předvést, navštivte jeden z předchozích kurzů v tuto chvíli, například kurz jednoduchého zobrazení z části Základní vytváření sestav (~/BasicReporting/SimpleDisplay.aspx). Jak ukazuje obrázek 5, kurz funguje přesně tak, jak bychom očekávali, což znamená, že šifrované připojovací řetězec informace se automaticky dešifrují na stránce ASP.NET.

Vrstva přístupu k datům automaticky dešifruje informace o připojovacím řetězci.

Obrázek 5: Vrstva přístupu k datům automaticky dešifruje informace o připojovacím řetězci (kliknutím zobrazíte obrázek plné velikosti).

Pokud chcete vrátit <connectionStrings> oddíl zpět k reprezentaci ve formátu prostého textu, klikněte na tlačítko Dešifrovat připojovací řetězce. Při zpětném odeslání byste měli vidět připojovací řetězec v Web.config prostém textu. V tomto okamžiku by měla obrazovka vypadat jako při první návštěvě této stránky (viz obrázek 3).

Krok 3: Šifrování oddílů konfigurace pomocí aspnet_regiis.exe

Rozhraní .NET Framework obsahuje v této složce celou řadu nástrojů příkazového $WINDOWS$\Microsoft.NET\Framework\version\ řádku. V kurzu Použití závislostí mezipaměti SQL jsme se například podívali na použití nástroje příkazového aspnet_regsql.exe řádku k přidání infrastruktury potřebné pro závislosti mezipaměti SQL. Dalším užitečným nástrojem příkazového řádku v této složce je ASP.NET nástroj pro registraci služby IIS (aspnet_regiis.exe). Jak už název napovídá, nástroj pro registraci služby IIS ASP.NET se primárně používá k registraci aplikace ASP.NET 2.0 u webového serveru Microsoftu s profesionálním stupněm služby IIS. Kromě jeho funkcí souvisejících se službou IIS lze k šifrování nebo dešifrování zadaných Web.configoddílů konfigurace použít také nástroj pro registraci služby IIS ASP.NET iis .

Následující příkaz ukazuje obecnou syntaxi použitou k šifrování oddílu konfigurace pomocí nástroje příkazového aspnet_regiis.exe řádku:

aspnet_regiis.exe -pef section physical_directory -prov provider

section je oddíl konfigurace pro šifrování (například connectionStrings), physical_directory je úplná fyzická cesta ke kořenovému adresáři webové aplikace a zprostředkovatel je název chráněného zprostředkovatele konfigurace, který se má použít (například DataProtectionConfigurationProvider). Pokud je webová aplikace zaregistrovaná ve službě IIS, můžete místo fyzické cesty zadat virtuální cestu pomocí následující syntaxe:

aspnet_regiis.exe -pe section -app virtual_directory -prov provider

Následující aspnet_regiis.exe příklad šifruje <connectionStrings> oddíl pomocí zprostředkovatele DPAPI s klíčem na úrovni počítače:

aspnet_regiis.exe -pef
"connectionStrings" "C:\Websites\ASPNET_Data_Tutorial_73_CS"
-prov "DataProtectionConfigurationProvider"

Podobně lze nástroj příkazového aspnet_regiis.exe řádku použít k dešifrování oddílů konfigurace. Místo použití -pef přepínače použijte -pdf (nebo místo -pe) -pd). Všimněte si také, že při dešifrování není název zprostředkovatele nezbytný.

aspnet_regiis.exe -pdf section physical_directory
  -- or --
aspnet_regiis.exe -pd section -app virtual_directory

Poznámka:

Vzhledem k tomu, že používáme zprostředkovatele DPAPI, který používá klíče specifické pro počítač, musíte spustit aspnet_regiis.exe ze stejného počítače, ze kterého se obsluhují webové stránky. Pokud například spustíte tento program příkazového řádku z místního vývojového počítače a potom nahrajete šifrovaný soubor Web.config na produkční server, nebude produkční server moct dešifrovat připojovací řetězec informace, protože byly zašifrovány pomocí klíčů specifických pro váš vývojový počítač. Poskytovatel RSA toto omezení nemá, protože je možné exportovat klíče RSA do jiného počítače.

Principy možností ověřování databáze

Před vydáním SELECTjakékoli aplikace , nebo UPDATEINSERTDELETE dotazy na databázi Microsoft SQL Serveru musí databáze nejprve identifikovat žadatele. Tento proces se označuje jako ověřování a SQL Server poskytuje dvě metody ověřování:

  • Ověřování systému Windows – proces, ve kterém je aplikace spuštěná, se používá ke komunikaci s databází. Při spuštění aplikace ASP.NET prostřednictvím sady Visual Studio 2005 s ASP.NET Development Server předpokládá ASP.NET aplikace identitu aktuálně přihlášeného uživatele. Pro ASP.NET aplikace na serveru IIS (Internet Information Server) ASP.NET aplikace obvykle předpokládají identitu domainName``\MachineName nebo domainName``\NETWORK SERVICE, i když je možné ji přizpůsobit.
  • Ověřování SQL – hodnoty ID uživatele a hesla se zadají jako přihlašovací údaje pro ověřování. Pomocí ověřování SQL se ID uživatele a heslo zadají v připojovací řetězec.

Ověřování systému Windows se upřednostňuje před ověřováním SQL, protože je bezpečnější. Při ověřování systému Windows je připojovací řetězec bez uživatelského jména a hesla a pokud se webový server a databázový server nacházejí na dvou různých počítačích, přihlašovací údaje se neposílají přes síť ve formátu prostého textu. Při ověřování SQL jsou ale přihlašovací údaje pro ověřování pevně zakódované v připojovací řetězec a přenášejí se z webového serveru do databázového serveru ve formátu prostého textu.

Tyto kurzy používaly ověřování systému Windows. Režim ověřování můžete zjistit kontrolou připojovací řetězec. Připojovací řetězec v Web.config našich kurzech:

Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\NORTHWND.MDF; Integrated Security=True; User Instance=True

Integrované zabezpečení =True a nedostatek uživatelského jména a hesla značí, že se používá ověřování systému Windows. V některých připojovací řetězec se místo integrovaného zabezpečení=True používá termín Důvěryhodné připojení=Ano nebo Integrated Security=SSPI, ale všechny tři označují použití ověřování systému Windows.

Následující příklad ukazuje připojovací řetězec, která používá ověřování SQL. $CREDENTIAL_PLACEHOLDER$ je zástupný symbol pro pár klíč-hodnota hesla. Všimněte si, že přihlašovací údaje jsou vložené do připojovací řetězec:

Server=serverName; Database=Northwind; uid=userID; $CREDENTIAL_PLACEHOLDER$

Představte si, že útočník může zobrazit soubor vaší aplikace Web.config . Pokud se pomocí ověřování SQL připojíte k databázi, která je přístupná přes internet, může útočník použít tuto připojovací řetězec k připojení k databázi prostřednictvím aplikace SQL Management Studio nebo z ASP.NET stránek na vlastním webu. Pokud chcete tuto hrozbu zmírnit, zašifrujte připojovací řetězec informace pomocí Web.config chráněného konfiguračního systému.

Poznámka:

Další informace o různých typech ověřování dostupných na SQL Serveru najdete v tématu Vytváření zabezpečených ASP.NET aplikací: ověřování, autorizace a zabezpečená komunikace. Další připojovací řetězec příklady ilustrující rozdíly mezi syntaxí ověřování Windows a SQL najdete v ConnectionStrings.com.

Shrnutí

Soubory s příponou .config v aplikaci ASP.NET ve výchozím nastavení nelze získat přístup prostřednictvím prohlížeče. Tyto typy souborů se nevrací, protože mohou obsahovat citlivé informace, jako jsou databázové připojovací řetězec, uživatelská jména a hesla atd. Chráněný konfigurační systém v .NET 2.0 pomáhá dále chránit citlivé informace tím, že umožňuje šifrování zadaných oddílů konfigurace. Existují dva předdefinované zprostředkovatelé konfigurace: jeden, který používá algoritmus RSA a druhý, který používá rozhraní API služby Windows Data Protection (DPAPI).

V tomto kurzu jsme se podívali na šifrování a dešifrování nastavení konfigurace pomocí zprostředkovatele DPAPI. Toho lze dosáhnout jak programově, jak jsme viděli v kroku 2, tak prostřednictvím nástroje příkazového aspnet_regiis.exe řádku, který byl popsaný v kroku 3. Další informace o používání klíčů na úrovni uživatele nebo použití zprostředkovatele RSA najdete v části Další materiály.

Šťastné programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:

O autorovi

Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 za 24 hodin. Je dostupný na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím svého blogu, který lze najít na http://ScottOnWriting.NET.

Zvláštní díky

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí recenzenti tohoto kurzu byli Teresa Murphy a Randy Schmidt. Chcete si projít nadcházející články MSDN? Pokud ano, zahoďte mi řádek na mitchell@4GuysFromRolla.com.