Titkos ügyfélkódok vagy ügyféltanúsítványok
Mivel a webalkalmazás most egy alsóbb rétegbeli webes API-t hív meg, adjon meg egy titkos ügyfélkulcsot vagy ügyféltanúsítványt a appsettings.json fájlban. Hozzáadhat egy szakaszt is, amely a következőket adja meg:
- Az alsóbb rétegbeli webes API URL-címe
- Az API meghívásához szükséges hatókörök
A következő példában a szakasz ezeket a GraphBeta
beállításokat adja meg.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret":"[Enter_the_Client_Secret_Here]"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Feljegyzés
Javasolhat ügyfél-hitelesítő adatok gyűjteményét, beleértve egy hitelesítő adatok nélküli megoldást, például a számítási feladatok identitásának összevonását az Azure Kuberneteshez.
A Microsoft.Identity.Web korábbi verziói egyetlen "ClientSecret" tulajdonságban fejezték ki az ügyfélkulcsot az "Ügyfél hitelesítő adatai" helyett. Ez továbbra is támogatott a visszamenőleges kompatibilitás érdekében, de nem használhatja a "ClientSecret" tulajdonságot és az "Ügyfél hitelesítő adatai" gyűjteményt.
Ügyfélkód helyett ügyféltanúsítványt is megadhat. Az alábbi kódrészlet az Azure Key Vaultban tárolt tanúsítvány használatát mutatja be.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
"KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Figyelmeztetés
Ha elfelejt tömbre váltani Scopes
, a hatókörök használatakor IDownstreamApi
null érték jelenik meg, és IDownstreamApi
névtelen (nem hitelesített) hívást kísérel meg az alsóbb rétegbeli API-hoz, ami egy 401/unauthenticated
.
A Microsoft.Identity.Web számos módszert kínál a tanúsítványok leírására konfiguráció vagy kód alapján egyaránt. További információ: Microsoft.Identity.Web – Tanúsítványok használata a GitHubon.
A Startup.cs fájl módosítása
A webalkalmazásnak jogkivonatot kell beszereznie az alsóbb rétegbeli API-hoz. Ezt a sort a .EnableTokenAcquisitionToCallDownstreamApi()
következő sor .AddMicrosoftIdentityWebApp(Configuration)
hozzáadásával adhatja meg: Ez a sor elérhetővé teszi a vezérlőben és az IAuthorizationHeaderProvider
oldalműveletekben használható szolgáltatást. Azonban, ahogy az alábbi két lehetőség is látható, egyszerűbben is elvégezhető. A tokengyorsítótár implementálását is ki kell választania, például .AddInMemoryTokenCaches()
a Startup.cs:
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddInMemoryTokenCaches();
// ...
}
// ...
}
Az átadott EnableTokenAcquisitionToCallDownstreamApi
hatókörök nem kötelezőek, és lehetővé teszik a webalkalmazás számára, hogy a bejelentkezéskor kérje a hatóköröket és a felhasználó hozzájárulását ezekhez a hatókörökhöz. Ha nem adja meg a hatóköröket, a Microsoft.Identity.Web növekményes hozzájárulást tesz lehetővé.
A Microsoft.Identity.Web két mechanizmust kínál a webes API webalkalmazásból való meghívására anélkül, hogy jogkivonatot kellene beszereznie. A választott lehetőség attól függ, hogy meghívja-e a Microsoft Graphot vagy egy másik API-t.
1. lehetőség: A Microsoft Graph meghívása
Ha meg szeretné hívni a Microsoft Graphot, a Microsoft.Identity.Web lehetővé teszi a GraphServiceClient
(Microsoft Graph SDK által közzétett) közvetlen használatát az API-műveletekben. A Microsoft Graph felfedéséhez:
Adja hozzá a Microsoft.Identity.Web.GraphServiceClient NuGet-csomagot a projekthez.
Adja hozzá .AddMicrosoftGraph()
a .EnableTokenAcquisitionToCallDownstreamApi()
Startup.cs fájlban. .AddMicrosoftGraph()
több felülbírálást is kapott. A konfigurációs szakaszt paraméterként használó felülbírálás használatával a kód a következő lesz:
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
}
// ...
}
2. lehetőség: A Microsoft Graphtól eltérő alsóbb rétegbeli webes API meghívása
Ha a Microsoft Graphtól eltérő API-t szeretne meghívni, a Microsoft.Identity.Web lehetővé teszi a felület használatát az IDownstreamApi
API-műveletekben. A felület használatához:
Adja hozzá a Microsoft.Identity.Web.DownstreamApi NuGet-csomagot a projekthez.
Adja hozzá .AddDownstreamApi()
a .EnableTokenAcquisitionToCallDownstreamApi()
Startup.cs fájlban. .AddDownstreamApi()
két argumentuma van, és az alábbi kódrészletben jelenik meg:
- A vezérlőműveletek során a megfelelő konfigurációra hivatkozó szolgáltatás (API) neve
- egy konfigurációs szakasz, amely az alsóbb rétegbeli webes API meghívásához használt paramétereket jelöli.
using Microsoft.Identity.Web;
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
.AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
// ...
}
// ...
}
Összegzés
A webes API-khoz hasonlóan különböző tokengyorsítótár-implementációkat is választhat. További információ: Microsoft.Identity.Web – Token cache szerializálása a GitHubon.
Az alábbi képen a Microsoft.Identity.Web különböző lehetőségei láthatók, és azok hatása a Startup.cs fájlra:
Titkos ügyfélkódok vagy ügyféltanúsítványok
Mivel a webalkalmazás most egy alsóbb rétegbeli webes API-t hív meg, adjon meg egy titkos ügyfélkulcsot vagy ügyféltanúsítványt a appsettings.json fájlban. Hozzáadhat egy szakaszt is, amely a következőket adja meg:
- Az alsóbb rétegbeli webes API URL-címe
- Az API meghívásához szükséges hatókörök
A következő példában a szakasz ezeket a GraphBeta
beállításokat adja meg.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "ClientSecret",
"ClientSecret":"[Enter_the_Client_Secret_Here]"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Feljegyzés
Javasolhat ügyfél-hitelesítő adatok gyűjteményét, beleértve egy hitelesítő adatok nélküli megoldást, például a számítási feladatok identitásának összevonását az Azure Kuberneteshez.
A Microsoft.Identity.Web korábbi verziói egyetlen "ClientSecret" tulajdonságban fejezték ki az ügyfélkulcsot az "Ügyfél hitelesítő adatai" helyett. Ez továbbra is támogatott a visszamenőleges kompatibilitás érdekében, de nem használhatja a "ClientSecret" tulajdonságot és az "Ügyfél hitelesítő adatai" gyűjteményt.
Ügyfélkód helyett ügyféltanúsítványt is megadhat. Az alábbi kódrészlet az Azure Key Vaultban tárolt tanúsítvány használatát mutatja be.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "[Enter_the_Application_Id_Here]",
"TenantId": "common",
// To call an API
"ClientCredentials": [
{
"SourceType": "KeyVault",
"KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
"KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
}
]
},
"GraphBeta": {
"BaseUrl": "https://graph.microsoft.com/beta",
"Scopes": ["user.read"]
}
}
Figyelmeztetés
Ha elfelejt tömbre váltani Scopes
, a hatókörök használatakor IDownstreamApi
null érték jelenik meg, és IDownstreamApi
névtelen (nem hitelesített) hívást kísérel meg az alsóbb rétegbeli API-hoz, ami egy 401/unauthenticated
.
A Microsoft.Identity.Web számos módszert kínál a tanúsítványok leírására konfiguráció vagy kód alapján egyaránt. További információ: Microsoft.Identity.Web – Tanúsítványok használata a GitHubon.
Startup.Auth.cs
A webalkalmazásnak jogkivonatot kell beszereznie az alsóbb rétegbeli API-hoz, a Microsoft.Identity.Web két mechanizmust biztosít a webes API webalkalmazásból való meghívására. A választott lehetőség attól függ, hogy meghívja-e a Microsoft Graphot vagy egy másik API-t.
1. lehetőség: A Microsoft Graph meghívása
Ha meg szeretné hívni a Microsoft Graphot, a Microsoft.Identity.Web lehetővé teszi a GraphServiceClient
(Microsoft Graph SDK által közzétett) közvetlen használatát az API-műveletekben. A Microsoft Graph felfedéséhez:
- Adja hozzá a Microsoft.Identity.Web.GraphServiceClient NuGet-csomagot a projekthez.
- Adja hozzá
.AddMicrosoftGraph()
a szolgáltatásgyűjteményhez a Startup.Auth.cs fájlban. .AddMicrosoftGraph()
több felülbírálást is kapott. A konfigurációs szakaszt paraméterként használó felülbírálás használatával a kód a következő lesz:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.OWIN;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.IdentityModel.Validators;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace WebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
// Get an TokenAcquirerFactory specialized for OWIN
OwinTokenAcquirerFactory owinTokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
// Configure the web app.
app.AddMicrosoftIdentityWebApp(owinTokenAcquirerFactory,
updateOptions: options => {});
// Add the services you need.
owinTokenAcquirerFactory.Services
.Configure<ConfidentialClientApplicationOptions>(options =>
{ options.RedirectUri = "https://localhost:44326/"; })
.AddMicrosoftGraph()
.AddInMemoryTokenCaches();
owinTokenAcquirerFactory.Build();
}
}
}
2. lehetőség: A Microsoft Graphtól eltérő alsóbb rétegbeli webes API meghívása
Ha a Microsoft Graphtól eltérő API-t szeretne meghívni, a Microsoft.Identity.Web lehetővé teszi a felület használatát az IDownstreamApi
API-műveletekben. A felület használatához:
- Adja hozzá a Microsoft.Identity.Web.DownstreamApi NuGet-csomagot a projekthez.
- Adja hozzá
.AddDownstreamApi()
a .EnableTokenAcquisitionToCallDownstreamApi()
Startup.cs fájlban. .AddDownstreamApi()
két argumentuma van:
- Egy szolgáltatás (API) neve: ezt a nevet használja a vezérlőműveletekben a megfelelő konfigurációra való hivatkozáshoz
- egy konfigurációs szakasz, amely az alsóbb rétegbeli webes API meghívásához használt paramétereket jelöli.
A kód a következő:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.OWIN;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.IdentityModel.Validators;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace WebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
// Get a TokenAcquirerFactory specialized for OWIN.
OwinTokenAcquirerFactory owinTokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
// Configure the web app.
app.AddMicrosoftIdentityWebApp(owinTokenAcquirerFactory,
updateOptions: options => {});
// Add the services you need.
owinTokenAcquirerFactory.Services
.Configure<ConfidentialClientApplicationOptions>(options =>
{ options.RedirectUri = "https://localhost:44326/"; })
.AddDownstreamApi("Graph", owinTokenAcquirerFactory.Configuration.GetSection("GraphBeta"))
.AddInMemoryTokenCaches();
owinTokenAcquirerFactory.Build();
}
}
}
Összegzés
A tokengyorsítótár különböző implementációi közül választhat. További információ: Microsoft.Identity.Web – Token cache szerializálása a GitHubon.
Az alábbi képen a Microsoft.Identity.Web különböző lehetőségei láthatók, és azok hatása a Startup.cs fájlra:
A cikkben és a következő példában szereplő kódmintákat a ASP.NET webalkalmazás-mintából nyerjük ki. A teljes megvalósítási részletekért tekintse meg ezt a mintát.
A Java-kódminta implementálása
A cikkben és az alábbi kódmintákat a Microsoft Graphot meghívó Java-webalkalmazásból nyerjük ki, amely egy MSAL-t java-hoz használó webalkalmazás-minta.
A minta jelenleg lehetővé teszi az MSAL for Java számára az engedélyezési kód URL-címét, és kezeli a Microsoft Identitásplatform engedélyezési végpontjának navigációját. A Sprint Security használatával is bejelentkezhet a felhasználó. A teljes megvalósítási részletekért tekintse meg a mintát.
A Node.js kódminta implementálása
A cikkben és az alábbi példában szereplő kódmintákat a microsoft graphot meghívó Node.js &Express.js webalkalmazásból nyerjük ki, amely egy MSAL-csomópontot használó webalkalmazás-minta.
A minta jelenleg lehetővé teszi az MSAL-csomópont számára az engedélyezési kód URL-címét, és kezeli a Microsoft Identitásplatform engedélyezési végpontjának navigációját. Ez az alábbiakban látható:
/**
* Prepares the auth code request parameters and initiates the first leg of auth code flow
* @param req: Express request object
* @param res: Express response object
* @param next: Express next function
* @param authCodeUrlRequestParams: parameters for requesting an auth code url
* @param authCodeRequestParams: parameters for requesting tokens using auth code
*/
redirectToAuthCodeUrl(authCodeUrlRequestParams, authCodeRequestParams, msalInstance) {
return async (req, res, next) => {
// Generate PKCE Codes before starting the authorization flow
const { verifier, challenge } = await this.cryptoProvider.generatePkceCodes();
// Set generated PKCE codes and method as session vars
req.session.pkceCodes = {
challengeMethod: 'S256',
verifier: verifier,
challenge: challenge,
};
/**
* By manipulating the request objects below before each request, we can obtain
* auth artifacts with desired claims. For more information, visit:
* https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationurlrequest
* https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationcoderequest
**/
req.session.authCodeUrlRequest = {
...authCodeUrlRequestParams,
responseMode: msal.ResponseMode.FORM_POST, // recommended for confidential clients
codeChallenge: req.session.pkceCodes.challenge,
codeChallengeMethod: req.session.pkceCodes.challengeMethod,
};
req.session.authCodeRequest = {
...authCodeRequestParams,
code: '',
};
try {
const authCodeUrlResponse = await msalInstance.getAuthCodeUrl(req.session.authCodeUrlRequest);
res.redirect(authCodeUrlResponse);
} catch (error) {
next(error);
}
};
}
A Python-kódminta implementálása
A cikkben szereplő kódrészletek és az alábbiak a Microsoft Graph-mintát hívó Python-webalkalmazásból nyerhetők ki az identitáscsomag (az MSAL Python körüli burkoló) használatával.
A minta az identitáscsomagot használja az engedélyezési kód URL-címének létrehozásához, és kezeli a Microsoft Identitásplatform engedélyezési végpontjának navigációját. A teljes megvalósítási részletekért tekintse meg a mintát.
A Microsoft.Identity.Web leegyszerűsíti a kódot a megfelelő OpenID Connect-beállítások beállításával, a kapott eseményre való feliratkozással és a kód beváltásával. Az engedélyezési kód beváltásához nincs szükség további kódra. Ennek működésével kapcsolatos részletekért tekintse meg a Microsoft.Identity.Web forráskódját .
A Microsoft.Identity.Web.OWIN leegyszerűsíti a kódot a megfelelő OpenID Connect-beállítások beállításával, a kapott eseményre való feliratkozással és a kód beváltásával. Az engedélyezési kód beváltásához nincs szükség további kódra. Ennek működésével kapcsolatos részletekért tekintse meg a Microsoft.Identity.Web forráskódját .
Az AuthProvider osztály handleRedirect metódusa feldolgozza a Microsoft Entra-azonosítótól kapott engedélyezési kódot. Ez az alábbiakban látható:
handleRedirect(options = {}) {
return async (req, res, next) => {
if (!req.body || !req.body.state) {
return next(new Error('Error: response not found'));
}
const authCodeRequest = {
...req.session.authCodeRequest,
code: req.body.code,
codeVerifier: req.session.pkceCodes.verifier,
};
try {
const msalInstance = this.getMsalInstance(this.msalConfig);
if (req.session.tokenCache) {
msalInstance.getTokenCache().deserialize(req.session.tokenCache);
}
const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
req.session.tokenCache = msalInstance.getTokenCache().serialize();
req.session.idToken = tokenResponse.idToken;
req.session.account = tokenResponse.account;
req.session.isAuthenticated = true;
const state = JSON.parse(this.cryptoProvider.base64Decode(req.body.state));
res.redirect(state.successRedirect);
} catch (error) {
next(error);
}
}
}
Tekintse meg a felhasználókat bejelentkező webalkalmazást: Kódkonfiguráció , amelyből megtudhatja, hogy a Java-minta hogyan kapja meg az engedélyezési kódot. Miután az alkalmazás megkapta a kódot, a AuthFilter.java#L51-L56:
- Meghatalmazottak a metódushoz az
AuthHelper.processAuthenticationCodeRedirect
AuthHelper.java#L67-L97 fájlban.
- Hívások
getAuthResultByAuthCode
.
class AuthHelper {
// Code omitted
void processAuthenticationCodeRedirect(HttpServletRequest httpRequest, String currentUri, String fullUrl)
throws Throwable {
// Code omitted
AuthenticationResponse authResponse = AuthenticationResponseParser.parse(new URI(fullUrl), params);
// Code omitted
IAuthenticationResult result = getAuthResultByAuthCode(
httpRequest,
oidcResponse.getAuthorizationCode(),
currentUri);
// Code omitted
}
}
A getAuthResultByAuthCode
metódus AuthHelper.java#L176-ban van definiálva. Létrehoz egy MSAL-t ConfidentialClientApplication
, majd meghívja az engedélyezési kódból létrehozott hívásokat acquireToken()
AuthorizationCodeParameters
.
private IAuthenticationResult getAuthResultByAuthCode(
HttpServletRequest httpServletRequest,
AuthorizationCode authorizationCode,
String currentUri) throws Throwable {
IAuthenticationResult result;
ConfidentialClientApplication app;
try {
app = createClientApplication();
String authCode = authorizationCode.getValue();
AuthorizationCodeParameters parameters = AuthorizationCodeParameters.builder(
authCode,
new URI(currentUri)).
build();
Future<IAuthenticationResult> future = app.acquireToken(parameters);
result = future.get();
} catch (ExecutionException e) {
throw e.getCause();
}
if (result == null) {
throw new ServiceUnavailableException("authentication result was null");
}
SessionManagementHelper.storeTokenCacheInSession(httpServletRequest, app.tokenCache().serialize());
return result;
}
private ConfidentialClientApplication createClientApplication() throws MalformedURLException {
return ConfidentialClientApplication.builder(clientId, ClientCredentialFactory.create(clientSecret)).
authority(authority).
build();
}
Tekintse meg a felhasználókat bejelentkező webalkalmazást: Kódkonfiguráció a Python-minta engedélyezési kódjának lekéréséhez.
A Microsoft bejelentkezési képernyője elküldi az engedélyezési kódot az /getAToken
alkalmazásregisztrációban megadott URL-címre. Az auth_response
útvonal kezeli ezt az URL-címet, meghívja auth.complete_login
az engedélyezési kód feldolgozására, majd hibát ad vissza, vagy átirányítja a kezdőlapra.
@app.route(app_config.REDIRECT_PATH)
def auth_response():
result = auth.complete_log_in(request.args)
if "error" in result:
return render_template("auth_error.html", result=result)
return redirect(url_for("index"))
A kód teljes kontextusát lásd a app.py .
Az ügyfélkód helyett a bizalmas ügyfélalkalmazás ügyféltanúsítvány vagy ügyfélérvényesítés használatával is igazolni tudja személyazonosságát.
Az ügyfél-állítások használata egy speciális forgatókönyv, amelyet az ügyfél-állítások részleteznek.
Az ASP.NET alapvető oktatóanyag függőséginjektálást használ annak eldöntéséhez, hogy a tokengyorsítótár implementációja az alkalmazás Startup.cs fájljában van-e. A Microsoft.Identity.Web előre összeállított token-cache szerializálókat tartalmaz, amelyek a tokengyorsítótár-szerializálásban leírtak. Érdekes lehetőség az ASP.NET Core elosztott memóriagyorsítótárak kiválasztása:
// Use a distributed token cache by adding:
services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(
initialScopes: new string[] { "user.read" })
.AddDistributedTokenCaches();
// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();
// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = _config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
A jogkivonat-gyorsítótár-szolgáltatókkal kapcsolatos részletekért lásd még a Microsoft.Identity.Web tokengyorsítótár-szerializálási cikkét, valamint a ASP.NET Core webalkalmazás oktatóanyagait | A webalkalmazások oktatóanyagának tokengyorsítótár-fázisa.
Az ASP.NET oktatóanyag függőséginjektálást használ, hogy eldöntse az alkalmazáshoz tartozó Startup.Auth.cs fájl jogkivonatgyorsítótár-implementációját. A Microsoft.Identity.Web előre összeállított token-cache szerializálókat tartalmaz, amelyek a tokengyorsítótár-szerializálásban leírtak. Érdekes lehetőség az ASP.NET Core elosztott memóriagyorsítótárak kiválasztása:
var services = owinTokenAcquirerFactory.Services;
// Use a distributed token cache by adding:
services.AddDistributedTokenCaches();
// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();
// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = _config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
A jogkivonat-gyorsítótár-szolgáltatókkal kapcsolatos részletekért lásd még a Microsoft.Identity.Web Token Cache szerializálási cikkét, valamint a ASP.NET Core webalkalmazás-oktatóanyagait | A webalkalmazás oktatóanyagának tokengyorsítótár-fázisa.
További részletekért lásd a tokengyorsítótár szerializálását MSAL.NET.
Az MSAL Java metódusokat biztosít a jogkivonat-gyorsítótár szerializálására és deszerializálására. A Java-minta kezeli a munkamenet szerializálását a AuthHelper.java#L99-L122 metódusban látható getAuthResultBySilentFlow
módon:
IAuthenticationResult getAuthResultBySilentFlow(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
throws Throwable {
IAuthenticationResult result = SessionManagementHelper.getAuthSessionObject(httpRequest);
IConfidentialClientApplication app = createClientApplication();
Object tokenCache = httpRequest.getSession().getAttribute("token_cache");
if (tokenCache != null) {
app.tokenCache().deserialize(tokenCache.toString());
}
SilentParameters parameters = SilentParameters.builder(
Collections.singleton("User.Read"),
result.account()).build();
CompletableFuture<IAuthenticationResult> future = app.acquireTokenSilently(parameters);
IAuthenticationResult updatedResult = future.get();
// Update session with latest token cache.
SessionManagementHelper.storeTokenCacheInSession(httpRequest, app.tokenCache().serialize());
return updatedResult;
}
Az osztály részleteit a SessionManagementHelper
Java MSAL-mintájában adhatja meg.
A Node.js mintában az alkalmazás munkamenete a tokengyorsítótár tárolására szolgál. Az MSAL-csomópontgyorsítótár-metódusok használatával a jogkivonat-gyorsítótár a munkamenetben a jogkivonat-kérés végrehajtása előtt beolvasva, majd a jogkivonat-kérés sikeres befejezése után frissül. Ez az alábbiakban látható:
acquireToken(options = {}) {
return async (req, res, next) => {
try {
const msalInstance = this.getMsalInstance(this.msalConfig);
/**
* If a token cache exists in the session, deserialize it and set it as the
* cache for the new MSAL CCA instance. For more, see:
* https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
*/
if (req.session.tokenCache) {
msalInstance.getTokenCache().deserialize(req.session.tokenCache);
}
const tokenResponse = await msalInstance.acquireTokenSilent({
account: req.session.account,
scopes: options.scopes || [],
});
/**
* On successful token acquisition, write the updated token
* cache back to the session. For more, see:
* https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
*/
req.session.tokenCache = msalInstance.getTokenCache().serialize();
req.session.accessToken = tokenResponse.accessToken;
req.session.idToken = tokenResponse.idToken;
req.session.account = tokenResponse.account;
res.redirect(options.successRedirect);
} catch (error) {
if (error instanceof msal.InteractionRequiredAuthError) {
return this.login({
scopes: options.scopes || [],
redirectUri: options.redirectUri,
successRedirect: options.successRedirect || '/',
})(req, res, next);
}
next(error);
}
};
}
A Python-mintában az identitáscsomag gondoskodik a jogkivonat-gyorsítótárról, a globális session
objektumot használva a tároláshoz.
A Flask beépített támogatást nyújt a cookie-ban tárolt munkamenetekhez, de az identitás cookie-k hossza miatt a minta a Flask-session csomagot használja. Minden inicializálva van a app.py:
import identity
import identity.web
import requests
from flask import Flask, redirect, render_template, request, session, url_for
from flask_session import Session
import app_config
app = Flask(__name__)
app.config.from_object(app_config)
Session(app)
auth = identity.web.Auth(
session=session,
authority=app.config["AUTHORITY"],
client_id=app.config["CLIENT_ID"],
client_credential=app.config["CLIENT_SECRET"],
)
A Flask-session csomag a SESSION_TYPE="filesystem"
app_config.py
beállítás miatt a helyi fájlrendszerrel tárolja a munkameneteket.
Éles környezetben olyan beállítást kell használnia, amely több példányban is megmarad, és üzembe helyezi az alkalmazást, például "sqlachemy" vagy "redis".
Ezen a ponton, amikor a felhasználó bejelentkezik, a rendszer egy jogkivonatot tárol a jogkivonat-gyorsítótárban. Nézzük meg, hogyan használják a webalkalmazás más részeiben.