File: TokenProviderDescriptor.cs
Web Access
Project: src\src\Identity\Extensions.Core\src\Microsoft.Extensions.Identity.Core.csproj (Microsoft.Extensions.Identity.Core)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
 
namespace Microsoft.AspNetCore.Identity;
 
/// <summary>
/// Used to represents a token provider in <see cref="TokenOptions"/>'s TokenMap.
/// </summary>
public class TokenProviderDescriptor
{
    // Provides support for multiple TUser types at once.
    // See MapIdentityApiTests.CanAddEndpointsToMultipleRouteGroupsForMultipleUsersTypes for example usage.
    private readonly Stack<Type> _providerTypes = new(1);
 
    /// <summary>
    /// Initializes a new instance of the <see cref="TokenProviderDescriptor"/> class.
    /// </summary>
    /// <param name="type">The concrete type for this token provider.</param>
    public TokenProviderDescriptor(Type type)
    {
        _providerTypes.Push(type);
    }
 
    /// <summary>
    /// The type that will be used for this token provider.
    /// </summary>
    public Type ProviderType => _providerTypes.Peek();
 
    /// <summary>
    /// If specified, the instance to be used for the token provider.
    /// </summary>
    public object? ProviderInstance { get; set; }
 
    internal void AddProviderType(Type type) => _providerTypes.Push(type);
 
    internal Type? GetProviderType<T>()
    {
        foreach (var providerType in _providerTypes)
        {
            if (typeof(T).IsAssignableFrom(providerType))
            {
                return providerType;
            }
        }
        return null;
    }
}