【发布时间】:2017-02-21 11:13:09
【问题描述】:
当我的应用程序启动时,我有一堆模块(模块 1、模块 2 ……)。对于每个模块,我都有一堆控制器操作:
/myModuleController/module1/action1
/myModuleController/module1/action2
/myModuleController/module2/action1
/myModuleController/module2/action2
…
由于用户可以在每个模块中登录一次,因此我为每个模块部署了一个身份验证中间件,这样做很简单:
app.UseWhen((context) => context.Request.Path.StartsWithSegments(urlPath), appbuilder =>
{
appbuilder.UseCookieAuthentication(new CookieAuthenticationOptions()
{
CookieName = cookieName,
…
});
});
所以基本上,在 url 路径 /myModuleController/module1 上,我有一个中间件和它的 cookie,另一个用于 /myModuleController/module2 ......我想这有点不寻常,但它工作正常,我对这种行为感到满意。
问题来了:我希望能够在运行时添加一个新模块,这意味着能够使用类似app.UseWhen(url, app. UseCookieAuthentication(…)) 的一段代码部署一个新的中间件。我天真地尝试在负责添加模块的控制器中注入IApplicationBuilder app,但我得到了一个异常:
System.InvalidOperationException:尝试激活“AdminController”时无法解析“Microsoft.AspNetCore.Builder.IApplicationBuilder”类型的服务
我的问题是:它应该工作吗?我一定是在某个地方犯了错误?或者,你清楚我在这里尝试的东西没有机会工作吗?
您将如何达到相同的要求? 谢谢。
【问题讨论】:
-
在启动代码运行后,您将无法添加新的中间件。所以你最好确定每个模块的 cookie 之间有什么不同,然后编写一个更通用的中间件来处理你的所有场景。
标签: c# authentication dependency-injection asp.net-core