Vzdálené ověřování
Funkce vzdáleného ověřování adaptérů System.Web umožňuje aplikaci ASP.NET Core určit identity uživatele (ověřit požadavek HTTP) odložením na aplikaci ASP.NET. Povolením funkce přidáte koncový bod do aplikace ASP.NET, která vrátí serializovaný ClaimsPrincipal představující ověřeného uživatele pro všechny požadavky provedené do koncového bodu. Aplikace ASP.NET Core pak zaregistruje vlastní obslužnou rutinu ověřování, která (pro koncové body s povoleným vzdáleným ověřováním) určí uživatele identity voláním daného koncového bodu v aplikaci ASP.NET a předáním vybraných hlaviček a souborů cookie z původního požadavku přijatého aplikací ASP.NET Core.
Konfigurace
K povolení vzdáleného ověřování v řešení, které je už nastavené podle začínáme, je potřeba jen pár malých změn kódu.
Nejprve postupujte podle pokynů pro nastavení vzdálené aplikace a připojte aplikace ASP.NET Core a ASP.NET. Pak existuje jen několik dalších rozšiřujících metod volání pro povolení vzdáleného ověřování aplikací.
konfigurace aplikace ASP.NET
Aplikaci ASP.NET je potřeba nakonfigurovat tak, aby přidala koncový bod ověřování. Přidání koncového bodu ověřování se provádí voláním AddAuthenticationServer
metody rozšíření pro nastavení modulu HTTP, který sleduje požadavky na koncový bod ověřování. Mějte na paměti, že scénáře vzdáleného ověřování obvykle chtějí přidat také podporu proxy serveru, aby všechny související ověřování přesměrovávají správně trasu do aplikace ASP.NET Core, nikoli do ASP.NET.
SystemWebAdapterConfiguration.AddSystemWebAdapters(this)
.AddProxySupport(options => options.UseForwardedHeaders = true)
.AddRemoteAppServer(options =>
{
options.ApiKey = ConfigurationManager.AppSettings["RemoteAppApiKey"];
})
.AddAuthenticationServer();
konfigurace aplikace ASP.NET Core
Dále musí být aplikace ASP.NET Core nakonfigurovaná tak, aby povolovala obslužnou rutinu ověřování, která bude ověřovat uživatele provedením požadavku HTTP do aplikace ASP.NET. Opět se to provádí voláním AddAuthenticationClient
při registraci služeb System.Web Adapters:
builder.Services.AddSystemWebAdapters()
.AddRemoteAppClient(options =>
{
options.RemoteAppUrl = new Uri(builder.Configuration
["ReverseProxy:Clusters:fallbackCluster:Destinations:fallbackApp:Address"]);
options.ApiKey = builder.Configuration["RemoteAppApiKey"];
})
.AddAuthenticationClient(true);
Logická hodnota, která se předá AddAuthenticationClient
volání, určuje, jestli by vzdálené ověřování aplikací mělo být výchozím schématem ověřování. Předání true
způsobí, že se uživatel ověří prostřednictvím vzdáleného ověřování aplikací pro všechny požadavky, zatímco předání false
znamená, že se uživatel ověří jenom pomocí vzdáleného ověřování aplikací, pokud je schéma vzdálené aplikace výslovně požadováno (například s [Authorize(AuthenticationSchemes = RemoteAppAuthenticationDefaults.AuthenticationScheme)]
kontrolerem nebo metodou akce). Předání nepravda pro tento parametr má výhodu pouze vytváření požadavků HTTP na původní aplikaci ASP.NET pro ověřování koncových bodů, které vyžadují vzdálené ověřování aplikací, ale má nevýhodu vyžadování poznámek ke všem těmto koncovým bodům, aby bylo možné indikovat, že budou používat vzdálené ověřování aplikací.
Kromě logické hodnoty požadované můžou být volitelné zpětné volání předány k AddAuthenticationClient
úpravě některých dalších aspektů chování procesu vzdáleného ověřování:
RequestHeadersToForward
: Tato vlastnost obsahuje hlavičky, které by se měly předávat z požadavku při volání ověřovacího rozhraní API. Ve výchozím nastavení jsou jediné hlavičky přeposílanéAuthorization
aCookie
. Další záhlaví je možné přeposlat jejich přidáním do tohoto seznamu. Pokud je seznam vymazán (aby se nezadály žádné hlavičky), přeposílají se všechna záhlaví.ResponseHeadersToForward
: Tato vlastnost obsahuje hlavičky odpovědí, které by se měly rozšířit zpět z žádosti o ověření do původního volání, které vyžadovalo ověření ve scénářích, kde identity je výzva. Ve výchozím nastavení to zahrnujeLocation
,Set-Cookie
aWWW-Authenticate
hlavičky.AuthenticationEndpointPath
: Koncový bod v aplikaci ASP.NET, kde se mají provádět žádosti o ověření. Výchozí hodnota je/systemweb-adapters/authenticate
a musí odpovídat koncovému bodu zadanému v konfiguraci koncového bodu ověřování ASP.NET.
A konečně, pokud aplikace ASP.NET Core dříve nezahrnovala middleware pro ověřování, bude potřeba ho povolit (po směrování middlewaru, ale před autorizačním middlewarem):
app.UseAuthentication();
Návrh
- Pokud žádosti zpracovává aplikace ASP.NET Core, pokud je výchozí schéma vzdáleného ověřování aplikace nebo zadané koncovým bodem požadavku,
RemoteAuthenticationAuthHandler
pokusí se ověřit uživatele.- Obslužná rutina provede požadavek HTTP na koncový bod ověřování aplikace ASP.NET. Zkopíruje nakonfigurované hlavičky z aktuálního požadavku do tohoto nového, aby bylo možné předávat data relevantní pro ověřování. Jak už bylo zmíněno výše, výchozí chování je zkopírování
Authorize
aCookie
záhlaví. Hlavička klíče rozhraní API se také přidá pro účely zabezpečení.
- Obslužná rutina provede požadavek HTTP na koncový bod ověřování aplikace ASP.NET. Zkopíruje nakonfigurované hlavičky z aktuálního požadavku do tohoto nového, aby bylo možné předávat data relevantní pro ověřování. Jak už bylo zmíněno výše, výchozí chování je zkopírování
- Aplikace ASP.NET bude obsluhovat požadavky odeslané do ověřeného koncového bodu. Dokud se klíče rozhraní API shodují, aplikace ASP.NET vrátí buď serializovaný aktuální uživatel ClaimsPrincipal do textu odpovědi, nebo vrátí stavový kód HTTP (například 401 nebo 302) a hlavičky odpovědi označující selhání.
- Když aplikace
RemoteAuthenticationAuthHandler
ASP.NET Core obdrží odpověď z aplikace ASP.NET:- Pokud se deklarace IdentityPrincipal úspěšně vrátila, obslužná rutina ověřování ji deserializuje a použije ji jako aktuální uživatel identity.
- Pokud se deklarace IdentityPrincipal úspěšně nevrátila, obslužná rutina uloží výsledek a pokud je ověření vyzváno (protože uživatel například přistupuje k chráněnému prostředku), odpověď požadavku se aktualizuje stavovým kódem a vybranými hlavičkami odpovědi z odpovědi z ověřovacího koncového bodu. To umožňuje rozšířit odpovědi na výzvy (například přesměrování na přihlašovací stránku) koncovým uživatelům.
- Vzhledem k tomu, že výsledky koncového bodu ověření aplikace ASP.NET můžou zahrnovat data specifická pro tento koncový bod, můžou uživatelé zaregistrovat
IRemoteAuthenticationResultProcessor
implementace v aplikaci ASP.NET Core, která se bude spouštět na všech výsledcích ověřování, než se použijí. Například integrovanýIRemoteAuthenticationResultProcessor
objektRedirectUrlProcessor
vyhledáLocation
hlavičky odpovědi vrácené z ověřeného koncového bodu a zajistí, že se přesměrují zpět na hostitele aplikace ASP.NET Core, a ne přímo ASP.NET aplikaci.
- Vzhledem k tomu, že výsledky koncového bodu ověření aplikace ASP.NET můžou zahrnovat data specifická pro tento koncový bod, můžou uživatelé zaregistrovat
Známá omezení
Tento přístup vzdáleného ověřování má několik známých omezení:
- Vzhledem k tomu, že ověřování systému Windows závisí na popisovači systému Windows identity, tato funkce ověřování systému Windows nepodporuje. Budoucí práce se plánuje prozkoumat, jak může fungovat sdílené ověřování systému Windows. Další informace najdete v tématu dotnet/systemweb-adapters#246 .
- Tato funkce umožňuje aplikaci ASP.NET Core používat ověřenou identity aplikaci ASP.NET, ale všechny akce související s uživateli (přihlášení, odhlášení atd.) je stále potřeba směrovat prostřednictvím aplikace ASP.NET.
Alternativy
Pokud se ověřování v aplikaci ASP.NET provádí pomocí Microsoft.Owin
Cookie middlewaru ověřování, je alternativním řešením identity sdílení nakonfigurovat ASP.NET a ASP.NET core aplikace tak, aby mohly sdílet ověřování cookie. Sdílení ověřování cookie umožňuje:
- Obě aplikace k určení uživatele identity ze stejného cookie.
- Přihlášení nebo odhlášení z jedné aplikace uživatele přihlásí nebo odhlásí z druhé aplikace.
Upozorňujeme, že vzhledem k tomu, že přihlášení obvykle závisí na konkrétní databázi, nebudou v obou aplikacích fungovat všechny funkce ověřování:
- Uživatelé by se měli přihlásit jenom prostřednictvím jedné z aplikací, ať už ASP.NET, nebo ASP.NET core, podle toho, s jakou databází se má pracovat.
- Obě aplikace můžou zobrazit deklarace identity uživatelů identity a uživatelů.
- Obě aplikace můžou uživatele odhlásit.
Podrobnosti o konfiguraci souborů cookie pro ověřování sdílení mezi aplikacemi ASP.NET a ASP.NET Core jsou k dispozici v cookie dokumentaci ke sdílení. Následující ukázky v úložišti System.Web Adapters Na GitHubu demonstrují vzdálené ověřování aplikací se sdílenou cookie konfigurací, která umožňuje oběma aplikacím přihlásit se a odhlásit uživatele:
Ověřování sdílením je dobrou volbou, pokud platí obě tyto možnosti:
- Aplikace ASP.NET už používá
Microsoft.Owin
cookie ověřování. - Aplikaci ASP.NET a aplikace ASP.NET Core je možné aktualizovat tak, aby používaly odpovídající nastavení ochrany dat. Odpovídající nastavení sdílené ochrany dat zahrnuje sdílenou cestu k souboru, mezipaměť Redis nebo Azure Blob Storage pro ukládání klíčů ochrany dat.
V jiných scénářích je přístup vzdáleného ověřování popsaný dříve v tomto dokumentu flexibilnější a pravděpodobně je vhodnější.