| File: AuthorizationPolicyCache.cs | Web Access |
| Project: src\aspnetcore\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(); } }