using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; namespace LCU.Api.Internal.FTP.Security { public static class AzureAdServiceCollectionExtensions { public static AuthenticationBuilder AddAzureAdBearer(this AuthenticationBuilder builder) => builder.AddAzureAdBearer(_ => { }); public static AuthenticationBuilder AddAzureAdBearer(this AuthenticationBuilder builder, Action configureOptions) { builder.Services.Configure(configureOptions); builder.Services.AddSingleton, ConfigureAzureOptions>(); builder.AddJwtBearer(); return builder; } private class ConfigureAzureOptions : IConfigureNamedOptions { private readonly AzureActiveDirectoryOptions _azureOptions; public ConfigureAzureOptions(IOptions azureOptions) { _azureOptions = azureOptions.Value; } public void Configure(string name, JwtBearerOptions options) { options.Audience = _azureOptions.ClientId; options.Authority = $"{_azureOptions.Instance}{_azureOptions.TenantId}"; options.TokenValidationParameters = new TokenValidationParameters { ValidAudience = _azureOptions.ValidAudience }; } public void Configure(JwtBearerOptions options) { Configure(Options.DefaultName, options); } } } }