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);
}
}
}
public class Startup {
public void ConfigureServices(IServiceCollection services)
{
//// Snip
services.AddAuthentication(FakeAuthenticationDefaults.AuthenticationScheme)
.AddFakeAuthentication(x => {
x.Claims = new System.Security.Claims.Claim[] {
new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, "User 1"),
new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "Admin"),
new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Email, "derp@derp.se"),
new System.Security.Claims.Claim(JwtOptions.TraderIdClaimName, "ae1c1c9e-0ef3-4663-b0f6-9fbff1d46089")
};
});
}
}