Passing arguments to Middleware class

Viewed 39

I have a piece of middleware I'm trying to build that will check if a user has a particular key and if they can receive a authentication token and if so impersonate a windows user. That particular portion we were able to get to run. However I'm having trouble passing IConfiguration to said middleware. Whenever I run the application I get the following error:

A suitable constructor for type LocalDevelopmentImpersonation.LocalDevelopmentImpersonation' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.

namespace LocalDevelopmentImpersonation
{
    public sealed class LocalDevelopmentImpersonation : IMiddleware
    {
        private readonly RequestDelegate _Next;
        private readonly SafeAccessTokenHandle _SafeAccessTokenHandle;
        private readonly bool _IsLocal;

        public LocalDevelopmentImpersonation(RequestDelegate next, IConfiguration configuration)
        {
            this._SafeAccessTokenHandle = LocalDevelopmentImpersonationSetup.GetSafeAccessTokenHandle(out var receivedSafeAccessTokenSuccessfully);
            this._Next = next;
            this._IsLocal = LocalDevelopmentImpersonationSetup.IsLocal(receivedSafeAccessTokenSuccessfully, configuration);
        }
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            if (this._IsLocal)
        {
            await WindowsIdentity.RunImpersonated(this._SafeAccessTokenHandle, async () =>
            {
                await this._Next.Invoke(context);
            });
        }
        await this._Next.Invoke(context);
    }
}

Methods to use in Program.cs on the instance we created of WebApplication.

namespace LocalDevelopmentImpersonation.ExtensionMethods
{
    public static class LocalDevelopmentImpersonationExtensions
    {
        public static IApplicationBuilder UseLocalDevelopmentImpersonation(this IApplicationBuilder app)
        {
            return app.UseMiddleware<LocalDevelopmentImpersonation>();
        }

        public static IApplicationBuilder UseLocalDevelopmentImpersonation(this IApplicationBuilder app, IConfiguration configuration)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            return app.UseMiddleware<LocalDevelopmentImpersonation>(Options.Create(configuration));
        }
    }
}

Calling instance

var app = builder.Build();
app.UseLocalDevelopmentImpersonation(configuration); //Instance of ConfigurationManager that implements IConfiguration
1 Answers

It isn't possible to pass objects to the factory-activated middleware with UseMiddleware,If you do want to pass argumentss to your middleware,try with Middleware activated by convention.

You could check the doc for more details

Related