Sdílet prostřednictvím


Zajištění zabezpečených mikroslužeb .NET a webových aplikací

Návod

Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.

eBook o architektuře mikroslužeb .NET pro kontejnerizované aplikace .NET, miniatura na obálce.

Existuje tolik aspektů zabezpečení v mikroslužbách a webových aplikacích, že by toto téma snadno vydalo na několik knih, jako je tato. V této části se tedy zaměříme na ověřování, autorizaci a tajné kódy aplikací.

Implementace ověřování v mikroslužbách a webových aplikacích .NET

Často je nutné, aby prostředky a rozhraní API publikovaná službou byly omezeny na určité důvěryhodné uživatele nebo klienty. Prvním krokem při rozhodování o důvěryhodnosti na úrovni rozhraní API je ověřování. Ověřování je proces spolehlivého ověření identity uživatele.

Ve scénářích mikroslužeb se ověřování obvykle zpracovává centrálně. Pokud používáte bránu rozhraní API, je brána dobrým místem k ověření, jak je znázorněno na obrázku 9–1. Pokud použijete tento přístup, ujistěte se, že jednotlivé mikroslužby nemohou být přístupné přímo (bez brány rozhraní API), dokud nejsou zajištěna dodatečná bezpečnostní opatření k ověření zpráv, ať už pocházejí z brány, nebo ne.

Diagram znázorňující, jak klientská mobilní aplikace komunikuje s back-endem

Obrázek 9–1 Centralizované ověřování pomocí brány rozhraní API

Když brána rozhraní API centralizuje ověřování, přidá informace o uživateli při předávání požadavků do mikroslužeb. Pokud se ke službám dostanete přímo, je možné k ověřování uživatelů použít ověřovací službu, jako je Azure Active Directory nebo vyhrazená ověřovací mikroslužba fungující jako služba tokenů zabezpečení (STS). Rozhodnutí o důvěryhodnosti se sdílí mezi službami s tokeny zabezpečení nebo soubory cookie. (Tyto tokeny je možné v případě potřeby sdílet mezi aplikacemi ASP.NET Core implementací sdílení souborů cookie.) Tento vzor je znázorněn na obrázku 9–2.

Diagram znázorňující ověřování prostřednictvím back-endových mikroslužeb

Obrázek 9–2 Ověřování pomocí mikroslužby identit; důvěryhodnost se sdílí pomocí autorizačního tokenu.

Když se k mikroslužbám přistupuje přímo, důvěra, která zahrnuje ověřování a autorizaci, je zpracovávána pomocí tokenu zabezpečení, který vystavuje vyhrazená mikroslužba a je sdílen mezi mikroslužbami.

Ověřování pomocí ASP.NET základní identity

Primárním mechanismem v ASP.NET Core pro identifikaci uživatelů aplikace je systém členství ve službě ASP.NET Core Identity . ASP.NET Core Identity ukládá informace o uživatelích (včetně přihlašovacích informací, rolí a deklarací identity) do úložiště dat nakonfigurovaného vývojářem. Úložiště dat ASP.NET Core Identity je obvykle úložiště dat Entity Framework, které je součástí Microsoft.AspNetCore.Identity.EntityFrameworkCore balíčku. Vlastní úložiště nebo jiné balíčky třetích stran se ale dají použít k ukládání informací o identitě ve službě Azure Table Storage, CosmosDB nebo jiných umístěních.

Návod

ASP.NET Core 2.1 a novější poskytuje ASP.NET Core Identity jako knihovnu tříd Razor, takže v projektu neuvidíte většinu potřebného kódu, jak tomu bylo u předchozích verzí. Podrobnosti o tom, jak přizpůsobit kód Identity tak, aby vyhovoval vašim potřebám, najdete v tématu Scaffold Identity v projektech ASP.NET Core.

Následující kód je převzat z šablony projektu MVC základní webové aplikace ASP.NET s vybraným ověřováním jednotlivých uživatelských účtů. Ukazuje, jak nakonfigurovat ASP.NET základní identitu pomocí Entity Framework Core v souboru Program.cs .

//...
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
    options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddRazorPages();
//...

Jakmile ASP.NET základní identitu nakonfigurujete, povolíte ji tak, že ji přidáte app.UseAuthentication() a endpoints.MapRazorPages() jak je znázorněno v následujícím kódu v souboru Program.cs služby:

//...
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});
//...

Důležité

Řádky v předchozím kódu musí být v pořadí uvedeném, aby identita fungovala správně.

Použití ASP.NET Core Identity umožňuje několik scénářů:

  • Vytvořte nové informace o uživateli pomocí typu UserManager (userManager.CreateAsync).

  • Ověřte uživatele pomocí typu SignInManager. Můžete se přihlásit signInManager.SignInAsync přímo nebo signInManager.PasswordSignInAsync potvrdit správnost hesla uživatele a pak ho přihlásit.

  • Identifikujte uživatele na základě informací uložených v souboru cookie (který čte middleware ASP.NET Core Identity), aby následné požadavky z prohlížeče zahrnovaly identitu a nároky přihlášeného uživatele.

ASP.NET Core Identity podporuje také dvojúrovňové ověřování.

Pro scénáře ověřování, které využívají úložiště místních uživatelských dat a které uchovávají identitu mezi požadavky pomocí souborů cookie (jak je typické pro webové aplikace MVC), je doporučeným řešením ASP.NET Core Identity.

Ověřování pomocí externích poskytovatelů

ASP.NET Core také podporuje použití externích zprostředkovatelů ověřování , aby se uživatelé mohli přihlásit prostřednictvím toků OAuth 2.0 . To znamená, že se uživatelé můžou přihlásit pomocí existujících ověřovacích procesů od poskytovatelů, jako jsou Microsoft, Google, Facebook nebo Twitter, a přidružit tyto identity k identitě ASP.NET Core ve vaší aplikaci.

Pokud chcete použít externí ověřování, musíte kromě zahrnutí middlewaru ověřování, jak je uvedeno dříve, také pomocí app.UseAuthentication() metody zaregistrovat externího poskytovatele v Program.cs, jak je znázorněno v následujícím příkladu.

//...
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = builder.Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = builder.Configuration["Authentication:Microsoft:ClientSecret"];
    })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });
//...

Oblíbené externí zprostředkovatele ověřování a jejich přidružené balíčky NuGet jsou uvedeny v následující tabulce:

Poskytovatel Balíček
Microsoft Microsoft.AspNetCore.Authentication.MicrosoftAccount
Google Microsoft.AspNetCore.Authentication.Google
Facebook Microsoft.AspNetCore.Authentication.Facebook
Cvrlikat Microsoft.AspNetCore.Authentication.Twitter

Ve všech případech musíte dokončit postup registrace aplikace, který je závislý na dodavateli a který obvykle zahrnuje:

  1. Získání ID klientské aplikace
  2. Získání tajného klíče klientské aplikace
  3. Konfigurace adresy URL přesměrování, kterou zpracovávají autorizační middleware a registrovaný poskytovatel
  4. Volitelně můžete nakonfigurovat adresu URL pro odhlášení, která správně zpracuje odhlášení ve scénáři jednotného přihlašování (SSO).

Podrobnosti o konfiguraci vaší aplikace pro externího poskytovatele najdete v dokumentaci k ASP.NET Core na stránce Externí ověřování poskytovatele.

Návod

Všechny podrobnosti zpracovává autorizační middleware a služby, které jsme zmínili dříve. Takže při vytváření projektu webové aplikace ASP.NET Core v sadě Visual Studio stačí zvolit možnost ověřování individuálního uživatelského účtu , jak je znázorněno na obrázku 9–3, kromě registrace zprostředkovatelů ověřování, které jsme zmínili dříve.

Snímek obrazovky s dialogovým oknem Nová webová aplikace ASP.NET Core

Obrázek 9–3 Výběr možnosti Individuální uživatelské účty pro použití externího ověřování při vytváření projektu webové aplikace v sadě Visual Studio 2019

Kromě dříve uvedených externích zprostředkovatelů ověřování jsou k dispozici balíčky třetích stran, které poskytují middleware pro použití mnoha dalších externích zprostředkovatelů ověřování. Seznam najdete v úložišti AspNet.Security.OAuth.Providers na GitHubu.

Můžete také vytvořit vlastní middleware pro externí ověřování, který vyřeší některé zvláštní potřeby.

Ověřování pomocí nosných tokenů

Ověřování pomocí základní identity ASP.NET (nebo identity plus externích zprostředkovatelů ověřování) funguje dobře pro řadu scénářů webových aplikací, ve kterých je vhodné ukládat informace o uživatelích do souboru cookie. V jiných scénářích ale soubory cookie nejsou přirozeným prostředkem pro zachování a přenos dat.

Například ve webovém rozhraní API ASP.NET Core, které zveřejňuje koncové body RESTful, ke kterým můžou přistupovat jednostránkové aplikace (SPA), nativními klienty nebo dokonce jinými webovými rozhraními API, obvykle chcete místo toho použít ověřování nosného tokenu. Tyto typy aplikací nefungují se soubory cookie, ale mohou snadno načíst nosný token a zahrnout ho do autorizační hlavičky následných požadavků. Pokud chcete povolit ověřování tokenů, ASP.NET Core podporuje několik možností pro použití OAuth 2.0 a OpenID Connect.

Ověřování pomocí zprostředkovatele identity OpenID Connect nebo OAuth 2.0

Pokud jsou informace o uživateli uložené v Azure Active Directory nebo jiném řešení identity, které podporuje OpenID Connect nebo OAuth 2.0, můžete použít balíček Microsoft.AspNetCore.Authentication.OpenIdConnect k ověření pomocí pracovního postupu OpenID Connect. Pokud se například chcete ověřit v mikroslužbě Identity.Api v eShopOnContainers, může webová aplikace ASP.NET Core používat middleware z tohoto balíčku, jak je znázorněno v následujícím zjednodušeném příkladu v Program.cs:

// Program.cs

var identityUrl = builder.Configuration.GetValue<string>("IdentityUrl");
var callBackUrl = builder.Configuration.GetValue<string>("CallBackUrl");
var sessionCookieLifetime = builder.Configuration.GetValue("SessionCookieLifetimeMinutes", 60);

// Add Authentication services

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddCookie(setup => setup.ExpireTimeSpan = TimeSpan.FromMinutes(sessionCookieLifetime))
.AddOpenIdConnect(options =>
{
    options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.Authority = identityUrl.ToString();
    options.SignedOutRedirectUri = callBackUrl.ToString();
    options.ClientId = useLoadTest ? "mvctest" : "mvc";
    options.ClientSecret = "secret";
    options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    options.RequireHttpsMetadata = false;
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("orders");
    options.Scope.Add("basket");
    options.Scope.Add("marketing");
    options.Scope.Add("locations");
    options.Scope.Add("webshoppingagg");
    options.Scope.Add("orders.signalrhub");
});

// Build the app
//…
app.UseAuthentication();
//…
app.UseEndpoints(endpoints =>
{
    //...
});

Při použití tohoto pracovního postupu není potřeba middleware ASP.NET Základní identita, protože služba Identita zpracovává všechna úložiště informací o uživateli a ověřování.

Vydávání tokenů zabezpečení ze služby ASP.NET Core

Pokud dáváte přednost vydávání tokenů zabezpečení pro místní uživatele identity ASP.NET Core, místo použití externího zprostředkovatele identity můžete využít některé dobré knihovny třetích stran.

IdentityServer4 a OpenIddict jsou zprostředkovatelé OpenID Connect, kteří se snadno integrují s ASP.NET Core Identity, abyste mohli vydávat tokeny zabezpečení ze služby ASP.NET Core. Dokumentace k IdentityServer4 obsahuje podrobné pokyny pro používání knihovny. Základní kroky použití IdentityServer4 k vydávání tokenů jsou však následující.

  1. IdentityServer4 nakonfigurujete v Program.cs voláním builder.Services.AddIdentityServer.

  2. Zavoláte metodu UseIdentityServer v Program.cs, aby se přidal IdentityServer4 do kanálu zpracování požadavků HTTP aplikace. To umožňuje knihovně obsluhovat požadavky na koncové body OpenID Connect a OAuth2, jako je /connect/token.

  3. Server identit nakonfigurujete nastavením následujících dat:

    • Přihlašovací údaje , které se mají použít k podepisování.

    • Prostředky identity a rozhraní API, ke kterým můžou uživatelé požádat o přístup:

      • Prostředky rozhraní API představují chráněná data nebo funkce, ke kterým má uživatel přístup pomocí přístupového tokenu. Příkladem prostředku rozhraní API je webové rozhraní API (nebo sada rozhraní API), která vyžaduje autorizaci.

      • Identitní prostředky představují informace (nároky), které klientovi poskytují k identifikaci uživatele. Deklarace identity můžou zahrnovat uživatelské jméno, e-mailovou adresu atd.

    • Klienti, kteří se připojí za účelem vyžádání tokenů.

    • Mechanismus úložiště pro informace o uživateli, jako je ASP.NET Základní identita nebo alternativní.

Když zadáte klienty a prostředky pro použití IdentityServer4, můžete předat IEnumerable<T> kolekci příslušného typu metodám, které používají úložiště klientů nebo prostředků v paměti. Nebo pro složitější scénáře můžete prostřednictvím injektáže závislostí poskytnout typy klienta nebo poskytovatele prostředků.

Ukázková konfigurace pro IdentityServer4 pro použití prostředků v paměti a klientů poskytovaných vlastním typem IClientStore může vypadat jako v následujícím příkladu:

// Program.cs

builder.Services.AddSingleton<IClientStore, CustomClientStore>();
builder.Services.AddIdentityServer()
    .AddSigningCredential("CN=sts")
    .AddInMemoryApiResources(MyApiResourceProvider.GetAllResources())
    .AddAspNetIdentity<ApplicationUser>();
//...

Spotřebování bezpečnostních tokenů

Ověřování v koncovém bodu OpenID Connect nebo vydávání vlastních tokenů zabezpečení zahrnuje některé scénáře. Ale co služba, která jednoduše potřebuje omezit přístup na ty uživatele, kteří mají platné tokeny zabezpečení poskytované jinou službou?

V tomto scénáři je v balíčku Microsoft.AspNetCore.Authentication.JwtBearer dostupný middleware ověřování, který zpracovává tokeny JWT. JWT znamená "JSON Web Token" a je běžný formát tokenu zabezpečení (definovaný RFC 7519) pro komunikaci deklarací identity zabezpečení. Zjednodušený příklad použití middlewaru k využívání takových tokenů může vypadat jako tento fragment kódu převzatý z mikroslužby Ordering.Api eShopOnContainers.

// Program.cs

var identityUrl = builder.Configuration.GetValue<string>("IdentityUrl");

// Add Authentication services

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme;

}).AddJwtBearer(options =>
{
    options.Authority = identityUrl;
    options.RequireHttpsMetadata = false;
    options.Audience = "orders";
});

// Build the app

app.UseAuthentication();
//…
app.UseEndpoints(endpoints =>
{
    //...
});

Parametry v tomto použití jsou:

  • Audience představuje příjemce příchozího tokenu nebo prostředku, ke kterému token uděluje přístup. Pokud hodnota zadaná v tomto parametru neodpovídá parametru v tokenu, token bude odmítnut.

  • Authority je adresa ověřovacího serveru vydávajícího tokeny. Middleware autentizace JWT bearer používá tuto URI k získání veřejného klíče, který slouží k ověření podpisu tokenu. Middleware také potvrdí, že iss parametr v tokenu odpovídá tomuto identifikátoru URI.

Další parametr, RequireHttpsMetadataje užitečný pro účely testování. Tento parametr nastavíte na false, abyste mohli testovat v prostředích, kde nemáte certifikáty. V nasazeních v reálném světě by nosné tokeny JWT měly být vždy předány pouze přes HTTPS.

Při použití tohoto middlewaru se tokeny JWT automaticky extrahují z autorizačních hlaviček. Pak se deserializují, ověří (pomocí hodnot v parametrech AudienceAuthority ) a uloží se jako informace o uživateli, na které se později odkazují akce MVC nebo autorizační filtry.

Middleware ověřování JWT jako nositele může také podporovat pokročilejší scénáře, jako je použití místního certifikátu k validaci tokenu, pokud není dostupný poskytovatel autority. V tomto scénáři můžete zadat TokenValidationParameters objekt v objektu JwtBearerOptions .

Dodatečné zdroje