Zajištění zabezpečených mikroslužeb a webových aplikací .NET
Tip
Tento obsah je výňatek z elektronické knihy, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na webu .NET Docs nebo jako bezplatný soubor PDF ke stažení, který lze číst offline.
Existuje tolik aspektů zabezpečení v mikroslužbách a webových aplikacích, které by téma mohlo snadno pořídit 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 omezené 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 vhodný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 nejsou dostupné přímo (bez brány rozhraní API), pokud není k ověření zpráv, jestli pocházejí z brány, nebo ne.
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ů mikroslužbám. Pokud se ke službám dostanete přímo, může se k ověřování uživatelů použít ověřovací služba, jako je Azure Active Directory nebo vyhrazená ověřovací mikroslužba, která funguje jako služba tokenů zabezpečení (STS). Rozhodnutí o důvěryhodnosti se sdílejí mezi službami s tokeny zabezpečení nebo soubory cookie. (Tyto tokeny lze 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.
Obrázek 9–2 Ověřování mikroslužbou identity; Důvěryhodnost se sdílí pomocí autorizačního tokenu.
Když se k mikroslužbám přistupujete přímo, důvěřujete, včetně ověřování a autorizace, zpracovává token zabezpečení vystavený vyhrazenou mikroslužbou sdílenou mezi mikroslužbami.
Ověřování pomocí identity ASP.NET Core
Primárním mechanismem v ASP.NET Core pro identifikaci uživatelů aplikace je systém členství ASP.NET Core identit. ASP.NET Core Identita ukládá informace o uživateli (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 Microsoft.AspNetCore.Identity.EntityFrameworkCore
součástí 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ě v Azure Table Storage, CosmosDB nebo jiných umístěních.
Tip
ASP.NET Core 2.1 a novějším poskytuje ASP.NET Core Identitu jako knihovnu tříd Razor, takže v projektu neuvidíte moc potřebného kódu, jak tomu bylo v předchozích verzích. Podrobnosti o tom, jak přizpůsobit kód identity tak, aby vyhovoval vašim potřebám, najdete v tématu Generování identity v projektech ASP.NET Core.
Následující kód je převzat z šablony projektu MVC 3.1 webové aplikace ASP.NET Core s vybraným ověřováním jednotlivých uživatelských účtů. Ukazuje, jak nakonfigurovat identitu ASP.NET Core pomocí Entity Framework Core v Startup.ConfigureServices
metodě.
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
//...
}
Po nakonfigurování identity ASP.NET Core ji povolíte tak, že ji přidáte app.UseAuthentication()
a endpoints.MapRazorPages()
jak je znázorněno v následujícím kódu v metodě službyStartup.Configure
:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...
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í zobrazeném pro správné fungování identity.
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 nebosignInManager.PasswordSignInAsync
potvrdit správnost hesla uživatele a pak je přihlásit.Identifikujte uživatele na základě informací uložených v souboru cookie (který čte ASP.NET Core middleware identity), aby následné požadavky z prohlížeče obsahovaly identitu a deklarace identity přihlášeného uživatele.
ASP.NET Core Identity podporuje také dvoufaktorové ověřování.
Pro scénáře ověřování, které využívají místní úložiště uživatelských dat a které uchovávají identitu mezi požadavky pomocí souborů cookie (jak je typické pro webové aplikace MVC), ASP.NET Core Identita je doporučeným řešením.
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 přes toky 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í, kromě toho, že používáte dříve uvedený middleware ověřování, app.UseAuthentication()
musíte také zaregistrovat externího poskytovatele Startup
, jak je znázorněno v následujícím příkladu:
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication()
.AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
microsoftOptions.ClientSecret = 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 |
Microsoft.AspNetCore.Authentication.Google | |
Microsoft.AspNetCore.Authentication.Facebook | |
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:
- Získání ID klientské aplikace
- Získání tajného klíče klientské aplikace
- Konfigurace adresy URL přesměrování, která se zpracovává autorizačním middlewarem a registrovaným poskytovatelem
- Volitelně můžete nakonfigurovat adresu URL odhlášení tak, aby správně zpracovávala odhlášení ve scénáři jednotného přihlašování (SSO).
Podrobnosti o konfiguraci aplikace pro externího poskytovatele najdete v dokumentaci k externímu poskytovateli v dokumentaci ASP.NET Core k externímu poskytovateli.
Tip
Všechny podrobnosti se zpracovávají autorizačním middlewarem a službami, které jsme zmínili dříve. Takže při vytváření projektu webové aplikace ASP.NET Core ve 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.
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 Visual Studio 2019
Kromě dříve uvedených externích poskytovatelů 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 GitHub.
Můžete také vytvořit vlastní middleware externího ověřování, abyste vyřešili některé zvláštní potřeby.
Ověřování pomocí nosných tokenů
Ověřování pomocí identity ASP.NET Core (neboli 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 způsobem uchování a přenosu dat.
Například ve webovém rozhraní API ASP.NET Core, které zveřejňuje koncové body RESTful, ke kterým může 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 je 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í použití OAuth 2.0 a OpenID Připojení.
Ověřování pomocí zprostředkovatele identity OpenID Připojení 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 Připojení nebo OAuth 2.0, můžete použít balíček Microsoft.AspNetCore.Authentication.OpenIdConnect k ověření pomocí pracovního postupu OpenID Připojení. Například k ověření mikroslužby Identity.Api v eShopOnContainers může webová aplikace ASP.NET Core použít middleware z tohoto balíčku, jak je znázorněno v následujícím zjednodušeném příkladu:Startup.cs
// Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//…
app.UseAuthentication();
//…
app.UseEndpoints(endpoints =>
{
//...
});
}
public void ConfigureServices(IServiceCollection services)
{
var identityUrl = Configuration.GetValue<string>("IdentityUrl");
var callBackUrl = Configuration.GetValue<string>("CallBackUrl");
var sessionCookieLifetime = 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");
});
}
Při použití tohoto pracovního postupu není potřeba middleware ASP.NET Core 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 Identity 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 Připojení, kteří se snadno integrují se službou ASP.NET Core Identity, abyste mohli vydávat tokeny zabezpečení ze služby ASP.NET Core. Dokumentace k IdentityServer4 obsahuje podrobné pokyny k používání knihovny. Základní kroky k použití IdentityServer4 k vydávání tokenů jsou však následující.
Zavoláte aplikaci. UseIdentityServer v metodě Startup.Configure pro přidání IdentityServer4 do kanálu zpracování požadavků HTTP aplikace. To umožňuje knihovně obsluhovat požadavky na koncové body OpenID Připojení a OAuth2, jako je /connect/token.
IdentityServer4 nakonfigurujete ve službě Startup.ConfigureServices voláním služeb. AddIdentityServer.
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žadují autorizaci.
Prostředky identit představují informace (deklarace identity), které jsou předány klientovi k identifikaci uživatele. Deklarace identity můžou obsahovat uživatelské jméno, e-mailovou adresu atd.
Klienti, kteří se budou připojovat k vyžádání tokenů.
Mechanismus úložiště informací o uživateli, jako je ASP.NET Core Identita nebo alternativní.
Při zadávání klientů a prostředků pro IdentityServer4, které se mají použít, můžete předat IEnumerable<T> kolekci příslušného typu metodám, které využívají úložiště prostředků nebo klienta v paměti. Nebo pro složitější scénáře můžete prostřednictvím injektáže závislostí poskytnout typy klientů nebo poskytovatelů 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:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
services.AddSingleton<IClientStore, CustomClientStore>();
services.AddIdentityServer()
.AddSigningCredential("CN=sts")
.AddInMemoryApiResources(MyApiResourceProvider.GetAllResources())
.AddAspNetIdentity<ApplicationUser>();
//...
}
Využívání tokenů zabezpečení
Ověřování proti koncovému bodu Připojení OpenID nebo vydávání vlastních tokenů zabezpečení se zabývá některými scénáři. Ale co služba, která jednoduše potřebuje omezit přístup k těm uživatelům, kteří mají platné tokeny zabezpečení poskytované jinou službou?
Pro tento scénář je v balíčku Microsoft.AspNetCore.Authentication.JwtBearer k dispozici middleware, který zpracovává tokeny JWT. JWT je zkratka pro "webový token JSON" 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, který pochází z mikroslužby Ordering.Api eShopOnContainers.
// Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//…
// Configure the pipeline to use authentication
app.UseAuthentication();
//…
app.UseEndpoints(endpoints =>
{
//...
});
}
public void ConfigureServices(IServiceCollection services)
{
var identityUrl = Configuration.GetValue<string>("IdentityUrl");
// Add Authentication services
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";
});
}
Parametry v tomto využití jsou:
Audience
představuje příjemce příchozího tokenu nebo prostředku, 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 ověřování nosný kód JWT používá tento identifikátor URI k získání veřejného klíče, který lze použít k ověření podpisu tokenu. Middleware také potvrzuje, žeiss
parametr v tokenu odpovídá URI.
Další parametr, RequireHttpsMetadata
je 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.
Díky tomuto middlewaru se tokeny JWT automaticky extrahují z autorizačních hlaviček. Pak se deserializují, ověřují (pomocí hodnot v parametrech Audience
Authority
) a ukládají se jako informace o uživateli, na které se mají odkazovat později pomocí akcí MVC nebo filtrů autorizace.
Middleware ověřování nosný kód JWT může také podporovat pokročilejší scénáře, jako je použití místního certifikátu k ověření tokenu, pokud autorita není dostupná. V tomto scénáři můžete zadat TokenValidationParameters
objekt v objektu JwtBearerOptions
.
Další materiály
Sdílení souborů cookie mezi aplikacemi
https://learn.microsoft.com/aspnet/core/security/cookie-sharingÚvod do systému Identity
https://learn.microsoft.com/aspnet/core/security/authentication/identityRick Anderson. Dvoufaktorové ověřování přes SMS
https://learn.microsoft.com/aspnet/core/security/authentication/2faPovolení ověřování přes Facebook, Google a další externí zprostředkovatele
https://learn.microsoft.com/aspnet/core/security/authentication/social/Michell Anicas. Úvod do OAuth 2
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2AspNet.Security.OAuth.Providers (úložiště GitHub pro poskytovatele ASP.NET OAuth)
https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers/tree/dev/srcIdentityServer4. Oficiální dokumentace
https://identityserver4.readthedocs.io/en/latest/