共用方式為


建置可復原 Microsoft Entra ID OpenID Connect 中繼資料重新整理的服務

受保護的 Web API 需要驗證存取權杖。 Web 應用程式也會驗證識別碼權杖。 權杖驗證具有多個部分,檢查權杖是否屬於應用程式、是否由受信任的識別提供者 (IDP) 發出、具有的存留期仍在範圍內且未遭篡改。 也可以進行特殊驗證。 例如,應用程式必須驗證簽章和簽署金鑰 (內嵌在權杖中時) 受信任且權杖未重新執行。 簽署金鑰未內嵌於權杖時,必須從身分識別提供者 (探索或中繼資料) 加以提取。 有時也需要在執行階段動態取得金鑰。

Web 應用程式和 Web API 必須重新整理過時的 OpenID Connect 中繼資料,其才能具復原性。 本文可協助引導您了解如何達成具復原性的應用程式。 這適用於 ASP.NET Core、ASP.NET 和 Microsoft.IdentityModel。

ASP.NET Core

使用最新版本的 Microsoft.IdentityModel.*,並手動遵循下列指導。

在 Startup.cs 的 ConfigureServices 方法中,確定已將 JwtBearerOptions.RefreshOnIssuerKeyNotFound 設定為 true,且您使用的是最新的 Microsoft.IdentityModel.* 程式庫。 此屬性應該預設為啟用。

services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
    …
    // shouldn’t be necessary as it’s true by default
    options.RefreshOnIssuerKeyNotFound = true;
    …
});

ASP.NET/ OWIN

Microsoft 建議您移至 ASP.NET Core,因為 ASP.NET 上的開發已停止。

如果您使用的是 ASP.NET (傳統版),請使用最新的 Microsoft.IdentityModel.*

OWIN 對 OpenIdConnectConfiguration 具有自動的 24 小時重新整理間隔。 只有在收到要求超過 24 小時的時間範圍之後時,才會觸發此重新整理。 我們知道,除了重新啟動應用程式之外,沒有任何方法可以變更此值或是提早觸發重新整理。

Microsoft.IdentityModel

如果您自行驗證權杖,例如在 Azure Functions 中,請使用最新版本的 Microsoft.IdentityModel.*,並遵循下列程式碼片段所示的中繼資料指導。

var configManager =
  new ConfigurationManager<OpenIdConnectConfiguration>(
    "http://someaddress.com",
    new OpenIdConnectConfigurationRetriever());

var config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
var validationParameters = new TokenValidationParameters()
{
  …
  IssuerSigningKeys = config.SigningKeys;
  …
}

var tokenHandler = new JsonWebTokenHandler();
result = Handler.ValidateToken(jwtToken, validationParameters);
if (result.Exception != null && result.Exception is SecurityTokenSignatureKeyNotFoundException)
{
  configManager.RequestRefresh();
  config = await configManager.GetConfigurationAsync().ConfigureAwait(false);
  validationParameters = new TokenValidationParameters()
  {
    …
    IssuerSigningKeys = config.SigningKeys,
    …
  };

  // attempt to validate token again after refresh
  result = Handler.ValidateToken(jwtToken, validationParameters);
}

下一步

若要深入了解,請參閱受保護 Web API 中的權杖驗證