【发布时间】:2017-02-24 00:05:59
【问题描述】:
我正在尝试使用 ASP.Net Core v1.1.0 创建一个多租户 Web 应用程序。单个用户可能属于多个租户(即 - 监督多个商店的区域经理。)用户还应该能够访问该站点并查看一些基本的营销视图,而无需登录或访问任何租户,但是功能会受到很大限制。
在结构上,到目前为止,我的项目与默认的 ASP.Net Core MVC 模板相比没有太大的发展......
在Startup.cs 中,我将路由定义如下,以尝试使用子域来定义用户尝试登录的商店。 “DEMO”表示用户只能看到营销视图:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{tenant=DEMO}/{controller=Home}/{action=Index}/{id?}");
});
既然我已经这样做了,变量tenant 可以神奇地用于像这样的控制器动作定义中,而且效果很好:
public IActionResult Contact(string tenant)
{
ViewData["Message"] = "Your contact page for " + tenant + ".";
return View();
}
但我使用_Layout.cshtml 作为包含大部分网站导航和一些个性化元素的包装器,并且我想做一些事情,例如禁用 DEMO 租户的大部分导航并为所有人显示特定于商店的徽标其他租户。由于据我所知没有与_Layout.cshtml 关联的控制器,因此我需要一种不同的方式来注入此字符串。我尝试将以下行添加到_ViewImports.cshtml:
@inject System.String tenant
我得到错误InvalidOperationException: No service for type 'System.String' has been registered. 这让我相信我需要在Startup.cs 中的ConfigureServices 方法中添加一些东西,但我不知道我在做什么并且无法在线查找任何类似的代码示例。我正在想象这样的事情:
services.AddScoped<ITenantFactory, MySeeminglyUnnecessaryFactory>();
但即便如此,我也不知道如何将tenant 路由参数传递给工厂,或者如何实现它。如果我能找到一个传递字符串的固定方法,我相信我可以使用它来做我需要做的事情,只要改变布局的外观和感觉,我觉得限制用户访问很舒服在控制器级别。提前感谢您的任何建议或想法!
【问题讨论】:
-
仅供参考 - 一个名叫 Ben Foster 的人正在发布一些关于 ASP.NET Core 中的多租户的精彩博客文章。我发现这些非常有用。你可以在这里找到它们:benfoster.io/blog/tagged/multi-tenancy
-
好电话!实际上,我在研究这个时发现了他的博客,并且我查看了他推荐的 SaasKit。我可能会尝试一下,尽管除了租户之外我还需要考虑许多特定于用户的权限,所以我现在倾向于自定义解决方案。
标签: c# asp.net-mvc razor asp.net-core asp.net-core-mvc