繁体   English   中英

将 arguments 传递给中间件 class

[英]Passing arguments to Middleware class

我有一个我正在尝试构建的中间件,它将检查用户是否具有特定的密钥以及他们是否可以接收身份验证令牌,如果可以,则模拟 windows 用户。 我们能够运行的那个特定部分。 但是,我无法将 IConfiguration 传递给所述中间件。 每当我运行应用程序时,我都会收到以下错误:

找不到适合类型 LocalDevelopmentImpersonation.LocalDevelopmentImpersonation' 的构造函数。 确保类型是具体的,并且为公共构造函数的所有参数注册了服务。

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);
    }
}

在我们创建的 WebApplication 实例的 Program.cs 中使用的方法。

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));
        }
    }
}

调用实例

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

使用 UseMiddleware 无法将对象传递给工厂激活的中间件(并且您也不需要将 RequestDelegate 和 HttpContext 传递给构造函数),如果您确实想将参数传递给中间件,请尝试激活中间件按照惯例。

您可以查看文档以获取更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM