你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何缓存身份验证令牌

本文演示如何缓存身份验证令牌以提高应用程序的性能。

使用 ASP.NET

导入 Microsoft.Identity.Client NuGet 包,该包用于获取令牌。 有关详细信息,请参阅安装标识客户端 NuGet 包

创建机密客户端应用程序属性。

private IConfidentialClientApplication _confidentialClientApplication;
private IConfidentialClientApplication ConfidentialClientApplication
{
    get {
        if (_confidentialClientApplication == null) {
            _confidentialClientApplication = ConfidentialClientApplicationBuilder.Create(ClientId)
            .WithClientSecret(ClientSecret)
            .WithAuthority($"https://login.windows.net/{TenantId}")
            .Build();
        }

        return _confidentialClientApplication;
    }
}

接下来,使用以下代码获取 AuthenticationResult,并使用在创建沉浸式阅读器资源时获取的身份验证值。

重要

已弃用 Microsoft.IdentityModel.Clients.ActiveDirectory NuGet 包和 Azure AD 身份验证库 (ADAL)。 自 2020 年 6 月 30 以来,未添加任何新功能。 强烈建议进行升级。 若要了解详细信息,请参阅迁移指南

public async Task<string> GetTokenAsync()
{
    const string resource = "https://cognitiveservices.azure.com/";

    var authResult = await ConfidentialClientApplication.AcquireTokenForClient(
        new[] { $"{resource}/.default" })
        .ExecuteAsync()
        .ConfigureAwait(false);

    return authResult.AccessToken;
}

AuthenticationResult 对象具有 AccessToken 属性,该属性是你在通过 SDK 启动沉浸式阅读器时使用的实际令牌。 它还具有 ExpiresOn 属性,该属性表示令牌的过期时间。 在启动沉浸式阅读器之前,可以检查令牌是否已过期,仅在令牌过期后获取新令牌。

使用 Node.JS

request npm 包添加到项目。 使用以下代码获取令牌,并使用在创建沉浸式阅读器资源时获取的身份验证值。

router.get('/token', function(req, res) {
    request.post(
        {
            headers: { 'content-type': 'application/x-www-form-urlencoded' },
            url: `https://login.windows.net/${TENANT_ID}/oauth2/token`,
            form: {
                grant_type: 'client_credentials',
                client_id: CLIENT_ID,
                client_secret: CLIENT_SECRET,
                resource: 'https://cognitiveservices.azure.com/'
            }
        },
        function(err, resp, json) {
            const result = JSON.parse(json);
            return res.send({
                access_token: result.access_token,
                expires_on: result.expires_on
            });
        }
    );
});

expires_on 属性是令牌过期的日期和时间,表示为自 1970 年 1 月 1 日 UTC 起的秒数。 请使用此值来确定令牌是否已过期,过期后再尝试获取新令牌。

async function getToken() {
    if (Date.now() / 1000 > CREDENTIALS.expires_on) {
        CREDENTIALS = await refreshCredentials();
    }
    return CREDENTIALS.access_token;
}

下一步