File: AuthorizationPolicyCache.cs
Web Access
Project: src\src\Security\Authorization\Policy\src\Microsoft.AspNetCore.Authorization.Policy.csproj (Microsoft.AspNetCore.Authorization.Policy)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Concurrent;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
 
namespace Microsoft.AspNetCore.Authorization.Policy;
 
internal sealed class AuthorizationPolicyCache : IDisposable
{
    // Caches AuthorizationPolicy instances
    private readonly DataSourceDependentCache<ConcurrentDictionary<Endpoint, AuthorizationPolicy>> _policyCache;
 
    public AuthorizationPolicyCache(EndpointDataSource dataSource)
    {
        // We cache AuthorizationPolicy instances per-Endpoint for performance, but we want to wipe out
        // that cache if the endpoints change so that we don't allow unbounded memory growth.
        _policyCache = new DataSourceDependentCache<ConcurrentDictionary<Endpoint, AuthorizationPolicy>>(dataSource, (_) =>
        {
            // We don't eagerly fill this cache because there's no real reason to.
            return new ConcurrentDictionary<Endpoint, AuthorizationPolicy>();
        });
        _policyCache.EnsureInitialized();
    }
 
    public AuthorizationPolicy? Lookup(Endpoint endpoint)
    {
        _policyCache.Value!.TryGetValue(endpoint, out var policy);
        return policy;
    }
 
    public void Store(Endpoint endpoint, AuthorizationPolicy policy)
    {
        _policyCache.Value![endpoint] = policy;
    }
 
    public void Dispose()
    {
        _policyCache.Dispose();
    }
}