Quick actions

cmd+k|ctrl+k

Navigation

Languages

Fake Authentication

Snippet info

Language

Csharp

Visibility

public

Author

nojan1989

Created

2020-01-30T10:41:31Z

Updated

2020-01-30T10:41:31Z

using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using leetcoin_api;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class FakeAuthenticationExtensions
    {
        public static AuthenticationBuilder AddFakeAuthentication(this AuthenticationBuilder builder)
            => builder.AddFakeAuthentication(FakeAuthenticationDefaults.AuthenticationScheme, _ => { });

        public static AuthenticationBuilder AddFakeAuthentication(this AuthenticationBuilder builder, Action<FakeAuthenticationOptions> configureOptions)
            => builder.AddFakeAuthentication(FakeAuthenticationDefaults.AuthenticationScheme, configureOptions);

        public static AuthenticationBuilder AddFakeAuthentication(this AuthenticationBuilder builder, string authenticationScheme, Action<FakeAuthenticationOptions> configureOptions)
            => builder.AddFakeAuthentication(authenticationScheme, displayName: null, configureOptions: configureOptions);

        public static AuthenticationBuilder AddFakeAuthentication(this AuthenticationBuilder builder, string authenticationScheme, string displayName, Action<FakeAuthenticationOptions> configureOptions)
        {
            builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<FakeAuthenticationOptions>, FakeAuthenticationPostConfigureOptions>());
            return builder.AddScheme<FakeAuthenticationOptions, FakeAuthenticationHandler>(authenticationScheme, displayName, configureOptions);
        }
    }
}

namespace leetcoin_api
{
    public static class FakeAuthenticationDefaults
    {
        public const string AuthenticationScheme = "FakeAUTH";
    }

    public class FakeAuthenticationOptions : AuthenticationSchemeOptions
    {
        public IEnumerable<Claim> Claims { get; set; }
    }

    public class FakeAuthenticationPostConfigureOptions : IPostConfigureOptions<FakeAuthenticationOptions>
    {
        public void PostConfigure(string name, FakeAuthenticationOptions options)
        {
            //
        }
    }

    public class FakeAuthenticationValidatedContext : ResultContext<FakeAuthenticationOptions>
    {
        public FakeAuthenticationValidatedContext(HttpContext context, AuthenticationScheme scheme, FakeAuthenticationOptions options) 
            : base(context, scheme, options)
        {
        }
    }

    public class FakeAuthenticationHandler : AuthenticationHandler<FakeAuthenticationOptions>
    {
        public FakeAuthenticationHandler(IOptionsMonitor<FakeAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
            : base(options, logger, encoder, clock)
        {
        }

        protected override Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            var claims = Options.Claims ??
                new Claim[] {
                    new Claim("name", "Fake user")
                };

            var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity[]{
                new ClaimsIdentity(claims, FakeAuthenticationDefaults.AuthenticationScheme)
            });

            var properties = new AuthenticationProperties() {
                ExpiresUtc = DateTime.Now.AddYears(1)
            };

            var authenticationTicket = new AuthenticationTicket(claimsPrincipal, properties, FakeAuthenticationDefaults.AuthenticationScheme);

            var context = new FakeAuthenticationValidatedContext(Context, Scheme, Options);
            context.Principal = claimsPrincipal;
            context.Success();

            return Task.FromResult(context.Result);
        }
    }
}
INFO