Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
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.
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.
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 nebosignInManager.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 |
Microsoft.AspNetCore.Authentication.Google | |
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:
- Získání ID klientské aplikace
- Získání tajného klíče klientské aplikace
- Konfigurace adresy URL přesměrování, kterou zpracovávají autorizační middleware a registrovaný poskytovatel
- 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.
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í.
IdentityServer4 nakonfigurujete v Program.cs voláním builder.Services.AddIdentityServer.
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.
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í, žeiss
parametr v tokenu odpovídá tomuto identifikátoru 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.
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 Audience
Authority
) 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
Sdílení souborů cookie mezi aplikacemi
https://learn.microsoft.com/aspnet/core/security/cookie-sharingÚvod do identity
https://learn.microsoft.com/aspnet/core/security/authentication/identityDvoufaktorové ověřování pomocí SMS
https://learn.microsoft.com/aspnet/core/security/authentication/2faPovolení ověřování pomocí Facebooku, Googlu a dalších externích poskytovatelů
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/