Кэширующий эмитент и ключи от конечной точки метаданных - PullRequest
0 голосов
/ 05 июля 2018

Я следовал примеру вызова веб-API ASP.NET из веб-приложения ASP.NET с помощью Azure AD B2C: https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi

У меня есть вопрос относительно OpenIdConnectCachingSecurityTokenProvider

// This class is necessary because the OAuthBearer Middleware does not leverage
// the OpenID Connect metadata endpoint exposed by the STS by default.
public class OpenIdConnectCachingSecurityTokenProvider : IIssuerSecurityKeyProvider
{
    public ConfigurationManager<OpenIdConnectConfiguration> _configManager;
    private string _issuer;
    private IEnumerable<SecurityKey> _keys;
    private readonly string _metadataEndpoint;

    private readonly ReaderWriterLockSlim _synclock = new ReaderWriterLockSlim();

    public OpenIdConnectCachingSecurityTokenProvider(string metadataEndpoint)
    {
        _metadataEndpoint = metadataEndpoint;
        _configManager = new ConfigurationManager<OpenIdConnectConfiguration>(metadataEndpoint, new OpenIdConnectConfigurationRetriever());

        RetrieveMetadata();
    }

    /// <summary>
    /// Gets the issuer the credentials are for.
    /// </summary>
    /// <value>
    /// The issuer the credentials are for.
    /// </value>
    public string Issuer
    {
        get
        {
            RetrieveMetadata();
            _synclock.EnterReadLock();
            try
            {
                return _issuer;
            }
            finally
            {
                _synclock.ExitReadLock();
            }
        }
    }

    /// <summary>
    /// Gets all known security keys.
    /// </summary>
    /// <value>
    /// All known security keys.
    /// </value>
    public IEnumerable<SecurityKey> SecurityKeys
    {
        get
        {
            RetrieveMetadata();
            _synclock.EnterReadLock();
            try
            {
                return _keys;
            }
            finally
            {
                _synclock.ExitReadLock();
            }
        }
    }

    private void RetrieveMetadata()
    {
        _synclock.EnterWriteLock();
        try
        {
            OpenIdConnectConfiguration config = Task.Run(_configManager.GetConfigurationAsync).Result;
            _issuer = config.Issuer;
            _keys = config.SigningKeys;
        }
        finally
        {
            _synclock.ExitWriteLock();
        }
    }
}

Конечная точка метаданных:

https://login.microsoftonline.com/{TENANT}.onmicrosoft.com/v2.0/.well-known/openid-configuration?p={POLICY}

Почему все время нужно звонить, чтобы получить ключи и эмитента?

Можно ли кешировать эти значения? Если да, каковы лучшие настройки для истечения срока действия?

1 Ответ

0 голосов
/ 05 июля 2018

Почему все время нам нужно позвонить, чтобы получить ключи и Эмитент

  • Ключ подписи: Ваше приложение должно использовать этот ключ подписи (открытый ключ) для проверки токена, который подписан AAD с использованием его закрытого ключа. Эта конечная точка метаданных содержит всю информацию открытого ключа, используемую в данный момент:

    https://login.microsoftonline.com/<yourtenantdomain>/discovery/v2.0/keys?p=<SigninPolicyName>

  • Эмитент: Вашему приложению необходим Эмитент для проверки утверждения токена iss, чтобы доверять этому токену. Эмитент также можно получить из конечной точки метаданных подключения OpenID:

    https://login.microsoftonline.com/<YourTenantDomain>/v2.0/.well-known/openid-configuration?p=<SigninPolicyName>

Идентифицирует службу токенов безопасности (STS), которая создает и возвращает токен В токенах, которые возвращает Azure AD, эмитент sts.windows.net. GUID в значении претензии эмитента является идентификатором клиента каталога Azure AD. Арендатор ID является неизменным и надежным идентификатор каталога.

Кроме того, OAuthBearer Middleware не использует эту конечную точку метаданных по умолчанию, поэтому вам нужно получить ее с помощью кода. Итак, вы должны получить ключи и эмитента для проверки токена.

Можно ли кешировать эти значения? Если да, то какие настройки лучше всего подходят для истечение

Да, с кодом, который вы публикуете, он кэширует эти значения в configManager.GetConfigurationAsync и OpenIdConnectCachingSecurityTokenProvider использует его при запуске.

Об истечении срока действия: подписывающий ключ может перевернуться. Так что не беспокойтесь об истечении установленного срока для поющего ключа. Важно то, что вам лучше извлекать местоположение метаданных динамически, чтобы ключ подписи был правильным.

Справка:

Подробную информацию о проверке подписи токенов B2C можно найти в этом документе .

Подробнее о подписании нажатия клавиш в AAD см. В этой документации .

Подробнее о метаданных поставщика OpendID: http://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata

...