Pro správnou implementaci funkce, která pracuje s frontami a BLOB úložištěm v rámci serverless architektury Azure Functions, je potřeba zvážit několik kroků, které začínají od základního nastavení až po výstup generovaného obrázku, který se následně uloží do BLOB úložiště. Tento proces zahrnuje správu fontů, práci s frontami a zpracování dat pomocí knihovny ImageSharp, která umožňuje generování grafiky.

Prvním krokem je stažení písma, které bude použito pro text v obrázku. Pro účely této implementace jsme si vybrali font Caveat, který je zdarma k dispozici na Google Fonts. Tento font je vhodný pro vytváření textu, který vypadá, jako by byl napsán ručně. Před použitím je nutné stáhnout font a přidat ho do složky s názvem „fonts“ v projektu. Po přidání fontu je potřeba v jeho vlastnostech nastavit možnost „Copy to Output Directory“ na hodnotu „Copy always“, aby byl font vždy dostupný při spuštění aplikace.

Dalším krokem je přidání potřebných balíčků pro práci s Azure Storage, konkrétně pro Blob Storage a Queue Storage. Pro zajištění kompatibility s těmito službami přidáme balíček „Microsoft.Azure.WebJobs.Extensions.Storage“, který poskytuje rozšíření pro práci s těmito úložišti. Pokud je potřeba také pracovat s Table Storage, přidáme odpovídající balíček „Microsoft.Azure.WebJobs.Extensions.Tables“. Po přidání těchto balíčků je nutné obnovit projekt a vybudovat ho, aby se správně stáhly všechny potřebné závislosti.

Další důležitou součástí je nastavení a konfigurace pro připojení k úložišti Azure. V souboru NumbersToWordsFunction.cs je nutné připojit správnou hodnotu pro účet úložiště, což provádíme pomocí atributu [StorageAccount("AzureWebJobsStorage")]. Tento krok je nezbytný pro správné propojení na Azure Storage účet a umožňuje přístup k potřebným frontám a BLOB úložištím.

V souboru NumbersToWordsFunction.cs dále přidáme kód, který umožní připojit frontu k naší funkci a zapisovat do ní zprávy. Tyto zprávy mohou být například hodnoty, které je potřeba zpracovat. Funkce, která bude zpracovávat data, získá hodnoty ze zprávy a následně je přidá do fronty pro další zpracování. Důležité je, že pokud se hodnota úspěšně převede, vrátí se zpět jako odpověď v textové podobě. Pokud dojde k chybě, uživatel obdrží chybovou zprávu, která vysvětluje problém s analýzou hodnoty.

Po správném nastavení výše uvedených komponent přistupujeme k místnímu prostředí, kde je důležité přidat proměnnou prostředí „IS_LOCAL“, která nám pomůže rozlišit, zda běžíme lokálně nebo v cloudovém prostředí. Tato proměnná má hodnotu „true“ pouze při lokálním testování, což usnadňuje ladění aplikace.

V rámci další implementace je nutné přidat novou funkci pro generování obrázků z dat uložených ve frontě. Tato funkce bude zpracovávat zprávy z fronty a na základě obsahu zprávy generovat obrázky, které se následně uloží do BLOB úložiště. Použití knihovny ImageSharp je klíčové pro práci s obrázky. Pomocí této knihovny můžeme definovat rozměry obrázku, nastavit pozadí a přidat text, který bude vygenerován z hodnoty zprávy.

V samotné funkci pro generování obrázku (CheckGeneratorFunction) se vytváří nový obrázek s bílým pozadím. Následně je načten font a nastavený text se vykreslí na obrázek pomocí kreslicích nástrojů, jako jsou pera a štětce. Můžeme definovat různé tvary a grafické objekty, jako jsou čáry nebo hvězdy, které obohatí vzhled generovaného obrázku. Důležité je mít na paměti, že celý tento proces probíhá na základě údajů, které jsou uloženy ve frontě a přeneseny do funkce jako zprávy.

Pro dosažení efektivního zpracování a ukládání výsledného obrázku je nutné obrázek uložit do Blob Storage, aby byl přístupný pro další použití, například pro zobrazení uživatelskému rozhraní nebo pro stažení.

Nakonec se obrázek uloží do BLOB úložiště v definovaném kontejneru „checks-blob-container“, kde je uložen jako objekt, který bude později použit pro ověření a případné zobrazení.

Při implementaci tohoto typu funkcionality je důležité dbát na optimalizaci výkonnosti, protože práce s frontami a BLOB úložištěm může být náročná na prostředky. Dále je třeba věnovat pozornost bezpečnosti a správnému zacházení s citlivými daty.

Jak nastavit a používat SQL Server pro vývoj v prostředí Windows a Azure

Pokud chcete využít plnou verzi SQL Server na Windows, namísto zjednodušené verze LocalDB nebo Express, můžete stáhnout všechny edice SQL Server z následujícího odkazu: https://www.microsoft.com/en-us/sql-server/sql-server-downloads. Pro stažení a konfiguraci SQL Server Developer Edition následujte následující kroky:

Nejprve stáhněte Developer Edition a spusťte instalační program. Při instalaci vyberte typ instalace Custom (vlastní instalace), zvolte složku pro instalační soubory a klikněte na tlačítko Install. Počkejte na stažení instalačních souborů o velikosti 1,5 GB. V SQL Server Installation Center klikněte na Installation, a poté na New SQL Server stand-alone installation or add features to an existing installation. Vyberte verzi Developer jako bezplatnou edici a pokračujte kliknutím na Next. Při akceptaci licenčních podmínek pokračujte stejně.

Po přezkoumání možností Microsoft Update klikněte na Next. Pokud jsou nějaké problémy se zásadami instalace, opravte je a pokračujte kliknutím na Next. V sekci Feature Selection vyberte Database Engine Services a pokračujte kliknutím na Next. V sekci Instance Configuration vyberte Default instance a klikněte na Next. Pokud již máte výchozí instanci, můžete vytvořit instanci s názvem (např. net7book).

Pokud jde o konfiguraci serveru, poznamenejte si, že SQL Server Database Engine je nakonfigurován tak, aby se spouštěl automaticky. Nastavte SQL Server Browser na automatické spuštění a klikněte na Next. V sekci Database Engine Configuration vyberte autentizační režim na Mixed a nastavte silné heslo pro účet sa, přidejte aktuálního uživatele a klikněte na Next. V sekci Ready to Install zkontrolujte akce, které budou provedeny, a klikněte na Install. Po dokončení instalace klikněte na Close.

Poté ve SQL Server Installation Center klikněte na Install SQL Server Management Tools. Klikněte na odkaz pro stažení nejnovější verze SSMS, kde najdete příslušné odkazy. Po dokončení instalace klikněte na Restart nebo Close. Azure Data Studio (ADS) bude automaticky nainstalováno společně se SSMS. ADS je multiplatformní a open-source nástroj, který umožňuje práci s databázemi SQL Server na jakémkoli desktopovém operačním systému.

Pokud používáte Visual Studio Code, můžete nainstalovat rozšíření SQL Server (mssql), které přidá nový pohled na SQL Server do hlavního postranního panelu. Tento nástroj vám umožní snadno spravovat SQL Server databáze přímo z Visual Studio Code.

Pokud jde o tvorbu databáze Northwind na Windows, postupujte podle následujících kroků. Nejprve si stáhněte nebo naklonujte repozitář z GitHubu pro tuto knihu (https://github.com/markjprice/apps-services-net7/). Vytvořte složku Chapter02 a do ní zkopírujte skript pro vytvoření databáze Northwind. Tento skript najdete v místní složce repozitáře pod cestou /sql-scripts/Northwind4SQLServer.sql.

Po otevření SQL Server Management Studio (SSMS) se připojte k serveru (zadejte "." pro místní server) a otevřete soubor skriptu. Po spuštění skriptu klikněte na tlačítko Execute a po úspěšném dokončení se můžete podívat na tabulky ve vaší databázi, např. na tabulku Products. Tento skript lze spustit i pomocí jiných nástrojů, jako je Visual Studio 2022 nebo Azure Data Studio.

Pokud nemáte Windows a chcete používat SQL Server v cloudu, můžete vytvořit instanci SQL Serveru na Azure. Pro tento účel je nutné mít účet na Azure, který si můžete založit na https://signup.azure.com. Po přihlášení do Azure portálu vytvořte nový Resource Group a následně vytvořte SQL databázi. Při tvorbě serveru zvolte region blízký vaší lokalitě a nakonfigurujte autentizaci pomocí SQL. Po vytvoření serveru nastavte další parametry pro databázi, např. velikost služby a redundantní zálohování.

Po vytvoření SQL databáze v Azure získáte připojovací řetězec ADO.NET, který můžete použít pro připojení k vaší databázi z aplikací. Tento řetězec je možné upravit pro vaše potřeby a uložit do textového editoru pro snadný přístup.

Při práci s SQL Serverem je důležité nejen správně nastavit vývojové nástroje, ale i pochopit základní koncepty správy databází, včetně autentizace, správného nastavení uživatelských práv a optimalizace výkonu serveru. Kromě samotné instalace by měl čtenář věnovat pozornost i výběru správných nástrojů pro správu databází a jejich integraci s vývojovým prostředím. V případě Azure je třeba si být vědom nákladů spojených s provozem databázových instancí, které se mohou lišit podle zvolené úrovně služby a zálohování. Taktéž, při práci s SQL Serverem, je zásadní dbát na bezpečnost, což zahrnuje pravidelnou aktualizaci serverů a správu přístupových práv k databázím.

Jak zabezpečit uživatelské účty a ověřování hesel pomocí hashování a šifrování

Ve světě moderního vývoje aplikací je zabezpečení uživatelských účtů a jejich údajů klíčové pro ochranu citlivých informací. Tento proces zahrnuje nejen ochranu samotných hesel, ale také zajištění integrity dat a jejich autentifikace. V této kapitole se zaměříme na implementaci bezpečného způsobu registrace uživatelů, ověřování jejich hesel a podepisování dat pro ověření jejich autenticity.

Prvním krokem v tomto procesu je vytvoření třídy, která bude reprezentovat uživatele v aplikaci. V knihovně CryptographyLib vytvoříme novou třídu User.cs, která bude uchovávat tři klíčové informace o uživatelském účtu: jméno uživatele, náhodně vygenerovanou hodnotu "salt" a zašifrované a hashované heslo.

csharp
namespace Packt.Shared; public record class User(string Name, string Salt, string SaltedHashedPassword);

Tento jednoduchý rekord umožní udržovat tyto tři hodnoty pro každého uživatele, přičemž heslo je chráněno pomocí techniky, která spojuje „salt“ s heslem, a následně používá hashovací algoritmus (např. SHA256) pro zabezpečení.

Dalším krokem je implementace metody pro registraci a ověřování hesla uživatele v třídě Protector.cs. V této třídě se používá slovník Users, který uchovává všechny registrované uživatele. Zde jsou dvě hlavní metody: jedna pro registraci nového uživatele a druhá pro ověření hesla při přihlášení.

Při registraci uživatele je nejprve vygenerována náhodná hodnota salt, která je kombinována s uživatelovým heslem, následně je celé heslo hashováno. Výsledkem je zašifrované heslo, které je bezpečně uloženo v systému.

csharp
private static Dictionary<string, User> Users = new(); public static User Register(string username, string password) { // generování náhodného salt RandomNumberGenerator rng = RandomNumberGenerator.Create(); byte[] saltBytes = new byte[16]; rng.GetBytes(saltBytes); string saltText = ToBase64String(saltBytes); // generování hashovaného hesla string saltedHashedPassword = SaltAndHashPassword(password, saltText); User user = new(username, saltText, saltedHashedPassword); Users.Add(user.Name, user); return user; } public static bool CheckPassword(string username, string password) { if (!Users.ContainsKey(username)) { return false; } User u = Users[username]; return CheckPassword(password, u.Salt, u.SaltedHashedPassword); } private static bool CheckPassword(string password, string salt, string hashedPassword) { // regenerování hashovaného hesla string saltedHashedPassword = SaltAndHashPassword(password, salt); return (saltedHashedPassword == hashedPassword); } private static string SaltAndHashPassword(string password, string salt) { using (SHA256 sha = SHA256.Create()) { string saltedPassword = password + salt; return ToBase64String(sha.ComputeHash(Encoding.Unicode.GetBytes(saltedPassword))); } }

V této fázi uživatel prochází procesem registrace, kde zadává své uživatelské jméno a heslo. Po jeho registraci je uživatelský účet zabezpečený a heslo je zašifrováno pomocí „salt“ a hashování. Tento mechanismus zajišťuje, že i když mají dva uživatelé stejné heslo, jejich zašifrovaná hesla budou různá, protože každému je přiřazen jedinečný salt.

Další důležitou funkcionalitou je možnost přihlášení uživatele a ověření jeho hesla. Při přihlášení uživatel zadává své jméno a heslo. Systém zkontroluje, zda se zadané heslo shoduje s uloženým zašifrovaným heslem. Tento proces je efektivní, protože heslo se neukládá v čisté podobě, ale pouze v bezpečně zašifrované formě, což významně zvyšuje bezpečnost.

Pokud uživatel úspěšně projde ověřením hesla, systém mu umožní přístup k jeho účtu. Jinak je požádán, aby zadal správné údaje. Tento proces je neustále opakován, dokud se uživatelské údaje neověří správně.

V praxi je proces registrace a ověřování hesel implementován ve formě jednoduché aplikace, kde si uživatelé mohou zaregistrovat nový účet a následně se přihlásit pomocí svých přihlašovacích údajů. Při každé registraci jsou vytvořeny různé hodnoty salt pro různé uživatele, což znamená, že i když mají stejné heslo, jejich zašifrované hodnoty hesel budou unikátní.

Pokud dva uživatelé použijí stejné heslo, generované salt hodnoty zaručují, že jejich zašifrovaná hesla budou vypadat odlišně, což zvyšuje bezpečnost systému. Tato vlastnost je klíčová pro ochranu hesel v případě, že dojde k úniku databáze s uživatelskými údaji.

Další aspekt ochrany dat souvisí s podepisováním dat, což se často používá pro ověřování integrity a autenticity dat. Data se podepisují nikoliv přímo, ale pomocí hashované verze dat, což je efektivní způsob ověřování bez nutnosti přímého podepisování rozsáhlých datových souborů.

Pro podepisování dat a následnou validaci podpisu můžeme použít kombinaci algoritmu SHA256 pro generování hashe a RSA pro podepisování tohoto hashe. Tento proces zajišťuje, že jakýkoli příjemce dat může ověřit, že data pocházejí od důvěryhodného zdroje a nebyla během přenosu změněna.

Příklad implementace podepisování a ověřování podpisu pomocí RSA a SHA256 je následující:

csharp
public static string? PublicKey;
public static string GenerateSignature(string data) {
byte[] dataBytes = Encoding.Unicode.GetBytes(data); SHA256 sha = SHA256.Create(); byte[] hashedData = sha.ComputeHash(dataBytes); RSA rsa = RSA.Create(); PublicKey = rsa.ToXmlString(false); // vynechání privátního klíče return ToBase64String(rsa.SignHash(hashedData, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)); } public static bool ValidateSignature(string data, string signature) { if (PublicKey is null) return false; byte[] dataBytes = Encoding.Unicode.GetBytes(data); SHA256 sha = SHA256.Create(); byte[] hashedData = sha.ComputeHash(dataBytes); byte[] signatureBytes = FromBase64String(signature); RSA rsa = RSA.Create(); rsa.FromXmlString(PublicKey); return rsa.VerifyHash(hashedData, signatureBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); }

Tento postup zajistí, že data jsou podepsána pomocí privátního klíče a mohou být ověřena pomocí veřejného klíče, což umožňuje snadnou kontrolu autenticity dat.

Důležité je si uvědomit, že i když DSA (Digital Signature Algorithm) byl v minulosti populární, dnes je běžně nahrazován novějšími a efektivnějšími metodami, jako je ECDSA (Elliptic Curve DSA), který poskytuje vyšší úroveň bezpečnosti při menší velikosti podpisu.

Jak vytvářet a zabezpečovat webové služby pomocí ASP.NET Core Minimal APIs

V této kapitole se budeme zabývat vývojem a zabezpečením webových služeb za použití ASP.NET Core Minimal APIs. Téma se soustředí na implementaci technik, které pomohou chránit webovou službu před útoky, jakož i na autentizaci a autorizaci. Minimal APIs, představené v ASP.NET Core 6, přinášejí významné zjednodušení vývoje webových služeb, což umožňuje vývojářům rychleji nasadit aplikace s minimem kódu.

Minimal APIs představují novou možnost pro vývoj webových služeb v ASP.NET Core, která eliminovala potřebu psát spoustu boilerplate kódu. Například ve verzi ASP.NET Core 5 by i velmi jednoduchá webová služba vyžadovala několik souborů s tisíci řádky kódu. Ve verzi ASP.NET Core 6 se tento proces zjednodušil až na pět řádků kódu pro základní webovou službu, což je výrazné zjednodušení.

Minimal APIs v ASP.NET Core umožňují definování endpointů pomocí mapování HTTP metod, jako jsou GET, POST, PUT, PATCH, DELETE nebo dokonce metody jako CONNECT a HEAD. Tato flexibilita umožňuje vytvořit specifické a efektivní webové služby bez nutnosti složitých konfigurací.

Pro ilustraci základního použití si můžeme představit implementaci jednoduché služby "Hello World!", která v ASP.NET Core 6 a vyšší verzi vypadá následovně:

csharp
var app = WebApplication.Create(); app.MapGet("/", () => "Hello World!"); await app.RunAsync();

Tento kód vytvoří funkční webovou službu, která na požadavek HTTP GET na kořenovou URL vrátí text "Hello World!". Takto jednoduchý způsob vývoje webových služeb dává vývojářům velkou svobodu a efektivitu.

Pro efektivní práci s parametry v Minimal APIs se používají atributy jako [FromServices], [FromRoute], [FromQuery] nebo [FromBody], které automaticky přiřadí hodnoty parametru z požadavku. Tato schopnost výrazně usnadňuje práci s daty, která přicházejí z různých zdrojů – například parametr z cesty URL, z query stringu nebo z těla požadavku.

Další užitečnou funkcionalitou v Minimal APIs je podpora různých formátů návratových hodnot. Můžete vrátit běžný text, JSON dokumenty nebo jiné formáty, přičemž systém automaticky vybere odpovídající typ odpovědi. Pro vracení statusových kódů existují metody jako Results.Ok(), Results.NotFound() nebo Results.BadRequest(), které jsou přímo napojené na konkrétní HTTP status kódy.

Důležitou součástí bezpečnosti webových služeb je ochrana proti útokům, jako jsou Denial of Service (DoS) nebo útoky typu Cross-Origin Resource Sharing (CORS). Pomocí technik, jako je rate limiting (omezení počtu požadavků na jednotku času) nebo konfigurace CORS, můžete efektivně chránit své webové služby před přetížením a neoprávněným přístupem.

Rate limiting je klíčovým nástrojem pro ochranu služeb před DoS útoky. Umožňuje vám definovat limity, kolikrát může uživatel odeslat požadavek během určitého časového intervalu. To je zvláště důležité pro ochranu proti botům, které mohou automaticky generovat miliony požadavků na server, čímž jej mohou přetížit.

Další důležitou technikou je správná autentizace a autorizace uživatelů. ASP.NET Core nabízí širokou škálu možností pro implementaci bezpečných mechanismů, jako je OAuth, JWT (JSON Web Tokens) nebo základní autentizace, které zaručují, že pouze oprávnění uživatelé budou mít přístup k citlivým datům.

V rámci webových služeb můžete také využít různé nástroje pro sledování a monitorování aplikace, což je zásadní pro včasné detekování možných problémů nebo útoků. V prostředí ASP.NET Core máte k dispozici integrované nástroje pro sledování výkonu a protokolování, které vám pomohou zajišťovat provoz vašich služeb a včas reagovat na případné hrozby.

Když nastavujete webovou službu pomocí ASP.NET Core, je důležité mít na paměti, že minimalizace kódu neznamená snížení flexibility. Naopak, Minimal APIs poskytují všechny základní funkce pro tvorbu robustních a bezpečných webových služeb, přičemž minimalizují množství kódu, který musíte napsat. To vám umožňuje zaměřit se více na logiku aplikace a méně na infrastrukturu.

Pro komplexnější aplikace je však stále možné využívat pokročilejší techniky, jako je použití tradičních kontrolerů v kombinaci s Minimal APIs. Důležité je vědoma si limitů a výhod každého přístupu a zvolit ten nejvhodnější podle potřeby.