ASP.NET MVC 多租户应用程序问题

发布于 2024-12-12 16:16:43 字数 1134 浏览 0 评论 0原文

我们目前正在开发一个 asp.net mvc3 (aspx) 多租户网站。我们在 web.config 中创建了一个具有以下结构的租户配置部分:

<tenants>
  <tenant name="client1" baseUrl="client1.domain.com">
    <settings>
      <setting name="siteName" value="client 1 site">
    </settings>
  </tenant>
  <tenant name="client2" baseUrl="client2.domain.com">
    <settings>
      <setting name="siteName" value="client 2 site">
    </settings>
  </tenant>
</tenants>

在我们的代码中,我们或多或少有一个租户构建器,它从我们的 ITenant 接口创建具体的类。

一旦我们能够解决这个问题,一切都会很好地为每个租户呈现我们的网站。然而,我对做两件事的方式感到不舒服。 还要注意,当我们进行依赖注入时,我们没有使用第 3 方 IOC 容器(所有 DI 现在都是自定义的)。

  1. 控制器操作覆盖 - 目前我们的租户中有一些方法可以执行作为控制器操作覆盖(返回 ActionResult)在实际控制器操作中调用。例如 - 如果我们需要 Home/Index 的租户特定逻辑,我们会执行以下操作:返回 currentTenant.HomeIndex()。 我可以使用 ControllerFactory 或 ServiceLocator 来代替这种方式吗?如果是这样,有人可以解释一下解决这个问题的最佳方法吗?

  2. 访问 - 现在我们的两个租户相当于以下内容:client1 = 免费用户,client2 = 付费用户。 当我们使用 MembershipProvider 来授权用户时,我们创建了一个 ActionFilter 来检查用户类型/级别并继续或重定向到适当的站点。有没有更智能的方法来进行这些检查?

提前致谢。

We are currently developing an asp.net mvc3 (aspx) multi tenant website. We have created a tenant configuration section in our web.config w/ the following structure:

<tenants>
  <tenant name="client1" baseUrl="client1.domain.com">
    <settings>
      <setting name="siteName" value="client 1 site">
    </settings>
  </tenant>
  <tenant name="client2" baseUrl="client2.domain.com">
    <settings>
      <setting name="siteName" value="client 2 site">
    </settings>
  </tenant>
</tenants>

And in our code we have more or less a tenant builder that creates concrete classes from our ITenant interface.

Everything works well rendering our site per tenant once we are able to resolve it. However I don't feel comfortable the way were are doing two things. Also note while we are doing Dependency Injection we are not using a 3rd party IOC Container (all DI is custom right now).

  1. Controller action overrides - currently we have some methods in our tenants that act as controller action overrides (returns an ActionResult) that are called in the actual controller action. For example - If we needed tenant specific logic for Home/Index we would do something like this: return currentTenant.HomeIndex(). Rather than do it this way, can I use a ControllerFactory or the ServiceLocator? If so can someone explain the best way to go about this?

  2. Access - right now our two tenants equate to the following: client1 = free user, client2 = paid user. While we use a MembershipProvider to authorize users, we have created an ActionFilter that checks the user type/level and continue or redirect to the appropriate site. Is there a smarter way to do these checks?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

〃温暖了心ぐ 2024-12-19 16:16:44

对于第一部分,您可以在操作声明中添加一个额外的变量,即:

public ActionResult Index(Itenant tenant)

而不是返回 currentTenant.HomeIndex()

return Action("Index", new { tenant = currentTenant});

您可以执行自动工作的操作, 。 (或者,如果您觉得额外冒险,您可以跳过新的 {tenant.. } 部分,并使用自定义模型绑定器!)

第二部分,这实际上是更聪明的方法。如果您想要通过重定向进行自定义安全检查,则必须实施自定义过滤器。

For the first part, you can have an extra variable at the action declaration, ie:

public ActionResult Index(Itenant tenant)

and instead of return currentTenant.HomeIndex() you could do

return Action("Index", new { tenant = currentTenant});

which would automagically work. (Or you could skipe the new {tenant.. } part, and use a custom model binder if you feel extra adventurous!)

Second part, this is actually the smarter way. If you want custom security clearance with redirection, you have to implement a custom filter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文