Ниже перечислены библиотеки Майкрософт, поддерживающие веб-приложения.
Секреты клиента или сертификаты клиента
Учитывая, что веб-приложение теперь вызывает нижестоящий веб-API, укажите секрет клиента или сертификат клиента в файле appsettings.json. Можно также добавить раздел, который указывает:
- URL-адрес нижестоящего веб-API;
- необходимые области для вызова API.
В следующем примере эти параметры задаются в разделе GraphBeta
.
{
"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"]
}
}
Примечание.
Вы можете предложить коллекцию учетных данных клиента, включая решение без учетных данных, например федерацию удостоверений рабочей нагрузки для Azure Kubernetes.
Предыдущие версии Microsoft.Identity.Web выразили секрет клиента в одном свойстве ClientSecret вместо ClientCredentials. Это по-прежнему поддерживается для обратной совместимости, но нельзя использовать свойство ClientSecret и коллекцию ClientCredentials.
Вместо секрета клиента можно предоставить сертификат клиента. В приведенном ниже фрагменте кода показано использование сертификата, хранящегося в Azure Key Vault.
{
"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"]
}
}
Предупреждение
Если вы забыли изменить Scopes
массив, при попытке использовать IDownstreamApi
области будут отображаться null, и IDownstreamApi
будет предпринята попытка анонимного (неуверенного) вызова нижестоящего API, что приведет к 401/unauthenticated
возникновению ошибки.
Microsoft.Identity.Web позволяет описывать сертификаты несколькими способами, как по конфигурации, так и по коду. Дополнительные сведения см. в статье на GitHub об использовании Microsoft.Identity.Web с сертификатами.
Изменение файла Startup.cs
Веб-приложение должно получить маркер для нижестоящего API. Его можно указать в строке .EnableTokenAcquisitionToCallDownstreamApi()
после .AddMicrosoftIdentityWebApp(Configuration)
. Эта строка предоставляет службу IAuthorizationHeaderProvider
, которую можно использовать для действий контроллера и страницы. Однако, как вы видите в следующих двух вариантах, это можно сделать проще. Кроме того, необходимо выбрать реализацию кэша маркеров, например .AddInMemoryTokenCaches()
в 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();
// ...
}
// ...
}
Передаваемые области являются необязательными и позволяют веб-приложению запрашивать области EnableTokenAcquisitionToCallDownstreamApi
и согласие пользователя на эти области при входе. Если вы не указываете области, Microsoft.Identity.Web включает добавочный интерфейс согласия.
Microsoft.Identity.Web предлагает два механизма вызова веб-API из веб-приложения без получения маркера. Выбор зависит от того, что необходимо вызывать: Microsoft Graph или другой API.
Вариант 1. Вызов Microsoft Graph
Если необходимо вызвать Microsoft Graph, Microsoft.Identity.Web позволяет напрямую использовать GraphServiceClient
(предоставляется пакетом SDK Microsoft Graph) в действиях API. Чтобы предоставить Microsoft Graph, выполните указанные ниже действия.
Добавьте в проект пакет NuGet Microsoft.Identity.Web.GraphServiceClient.
Добавьте .AddMicrosoftGraph()
после .EnableTokenAcquisitionToCallDownstreamApi()
в файл Startup.cs. .AddMicrosoftGraph()
имеет несколько переопределений. При использовании переопределения, которое принимает в качестве параметра раздел конфигурации, код принимает следующий вид:
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. Вызов нижестоящего веб-API, отличного от Microsoft Graph
Если вы хотите вызвать API, отличный от Microsoft Graph, Microsoft.Identity.Web позволяет использовать IDownstreamApi
интерфейс в действиях API. Чтобы использовать этот интерфейс, выполните указанные ниже действия.
Добавьте в проект пакет NuGet Microsoft.Identity.Web.DownstreamApi.
Добавьте .AddDownstreamApi()
после .EnableTokenAcquisitionToCallDownstreamApi()
в файл Startup.cs. .AddDownstreamApi()
имеет два аргумента и показан в следующем фрагменте кода:
- Имя службы (API), которая используется в действиях контроллера для ссылки на соответствующую конфигурацию.
- раздел конфигурации, представляющий параметры, используемые для вызова нижестоящего веб-API.
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();
// ...
}
// ...
}
Итоги
Как и в случае с веб-API, можно выбрать различные реализации кэша маркеров. Дополнительные сведения см. в статье на GitHub Microsoft.Identity.Web: сериализация кэша маркеров.
На следующем рисунке показаны различные возможности Microsoft.Identity.Web и их влияние на файл Startup.cs :
Секреты клиента или сертификаты клиента
Учитывая, что веб-приложение теперь вызывает нижестоящий веб-API, укажите секрет клиента или сертификат клиента в файле appsettings.json. Можно также добавить раздел, который указывает:
- URL-адрес нижестоящего веб-API;
- необходимые области для вызова API.
В следующем примере эти параметры задаются в разделе GraphBeta
.
{
"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"]
}
}
Примечание.
Вы можете предложить коллекцию учетных данных клиента, включая решение без учетных данных, например федерацию удостоверений рабочей нагрузки для Azure Kubernetes.
Предыдущие версии Microsoft.Identity.Web выразили секрет клиента в одном свойстве ClientSecret вместо ClientCredentials. Это по-прежнему поддерживается для обратной совместимости, но нельзя использовать свойство ClientSecret и коллекцию ClientCredentials.
Вместо секрета клиента можно предоставить сертификат клиента. В приведенном ниже фрагменте кода показано использование сертификата, хранящегося в Azure Key Vault.
{
"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"]
}
}
Предупреждение
Если вы забыли изменить Scopes
массив, при попытке использовать IDownstreamApi
области будут отображаться null, и IDownstreamApi
будет предпринята попытка анонимного (неуверенного) вызова нижестоящего API, что приведет к 401/unauthenticated
возникновению ошибки.
Microsoft.Identity.Web позволяет описывать сертификаты несколькими способами, как по конфигурации, так и по коду. Дополнительные сведения см. в статье на GitHub об использовании Microsoft.Identity.Web с сертификатами.
Startup.Auth.cs
Веб-приложение должно получить маркер для нижестоящего API, Microsoft.Identity.Web предоставляет два механизма вызова веб-API из веб-приложения. Выбор зависит от того, что необходимо вызывать: Microsoft Graph или другой API.
Вариант 1. Вызов Microsoft Graph
Если необходимо вызвать Microsoft Graph, Microsoft.Identity.Web позволяет напрямую использовать GraphServiceClient
(предоставляется пакетом SDK Microsoft Graph) в действиях API. Чтобы предоставить Microsoft Graph, выполните указанные ниже действия.
- Добавьте в проект пакет NuGet Microsoft.Identity.Web.GraphServiceClient.
- Добавьте
.AddMicrosoftGraph()
в коллекцию служб в файле Startup.Auth.cs . .AddMicrosoftGraph()
имеет несколько переопределений. При использовании переопределения, которое принимает в качестве параметра раздел конфигурации, код принимает следующий вид:
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. Вызов нижестоящего веб-API, отличного от Microsoft Graph
Если вы хотите вызвать API, отличный от Microsoft Graph, Microsoft.Identity.Web позволяет использовать IDownstreamApi
интерфейс в действиях API. Чтобы использовать этот интерфейс, выполните указанные ниже действия.
- Добавьте в проект пакет NuGet Microsoft.Identity.Web.DownstreamApi.
- Добавьте
.AddDownstreamApi()
после .EnableTokenAcquisitionToCallDownstreamApi()
в файл Startup.cs. .AddDownstreamApi()
имеет два аргумента:
- Имя службы (API): это имя используется в действиях контроллера для ссылки на соответствующую конфигурацию.
- раздел конфигурации, представляющий параметры, используемые для вызова нижестоящего веб-API.
Вот этот код:
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();
}
}
}
Итоги
Можно выбрать различные реализации кэша маркеров. Дополнительные сведения см. в статье на GitHub Microsoft.Identity.Web: сериализация кэша маркеров.
На следующем рисунке показаны различные возможности Microsoft.Identity.Web и их влияние на файл Startup.cs :
Примеры кода в этой и следующей статьях взяты из примера веб-приложения ASP.NET. Этот пример можно просмотреть для получения подробной информации о его реализации.
Реализация примера кода Java
Примеры кода в этой и следующей статьях взяты из примера веб-приложения Веб-приложение Java, которое вызывает Microsoft Graph с использованием MSAL для Java.
В настоящее время пример позволяет MSAL для Java создать URL-адрес кода авторизации и обработать переход к конечной точке авторизации для платформы удостоверений Майкрософт. Кроме того, можно использовать безопасность спринта для входа пользователя в систему. Этот пример можно просмотреть для получения подробной информации о его реализации.
Реализация примера кода Node.js
Примеры кода в этой статье и приведенные ниже примеры извлекаются из веб-приложения Node.js и Express.js, которое вызывает Microsoft Graph, пример веб-приложения, использующего MSAL Node.
В настоящее время пример позволяет MSAL Node создать URL-адрес кода авторизации и обрабатывает навигацию в конечную точку авторизации для платформа удостоверений Майкрософт. Ниже показано следующее:
/**
* 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);
}
};
}
Реализация примера кода Python
Фрагменты кода в этой статье и следующие фрагменты кода извлекаются из веб-приложения Python, вызывающего пример Microsoft Graph , с помощью пакета удостоверений (оболочка вокруг MSAL Python).
В примере используется пакет удостоверений для создания URL-адреса кода авторизации и обработки навигации в конечную точку авторизации для платформа удостоверений Майкрософт. Этот пример можно просмотреть для получения подробной информации о его реализации.
Microsoft.Identity.Web упрощает ваш код, устанавливая правильные параметры OpenID Connect, подписываясь на событие получения кода и его активации. Для активации кода авторизации дополнительный код не требуется. Ознакомьтесь с исходным кодом Microsoft.Identity.Web, чтобы понять, как это работает.
Microsoft.Identity.Web.OWIN упрощает код, задав правильные параметры OpenID Connect, подписавшись на полученное событие и активируя код. Для активации кода авторизации дополнительный код не требуется. Ознакомьтесь с исходным кодом Microsoft.Identity.Web, чтобы понять, как это работает.
Метод handleRedirect в классе AuthProvider обрабатывает код авторизации, полученный от идентификатора Microsoft Entra. Ниже показано следующее:
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);
}
}
}
См . веб-приложение, которое выполняет вход пользователей: конфигурация кода, чтобы понять, как пример Java получает код авторизации. После того как приложение получит код, AuthFilter.java#L51-L56 выполняет следующее:
- Делегирует метод
AuthHelper.processAuthenticationCodeRedirect
в AuthHelper.java#L67-L97.
- Вызывает
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
}
}
Метод getAuthResultByAuthCode
определяется в AuthHelper.java#L176. Он создает MSAL ConfidentialClientApplication
, а затем вызывает 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();
}
См . веб-приложение, которое выполняет вход пользователей: конфигурация кода, чтобы понять, как пример Python получает код авторизации.
Экран входа Майкрософт отправляет код авторизации в URL-адрес /getAToken
, указанный в регистрации приложения. Маршрут auth_response
обрабатывает этот URL-адрес, вызывая auth.complete_login
обработку кода авторизации, а затем возвращает ошибку или перенаправляется на домашнюю страницу.
@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"))
Полный контекст этого кода см . в app.py .
Вместо секрета клиента конфиденциальное клиентское приложение также может подтвердить свое удостоверение с помощью сертификата клиента или утверждения клиента.
Использование утверждений клиента является расширенным сценарием, подробно описанным на странице Конфиденциальные утверждения клиентов.
В руководстве по ASP.NET Core используется внедрение зависимостей, позволяющее выбрать реализацию кэша маркеров в файле Startup.cs для приложения. Microsoft.Identity.Web поставляется с предварительно созданными сериализаторами кэша маркеров, описанными в сериализации кэша маркеров. Интересной возможностью является выбор кэшей распределенной памяти ASP.NET Core:
// 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";
});
Дополнительные сведения о поставщиках кэша маркеров см. также в статье о сериализации кэша маркеров Microsoft.Identity.Web и руководствах по ASP.NET core web app | Этап кэширования маркеров руководства по веб-приложениям.
В руководстве ASP.NET используется внедрение зависимостей, чтобы решить реализацию кэша маркеров в файле Startup.Auth.cs приложения. Microsoft.Identity.Web поставляется с предварительно созданными сериализаторами кэша маркеров, описанными в сериализации кэша маркеров. Интересной возможностью является выбор кэшей распределенной памяти ASP.NET Core:
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";
});
Дополнительные сведения о поставщиках кэша токенов см. также в статье о сериализации кэша токенов Microsoft.Identity.Web, а также руководствах по сериализации веб-приложений ASP.NET Core | Этап кэширования маркеров руководства по веб-приложению.
Дополнительные сведения см. в статье Сериализация кэша маркеров для MSAL.NET.
MSAL Java предоставляет методы для сериализации и десериализации кэша маркеров. Пример для Java обрабатывает сериализацию из сеанса, как показано в методе getAuthResultBySilentFlow
в AuthHelper.java#L99-L122:
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;
}
Подробные сведения о классе SessionManagementHelper
приведены в примере MSAL для Java.
В примере Node.js сеанс приложения используется для хранения кэша маркеров. Используя методы кэша узлов MSAL, кэш маркеров в сеансе считывается перед выполнением запроса маркера, а затем обновляется после успешного завершения запроса маркера. Ниже показано следующее:
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);
}
};
}
В примере Python пакет удостоверений заботится о кэше маркеров, используя глобальный session
объект для хранения.
Flask имеет встроенную поддержку сеансов, хранящихся в файле cookie, но из-за длительности файлов cookie удостоверений пример использует пакет сеансов Flask-session вместо этого. Все инициализировано в 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"],
)
Из-за параметра в app_config.py
пакете сеансов SESSION_TYPE="filesystem"
Flask хранятся сеансы с помощью локальной файловой системы.
Для рабочей среды следует использовать параметр , который сохраняется в нескольких экземплярах и развертывает приложение, например "sqlachemy" или "redis".
На этом этапе при входе пользователя маркер сохраняется в кэше маркеров. Ознакомьтесь со сведениями об использовании кэша в других частях веб-приложения.