DeviceBridge/Common/Authentication/TokenAuthenticationHandler.cs (50 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Security.Claims; using System.Text.Encodings.Web; using System.Threading.Tasks; using DeviceBridge.Providers; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NLog; namespace DeviceBridge.Common.Authentication { public class TokenAuthenticationHandler : AuthenticationHandler<TokenAuthenticationOptions> { private ISecretsProvider secretsProvider; private Logger logger; public TokenAuthenticationHandler(IOptionsMonitor<TokenAuthenticationOptions> options, ILoggerFactory loggerFactory, NLog.Logger logger, UrlEncoder encoder, ISystemClock clock, IServiceProvider serviceProvider, ISecretsProvider secretsProvider) : base(options, loggerFactory, encoder, clock) { ServiceProvider = serviceProvider; this.secretsProvider = secretsProvider; this.logger = logger; } public IServiceProvider ServiceProvider { get; set; } protected async override Task<AuthenticateResult> HandleAuthenticateAsync() { var tmpLogger = this.logger.WithProperty("cv", Utils.GuidFromString(Request.HttpContext.TraceIdentifier)); tmpLogger.Info("Starting api key authentication."); var masterApiKey = await this.secretsProvider.GetApiKey(this.logger); var headers = Request.Headers; var apiKey = headers["x-api-key"]; if (string.IsNullOrEmpty(apiKey)) { tmpLogger.Info("Api key is null"); return AuthenticateResult.Fail("Api key is null"); } bool isValidToken = masterApiKey.Equals(apiKey); // check token here if (!isValidToken) { tmpLogger.Info($"Apikey authentication failed."); return AuthenticateResult.Fail($"Apikey authentication failed."); } var claims = new[] { new Claim("apiKey", apiKey) }; var identity = new ClaimsIdentity(claims, nameof(TokenAuthenticationHandler)); var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), this.Scheme.Name); tmpLogger.Info("Successfully authenticated using api key."); return AuthenticateResult.Success(ticket); } } }