我们正在构建大约10个ASP.NET MVC站点,这些站点具有一组共同的功能(以及相应的URL,路由,控制器,操作和视图).这些站点还将共享一组域对象(例如用户,公司)和这些对象的基本属性(例如名称,地址等).
但每个站点也将高度定制并从基础扩展.例如,我们针对大型上市公司的网站将在公司域对象上具有"子公司"和"股票代码"字段,而我们的初创公司网站将具有"风险公司"和"资金"属性.虽然我们试图尽可能保持HTML的一致性(为额外的域对象属性建模额外的表单字段等),但外观也会有很大差异.我们也会谨慎地覆盖图像,因此我们可以在网站上重复使用相同的按钮图形.
无论如何,我们正试图弄清楚如何最好地分解和构建事物,以便我们可以重用尽可能多的代码和尽可能多的测试,而不会限制我们添加每个应用程序属性的自由,并改变应用程序之间的UI.
我熟悉如何处理有限的自定义多租户,就像你在StackOverflow/SuperUser/ServerFault(或MSDN/TechNet)中找到的那样,UI有点不同,数据模型或多或少相同.但是当模型和UI非常不同(但是从一个共同的基础继承)时,我不太清楚如何继续.
我不太担心操作问题,因为我们可能会在一个单独的appdomain中运行每个站点并将它们托管在不同的数据库中.我更担心的是降低长期代码维护成本,提高灵活性(例如,在不破坏衍生应用程序的情况下轻松添加新功能到基础),以及在构建第2版时实现短期开发/测试成本节省,第3,第4等网站.
我正在寻找高级指导和建议,但也有关于如何使用现代ASP.NET MVC实践来实现该指导的具体建议.
我意识到这是一个非常普遍的问题,但对于初学者,我正在寻找高级指导以及如何在ASP.NET MVC中应用该指导的具体技巧和技巧,包括:
对于如何构建这样的多租户应用程序,任何人都有很好的建议吗?
我正在构建一个多租户ASP .NET应用程序.鉴于每个租户可以动态配置他们的应用程序(可能涉及将动态自定义程序集加载到内存中),我需要一种隔离每个租户的方法.
出于维护原因,我不希望为每个租户创建一个新的Web应用程序.
我一直在考虑使用AppDomainManager为每个应用程序创建一个AppDomain,但似乎并不打算用于ASP .NET应用程序.
有没有人对这个问题有一些建议?
谢谢.
我正在构建一个用于在Heroku上部署的Rails 3应用程序,我想知道是否有关于如何在我的模型中处理多租户的任何建议.半年前,有一个相关的问题(#3776593)发布在这里,但没有得到很多答案.我还看过Guy Naor关于使用Rails编写多租户应用程序的演讲,但似乎3个提议的解决方案中有2个不适用于Heroku.我将链接到这些,但新的Stackoverflow用户限于2个超链接.
我还遇到了以下工具:
只是想知道你是否有多租户宝石或简单轨道多租户宝石的经验.似乎最直接的解决方案就是简单地将belongs_to放在我需要在账户下的所有模型上,但我真的很想知道你在现实世界中使用了什么!
我一直在逐步完成Orchard CMS的源代码,以了解他们如何解决多租户问题.
有人可以指出我应该查看的文件或区域,以了解管道如何适用于Orchard的多租户?
作为一个测试项目,我希望能够在ASP.Net MVC应用程序中编写类似的裸骨代码来演示多租户.
我看过的地方:
我正在组建一个小团队,设计一个流程管理系统,供同一行业内的几个不同客户使用.系统的目标和客户的高级要求非常相似.然而,正如预期的那样 - 一旦我们开始深入挖掘他们的个人需求,我们最终需要为每个客户提供一些非常广泛的定制,包括数据,输入表格,验证,工作流程,报告等.
加上所有这些,我们意识到多租户架构可能是实现这一目标的最佳方法.后端远远超出设计范围,是使用ServiceStack,RavenDB和Sql Server构建的.net中的RESTful api.任何熟悉ServiceStack的人都会知道它非常灵活,并且在构建时考虑了可插拔性 - 这使得实现多租户REST api比我们预期的要容易得多.我们使用一个非常简单的约定来通过检查属于每个请求的会话中的值来识别和授权租户(所有"特定于租户的"请求必须经过身份验证,因此始终有可用的会话).因此,目前很少或根本不需要在任何路由URL中跟踪或传递来自客户端的租户ID.因此,对于后端api,我们的设计目标是拥有一个代码库,支持不同的客户,具有大量的代码重用和灵活性,可根据需要自定义/扩展租户特定的功能.
所以后端大部分都是平方的,我们把注意力转移到前端,我们真的很难在AngularJS中实现类似的多租户方法.部分问题在于我们对角度相对较新.我们有一些使用标准"文件夹模式"构建单用途应用程序的经验,但是当我们在这里查看我们的多租户要求时,我们真的很难将所有内容联系在一起(一般项目结构/路由/视图)以支持相同的多我们通过后端实现的AngularJS中的设计目标(支持重用,灵活性和定制的单一代码库).该模块模式似乎是一个很好的选择每个租户的定制功能,但我们仍然缺少大的事情是一个整体的架构方法,为我们提供一个单一的AngularJS代码库支持上述目标,"插上".任何AngularJS专业人士都可以帮助我们超越驼峰并在这里推荐一种方法吗?
谢谢!
我正在尝试使用Laravel 5进行构建和应用.它应该是一个使用多个数据库的多租户数据库架构.我的雇主出于安全目的要求这样做.
我尝试过手动管理主数据库迁移和租户迁移但是失败了.所以我决定接受Laravel特定包的帮助,这应该是我所需要的.
Tenanti提供了一种方法来解决我的目的,但问题是我是一名新手开发人员,我无法完全理解如何在我的应用程序中使用它.
我已正确安装它我相信:
composer require "orchestra/tenanti=~3.0"
Run Code Online (Sandbox Code Playgroud)
在配置应用程序文件中添加这些提供程序和别名:
'providers' => [
// ...
Orchestra\Tenanti\TenantiServiceProvider::class,
Orchestra\Tenanti\CommandServiceProvider::class,
],
'aliases' => [
'Tenanti' => Orchestra\Support\Facades\Tenanti::class,
],
Run Code Online (Sandbox Code Playgroud)
最后发布配置并根据多个数据库的文档进行调整:
php artisan vendor:publish
Run Code Online (Sandbox Code Playgroud)
return [
'drivers' => [
'user' => [
'model' => App\User::class,
'migration' => 'tenant_migrations',
'path' => database_path('tenanti/user'),
],
],
];
Run Code Online (Sandbox Code Playgroud)
在这一点上,我仍然模糊下一步做什么?
我的怀疑如下:
我尝试运行一些附带的工匠命令,如:
php artisan tenanti:install {driver}
php artisan tenanti:make {driver} {name}
Run Code Online (Sandbox Code Playgroud)
但我收到的错误是这样的:
[InvalidArgumentException]数据库连接[租户]不可用.
我在哪里可以找到资源来了解如何进行此操作?
我正在尝试使用DynamoDB和Cognito创建一个多租户应用程序.文档非常清楚如何实现细粒度授权,以便用户只能通过向IAM访问策略添加条件来访问自己的记录,如下所示:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
Run Code Online (Sandbox Code Playgroud)
当Cognito用户id是行的哈希键时,这非常适合允许用户读写自己的记录,但我正在努力解决如何允许其他用户只读访问某些记录的问题.
以一个有多个课程的学生的模型为例:
{
“student_id”: “ABC-1234567”,
“course_name”: “Statistics 101”,
“tutors”: [“Cognito-sub-1”, “Cognito-sub-2”],
“seminar_reviews”: [
{
“seminar_id”: “XXXYYY-12345”
“date”: “2018-01-12”,
“score”: “8”,
“comments”: “Nice class!”
},
{
“seminar_id”: “ABCDEF-98765”
“date”: “2018-01-25”,
“score”: “3”,
“comments”: “Boring.”
}
]
}
Run Code Online (Sandbox Code Playgroud)
(Cognito-sub-1
是导师的Cognito id)
通过将上述策略条件应用于用户的IAM角色,用户可以读取和写入此文档,因为散列键(student_id
)是用户的Cognito id.
我也希望文档中列出的导师具有对某些属性的只读访问权限,但我找不到任何如何完成此操作的示例.我知道我不能使用dynamodb:LeadingKeys
条件因为教师不是表的哈希键.如果我设置使用导师列表作为哈希键的全局二级索引(GSI),是否可以这样做?
如果可以使用索引完成此操作,我认为这只允许对该索引的读访问(因为索引不允许写操作).是否有任何替代方法允许基于非散列键的属性进行写访问?
或者,我可以使用更长的字符串作为散列键,连接类似的属性”owner”:
以及”read-only”:
包含Cognito ID列表的属性,并在我的策略中使用它来创建仅基于散列键的更细粒度的权限模型吗?这假定策略可以解码字符串中的列表,因为DynamoDB不允许散列键是列表,JSON对象或类似物.
我无法找到任何考虑细粒度访问控制的资源,除了允许用户只读取/写入自己的记录,所以如果有人可以指导我,那将是一个很好的开始.
multi-tenant amazon-web-services amazon-dynamodb amazon-cognito aws-iam
目前,我已经创建了一个 Identity server 4 Web 应用程序,其中包含具有默认客户端 ID 和机密的外部登录提供程序。但我的目标是基于租户注册 Azure、Google、Facebook 等身份验证提供程序。
我使用了SaasKit多租户程序集,在这里我尝试了app.usepertenant()中间件。但是UseGoogleAuthentication()方法已经过时了,所以我无法使用这个 usepertenant 中间件实现多租户身份验证。
当前代码,
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddMicrosoftAccount(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
Run Code Online (Sandbox Code Playgroud)
预期的代码如下,
var authentication = services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme);
if (tenant.hasMicrosoft)
{
authentication.AddMicrosoftAccount(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
}
if (tenant.hasGoogle)
{
authentication.AddGoogle(option =>
{
option.ClientId = "clientid";
option.ClientSecret = "clientsecret";
option.SaveTokens = true;
});
}
authentication.AddCookie( options =>
{
options.SlidingExpiration = true; …
Run Code Online (Sandbox Code Playgroud) authentication multi-tenant asp.net-core identityserver4 saaskit
一点背景
多年来,我一直在使用Apartment gem来运行多租户应用程序。现在最近需要将数据库扩展到单独的主机上,数据库服务器根本无法跟上(读取和写入都变得太多) - 是的,我将硬件扩展到最大(专用硬件、64 核、raid 10 中的 12 个 Nvm-e 驱动器、384Gb ram 等)。
我正在考虑按租户执行此操作(1 个租户 = 1 个数据库连接配置/池),因为这将是一种“简单”且有效的方法,可以在number-of-tenants
不进行大量应用程序代码更改的情况下获得更多的容量。
现在,我正在运行 rails 4.2 atm.,很快升级到 5.2。我可以看到 rails 6 添加了对每个模型连接定义的支持,但这并不是我真正需要的,因为我为我的 20 个租户中的每个租户都有一个完全镜像的数据库模式。通常我会根据请求(在中间件中)或每个后台作业(sidekiq 中间件)切换“数据库”,但是目前这很简单,并且可以在 Apartment gem 中处理,因为它只是search_path
在 Postgresql 中设置了并且并没有真正改变实际连接。当切换到每租户托管策略时,我需要根据请求切换整个连接。
问题:
ActiveRecord::Base.establish_connection(config)
每个请求/后台工作 - 但是,正如我所理解的,这会触发一个全新的数据库连接握手,并在 Rails 中生成一个新的数据库池 - 对吗?我想这将是性能自杀,在对我的应用程序的每个请求上都产生这种开销。然而另一个多租户帖子我很害怕.我只是找不到解决问题的好方法,我已经阅读了ASP MVC多租户的所有好帖子,但我还是需要一些好的建议.
我将为我的一位客户创建一个企业形象.他们的公司结构就像一家主要公司(例如Acme集团有限公司),该公司拥有其他几家公司(例如Acme Holding Ltd,Acme Technology Ltd.,Acme Maritime Ltd.等).
我想使用一个ASP MVC项目作为所有站点的容器,以减少所需的代码并保持干燥.我还希望所有站点都使用相同的Membership DB.
我的第一个想法是为每个子公司制作一个控制器文件夹,为公司主页制作一个根控制器.然后它看起来像:
acme.com("公司主页")
acme.com/Holding("Acme Holding Ltd.")
acme.com/Maritme("Acme Maritme Ltd.")
...
这个结构对我很好,但我也希望网站的用户可以根据他们自己的独立域访问每个子站点,例如:
holding.acme.com(这应该指向"acme.com/Holding").
...
这当然也有效,但问题是我不希望在用户被定向到"acme.com/Holding"时更改URL.我希望它仍然是"holding.acme.com","holding.acme.com/About","holding.acme.com/Contact"等,而不是"acme.com/Holding/Contact"等.
什么是在这个特定项目中使用的最佳实践,任何想法?
multi-tenant ×10
asp.net ×2
asp.net-mvc ×2
c# ×2
.net ×1
angularjs ×1
appdomain ×1
architecture ×1
asp.net-core ×1
aws-iam ×1
dry ×1
gem ×1
heroku ×1
inheritance ×1
laravel ×1
laravel-5 ×1
model ×1
mysql ×1
php ×1
postgresql ×1
ruby ×1
saaskit ×1