ASP.NET Core 2.0 middleware personalizado con autenticación de cookies

Necesito implementar una "autenticación" personalizada para mi empresa. Lo digo entre comillas porque el usuario técnicamente se autentica antes de que llegue a la aplicación y, de ser así, el ID de usuario existirá en los encabezados de solicitud.

Lo que necesito hacer es encontrar una forma de consultar la base de datos y obtener información adicional del usuario basada en ese Id, y establecer el objeto HttpContext.User para que pueda usarse fácilmente dentro de la aplicación.

La ruta que estoy tomando ahora implica el uso de la autenticación de cookies sin la identidad principal de ASP.NET. Combiné esa idea con un middleware personalizado que consultará la base de datos para el usuario, completará Reclamaciones desde los campos db y usará el contexto. SignInAsync para crear la cookie. Coloco este middleware antes de la aplicación. UseAuthentication (). El problema está en la primera solicitud, el objeto .User no está configurado, porque parece que el método SignIn solo crea la cookie pero no establece el objeto .User. El middleware de autenticación aún no ve la cookie porque no existe en la primera solicitud.

¿Alguien podría aportar alguna idea? Tal vez lo estoy haciendo mal, o esta técnica está bien, pero me falta lo que necesito para que funcione.

en Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();


        services.AddAuthentication("MyAuthenticationCookie")
           .AddCookie("MyAuthenticationCookie");
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMyUserMiddleware();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Middleware personalizado:

    public class MyUserMiddleware
{
    private readonly RequestDelegate _next;

    public MyUserMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        // Sign in user if this auth cookie doesn't exist
        if (context.Request.Cookies[".AspNetCore.MyAuthenticationCookie"] == null)
        {
            // Get user from db - not done

            // Set claims from user object - put in dummy test name for now
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, "TEST"),

            };

            var claimsIdentity = new ClaimsIdentity(claims, "MyAuthenticationCookie");

            context.SignInAsync("MyAuthenticationCookie", new ClaimsPrincipal(claimsIdentity));
        }

        return this._next(context);
    }
}

public static class MyUserMiddlewareExtensions
{
    public static IApplicationBuilder UseMyUserMiddleware(
        this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<MyUserMiddleware>();
    }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta