用Code first EF 6和ASP.Net MVC 4为多租户建立多数据库
我正在构建SaaS应用程序,并计划每个客户端一个数据库.我使用ASP.NET MVC 4的代码EF6. 将有2个上下文,即MasterContext和TenantContext.用户将首先点击MasterContext以身份验证用户凭据并获取其租户配置. 基于提取的租户配置; TenantContext设置为特定于租户的数据库并用于租户CRUD操作. 请建议如何实现这一目标. 解决方案 这个想法是确定当前请求tenant_id并使用它来获取数据库配置并创建DBContext如下代码. public AppDbContext : DbContext { private const string _defaultCS = "default app connection string"; public AppDbContext() : base(GetConnectionString()) { } private st
2 2024-04-26
编程技术问答社区
我如何获得我的多租户Azure功能来访问另一个租户的资源?
我非常有信心我为多租户应用程序设置了所有内容. 在租户A中: 我创建了一个Azure功能,并启用了系统托管的身份.我授予图形API的托管身份权限.我确认我的API可以为托管身份获得访问令牌,并使用它访问图形API.我在应用程序中添加了Azure AD身份验证,并为该应用程序创建了应用程序注册.我在应用程序注册的API权限设置中配置了必要的图形API权限.我还启用了各种选项来启用多租户访问. 在租户B中: 我访问了特殊URL,以启动租户A中该应用程序的管理员同意流程.我确认我已提示我同意我在App注册中指定的权限A.我可以看到有几个新的企业应用程序条目是在租户a. 到目前为止一切都很好.但是,无论我做什么,我都无法获得代币以在租户B的背景下访问图形API > 代码使用托管身份检索访问令牌: var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { Ad
4 2024-04-24
编程技术问答社区
用多数据库创建单一的应用程序
我认为我没有通过标题正确描述问题.但是,我有一个.NET Core Web API应用程序,我所有的租户都将使用它.除了单个API实例,我都有一个前端vuejs实例,所有租户都可以用作"门户". 这些租户每个都有自己的数据库.当前,API都需要在请求中指定请求的租户中的tenant标题,然后根据请求根据租户创建DB连接. 您不能假装自己的另一名租户,因为所有API都需要针对租户DB的授权. 我猜我坚持使用的是确定用户使用单个前端vuejs实例登录时的租户.仅在使用API​​时,这不是问题在所有租户中使用. 很抱歉,如果我没有很好地解释问题,那是一个棘手的情况. 解决方案 您的用户住在哪里?您可能必须将用户信息提取到一个单独的身份数据库中,其中包含用户属于哪个租户的信息.这可以像钥匙值商店一样简单:email-> tenantid.因此,要登录,您必须查找此tenantId,然后在正确的租户数据库中对用户信息进行身份验证. ,或者您可以将所有用户信息都
6 2024-04-24
编程技术问答社区
使用AspNetCore.OData 7.2.1的GetRouteData始终为空
我正在尝试使用.NET Core 2.2和Aspnetcore.odata 7.2.1使用基本身份验证处理程序来保护ODATA API. 我需要处理多租户URL,然后从URI取回令牌,然后在授权处理程序中使用该网址来确定用户是否已获得授权. 这样做,我使用IHTTPContextAccessor,但这仅适用于标准API,而不是与ODATA一起使用. odata不喜欢EndPointRouting,我必须如下所示将其禁用,但是在这种情况下,我该如何访问Routedata以将租户令牌带入? 有其他方法吗?在代码下方,您可以使用此操作. startup.cs public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets call
0 2024-04-23
编程技术问答社区
当使用DbContext与Linq时,EXECUTE AS
我正在设计一个多租户数据库,在其中为每个租户提供相应的数据库用户.将用户分配了与租户相关的架构的访问权限以及DBO架构中对象的特定权利. 我确定了租户后,我想通过执行以下SQL语句切换到适当的用户上下文: EXECUTE AS User = 'Tenant1' WITH NO REVERT 当我使用dbContext的数据库属性的executesqlCommand执行此命令时,一切似乎都可以正常工作.当我以后使用LINQ对模型进行更改并调用方法 myDbContext.SaveChanges(); 我有一系列例外: 在提供商上开始交易时发生了错误 联系.有关详细信息,请参见内部例外. 内部例外: 当前命令上发生了严重的错误.结果(如果有) 应该丢弃. 是否可以以这种方式更改用户的执行上下文,如果是,最好的方法是什么? 解决方案 我需要的大多数答案都在这里找到: public partial class MyDBContext
6 2024-04-23
编程技术问答社区
多租户隔离式数据库的DAL和配置的最佳实践
我的公司拥有十几个网站和孤立的DB(相同的模式). 每个客户都有自己的网站(不同的应用程序池)和DB. 每个网站都有自己的配置,几个连接字符串,但是它们都具有相同的配置模式. cust1.domain.com cust2.domain.com cust3.domain.com 我们想将所有网站合并到一个(单个应用程序池),并出于安全和大量数据原因与孤立的DBS保持联系. 设计DAL和配置的最佳实践是什么? 如果大量租户同时同时,它的含义是什么?一个应用程序池可以管理这种情况还是可以以某种方式进行管理? 顺便说一句,我们正在为用户身份验证使用ASP-Membership. 预先感谢 埃迪 解决方案 使用Application_PostAuthenticate global.asax中的事件加载正确的数据库,然后在Application_EndRequest 中关闭连接 其他解决方案 一个选项是在会员资格中使用配置文件,并存储一块
4 2024-04-19
编程技术问答社区
ASP.Net Core Blazor:如何根据头像值加载不同的_Host.cshtml文件
我想根据请求中的标头加载_Host.cshtml文件. 例如: 客户端连接到example.com,并将其重定向到特定于租户A的_Host.cshtml文件. 另一个客户端连接到test.com,并将其重定向到特定于房客b. 的_Host.cshtml文件 _Host.cshtml文件看起来像这样: @page @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers ProjectName
2 2024-04-19
编程技术问答社区
多租户: 每个租户有独立的数据库
我们正在开发多租户应用程序.关于体系结构,我们为业务逻辑设计了共享的中间层,每个租户一个数据库都为数据持久性设计了.话虽如此,业务层将与每个租户的数据库服务器建立一组连接(连接池).这意味着应用程序为每个租户保持单独的连接池.如果我们期望大约5000名租户,那么该解决方案需要高度资源利用率(每位租户的应用程序服务器和数据库服务器之间的连接),这会导致性能问题. 我们通过保留共同的连接池解决了这一点.为了在不同的数据库中维护单个连接池,我们创建了一个名为" App-Master"的新数据库.现在,我们始终首先连接到"应用程序管理员"数据库,然后将数据库更改为特定于租户的数据库.解决了我们的连接池问题. 此解决方案与本地数据库服务器非常有效.但是它不适用于Azure SQL,因为它不支持更改数据库. 事先感谢您建议如何维护连接池或更好的方法/最佳实践,以应对这种多租户方案. 解决方案 我之前已经看到了带有单独数据库的多个租赁方案.有两个重叠的问题;每位租户的网络服务
4 2024-04-18
编程技术问答社区
在MVC4应用程序中,使一个对象可以被服务层访问而不需要作为参数传递
我正在构建一个多租户MVC应用程序,其中有一个应用程序池和一个数据库.我有一个租户桌,我的每个型号都有一个房客. 每个租户都有一个字符串" URL",该字符串标识用于访问该租户数据的完整URL. 我可以通过以下(粗略近似)从我的基本控制器访问它: HttpRequest request = HttpContext.Current.Request; Uri requestUrl = request.Url; _tenant = _tenantService.GetTenantByUrl(requestUrl); 现在,我需要将租户转入服务层以执行业务逻辑.我可以做到这一点的一种方法是遍历所有服务(〜200个方法)中的每种方法并添加租户参数.我必须将每个调用触摸到服务层,每个服务层方法.这会起作用,但这很乏味,弄乱了代码. 例如,我以前的一种方法之一: public void DeleteUserById(int userId) {
4 2024-04-16
编程技术问答社区
多租户Asp.net Core网站中基于参数的JWT认证
我在.NET Core 2.1网站中使用基于JWT的身份验证.目前,这正常.现在,我必须制作一个API多租户,每个租户都会有自己的秘密钥匙.租户ID将以参数作为API传递. [Authorize] [HttpGet("tenant/{id}")] public async Task GetInfo(string id) { } 每个租户将签署JWT,并将添加到授权标题中.我无法考虑一种基于参数更改issuerSigningKey的方法.我尝试以下内容: 通过制作[AllowAonymus]来验证API内部的JWT.这有效,但我最终编写了所有JWT验证代码. 实施ISecurityTokenValidator 我可以实现ISecurityTokenValidator来验证令牌并在启动配置中使用它: services.AddAuthenticatio
4 2024-04-16
编程技术问答社区
实体框架多租户共享数据架构:单列、多外键
我有以下数据结构: //property Notification abstract class BindableBase { } //base class for all tenant-scoped objects abstract class TenantModelBase : BindableBase { int TenantId; } abstract class Order : TenantModelBase { Customer Customer; //works: mapped using TenantId and CustomerId Product Product; //again, works with TenantId and ProductId string ProductId; string CustomerId; } class Customer: TenantModelBase { string Custo
2 2024-04-15
编程技术问答社区
EF Core 2.0.0查询过滤器正在缓存TenantId(为2.0.1以上版本更新)。
我正在构建一个多租户应用程序,并且由于我认为EF核心在请求中遇到了租户ID的困难.似乎唯一有帮助的是,当我登录租户和租户时,请不断重建应用程序. 我认为这可能与IHttpContextAccessor实例是单身人士有关,但是它不能抓取,当我不重建而登录和登录时,我可以看到房客的名字在顶部更改页面,这不是问题. 我唯一能想到的是EF Core正在做某种查询缓存.我不确定为什么会考虑它是一个范围的实例,除非我错了,否则应该在每个请求上重建它.我希望它的行为能像一个范围的实例一样,所以我可以在每个实例的模型构建时间中简单地注入租户ID. 如果有人可以将我指向正确的方向,我将非常感谢.这是我当前的代码: tenantprovider.cs public sealed class TenantProvider : ITenantProvider { private readonly IHttpContextAccessor _accessor;
8 2024-04-12
编程技术问答社区
身份服务器4 登录后重定向到不同的客户端
我正在启动一个新项目,并使用IS4进行身份验证. 该应用程序将具有单个客户端和API,该客户端将分布在多个区域. 用户将将一个区域分配给其配置文件,以便可以将其重定向到其区域URL(可能由子域定义)登录后,如何实现? 例如.用户导航到 https://example.com ,并要求登录. 在登录过程中,用户具有定义的区域,例如英国. 用户已经过身份验证,现在我需要将其重定向到他们的客户端,该客户将在 https://uk.example.com上托管. 解决方案 根据OIDC规格,Identity Provider必须在交互式登录后将用户重定向到有效的URL,并提供了授权请求.但是,我看到至少有两个选择来解决要求,而没有任何身份方面的任何更改. 两者都需要在主站点上进行一些工作, http://example.com 您可以根据某些索赔而不是用户最初要求的路径来调整OnTicketReceived处理,以便将其重定向到本地站点. 看起来像: servi
2 2024-04-01
编程技术问答社区
带有多租户的Spring Batch
我们如何将春季批处理作业定义为与多个租户有关? 我已经设置了每晚针对一个数据库架构的顺序运行一系列作业.当前的所有作业目前从位置并插入到数据库中.批处理配置是非常基本的,我在其中定义了数据源,事务管理器和映射工作重新定位.我的工作将指向此存储库和交易管理器.另外,我目前正在数据库中持续存在批处理数据信息. 我的新要求是能够针对多个租户运行相同的作业(按顺序执行).每个租户数据都可以在同一数据库服务器中使用,但是不同的模式甚至不同的数据库服务器.我的问题是 1)我们是否将所有租户的特定元数据信息存储在一个通用数据库中或每个租户数据库中应该有自己的? 2)我的理解是,我们需要每个租户的数据源,以便该租户的特定作业可以访问数据库以存储从文件中读取的数据. Spring Batch存储库在执行该租户的作业时是否还应指向当前的数据源? 3)我们计划启动所有租户[工作]平行的意思,这意味着Job1可以同时为所有租户运行.目前,我仍然不确定如何管理这些租户与其他数据源相关
8 2024-03-29
编程技术问答社区
在Azure中管理多租户存储的最有效方法?
我们正在创建一个必须在租户之间隔离数据的多租户应用程序.每个租户将保存各种文档,每个文件都可以属于几个不同的文档类别.我们计划将Azure Blob存储用于这些文档.但是,鉴于我们的用户群以及每个文档的数量和大小,我们不确定如何使用当前的Azure订阅最好地管理存储帐户. 这里有一些数字要考虑.每位用户每年以27,000 8MB文档为27,000个用户,即每年1080TB.一个存储容器以每个存储帐户的500TB最大化. 所以我的问题是,存储这些数据并保持在Azure限制范围内的最有效,最具成本效益的方法是什么? 这是我们考虑的一些事情: 为每个客户创建一个存储帐户.这是不起作用的,因为您每个订阅只能拥有100个存储帐户(这是最理想的解决方案). 为每个客户创建一个斑点容器.存储帐户的最高可达500TB,因此这可能有效,除非最终我们必须分为其他存储帐户.我不确定如果用户最终在两个帐户中获得数据,这将如何工作.可能会变得凌乱. 也许我们在这里缺少一些根本简
4 2024-03-26
编程技术问答社区
Windows Azure 我可以在同一个超小型实例或小型实例上运行多个网站吗?
我正在评估MS Cloud Windows Azure,用于托管3个完全分开的网站. 每个网站都有自己的数据库,它们没有连接,因此3个网站和3个数据库. 我的目的是优化启动项目的成本,并有可能按需扩展. 我想知道: 如果可以在同一实例上托管3个网站(额外的小实例或小实例). 如果可以在同一SQL Azure数据库上托管3个数据库(所以我将使用3个数据库的SQL存储总量)或每个网站数据库,我必须支付SQL Azure的实例. 感谢您的时间. 解决方案 您绝对可以在同一实例上运行多个网站,从SDK 1.3开始,因为Full IIS现在在Web角色中运行.正如乔纳森(Jonathan)在MSDN文章链接中指出的那样,您可以设置网站元素来定义每个网站.您还应该查看Windows azure 平台培训套件特别是围绕建立多站点的网络角色. 您还可以利用 cloud Ninja 或 Windows Azure Accelerator用于Web角色,它提供了
4 2024-03-26
编程技术问答社区
使用DbContext和TenantId-Interceptors的多租户,过滤器,EF代码优先
我的组织需要具有共享的数据库,共享的模式多端数据库.我们将根据tenantid进行查询.我们将拥有很少的租户(少于10),所有租户将共享相同的数据库模式,而不支持特定于租户的更改或功能.租户元数据将存储在内存中,而不是在DB(静态成员)中. 这意味着所有实体现在都需要一个tenantid,并且DbContext需要知道默认情况下对此进行过滤. TenantId可能会通过标头值或原始域确定,除非有更可建议的方法. 我已经看到了为此利用拦截器的各种样本,但还没有在tenantid实施中看到一个明确的示例. 我们需要解决的问题: 我们如何修改当前架构以支持这一点(简单我认为,只需添加tenantid) 我们如何检测租户(也简单 - 基于原始请求的域或标头值 - 从基本控制器中拉出) 我们如何将其传播到服务方法(有点棘手...我们使用di通过构造函数进行水合...想要避免使用tenantId> 避免所有方法签名 一旦我们拥有它(不知道) 我们如何优化性能.我
10 2024-03-26
编程技术问答社区
服务结构多租户
我们计划将Azure服务面料用于面向数据的多租户应用程序.通常,每个用户有100多个客户. 查看文档,我得出的结论是,最好的方法是为每个客户使用应用程序实例,而不是尝试使用配置文件来实现多租户. 这是最好的方法吗? 解决方案 每个客户的应用程序是处理单个集群中多租户情况的好方法,是的.今天有一些服务面料应用程序(Azure DB是一个值得注意的DB). 以下方法是您得到的一些方法: 每个应用程序实例都有自己的过程,这意味着您每个租户都有过程级别的隔离. 每个应用程序实例由一个或多个服务组成,这意味着您可以使用"微服务"架构样式. 可以使用唯一的参数创建每个应用程序实例,因此您可以为每个租户提供各种设置.例如,您可以通过在其应用程序实例中使用更高的副本设置大小设置为某些租户提供更高的可用性,也可以通过在其应用程序实例中使用高分分区计数设置来提供更高的数据容量. 对于以数据为导向的多租户情况来说,这些通常是好事,但是当然,这是否取决于您的特定要求.
4 2024-03-26
编程技术问答社区
Azure服务结构多租户
我试图对已经回答的这个问题进行一些跟进... 服务织物多倾角 如果我要将租户设置为Azure Service Fabriceless无状态服务(他们将使他们的州外部范围内),我该如何在集群中的每个节点上放置多个租户?在测试中,如果您尝试使实例计数大于节点计数,则似乎服务面料插科打了. 这些租户非常轻巧,因此我应该能够在每个节点上运行数十个(我们总的数百个),而且我不想为每个节点做一个节点.具体来说,租户或不再只是开放与外部客户服务的长期http连接,然后将数据流回我们的系统中 - 因此,这里没有公共端点.我只需要能够旋转许多这样的工人,这些工人每个人都会打开自己的长纸条连接. 有人可以将我指向正确的方向吗? fyi,我在这里解释了更多... https://social.msdn.microsoft.com/forums/forums/en-us/efd172e2-0783-33-489b -pernode?forum = azureservicefabri
2 2024-03-26
编程技术问答社区
Azure DocumentDB多租户架构
我一直在预览中实现DocumentDB,以进入多二个系统.我的计划是为注册的每个租户在DocumentDB帐户下生成一个新数据库.此代码的大部分已经到位,测试进行得非常好. 由于DocumentDB已正式发布,并且该文档已完成,因此我阅读了有关每个DocumentDB帐户100个数据库限制的信息,这使我停下来重新考虑我的体系结构. 我想保持租户隔离,以便删除帐户很容易,并且组织的组织非常干净.租户之间的数据不需要互动,因此将其分开不是问题. 我的问题: 由于我的目标是使该规模达到数十万甚至数十万租户,因此由于DocumentDB限制和/或成本,我需要考虑其他架构? 这是否意味着我需要在多个DocumentDB帐户中每100个帐户碎片? 根据Microsoft,100个数据库的限制只是一个软限制,可以根据要求扩大规模,但是如果需要,它可以达到100,000+吗?如果我获得了预期的更多帐户注册,并且我在生产中达到了可能失去客户的限制怎么办? 存在这种
6 2024-03-25
编程技术问答社区