gpt4 book ai didi

asp.net-mvc - 使用 ASP.NET MVC 设置路由 {tenant}/{controller}/{action}/{id}?

转载 作者:行者123 更新时间:2023-12-02 12:18:33 24 4
gpt4 key购买 nike

我想设置一个 Multi-Tenancy ASP.NET MVC 应用程序。理想情况下,此应用程序应具有包含 {tenant}/{controller}/{action}/{id} 的路由,每个 tenant 代表应用程序的一个逻辑实例(简单地说独立的多用户帐户)

我仍然不清楚具体的细节是如何实现的。有任何指南可用于使用 ASP.NET MVC 设置此类 Multi-Tenancy 方案吗?

最佳答案

我目前正在开发一个类似的项目,使用 ASP.Net MVC、表单例份验证和用于成员/角色/配置文件的 SQL 提供程序。这是我正在采取的方法:

  1. 将默认路由注册为 `{tenant}/{controller}/{action}/{id}

  2. 更改标准 MVC 模板附带的 FormsAuthenticationService 的默认行为。它应该将身份验证票证的 UserData 设置为包含租户名称(来自您的路由)。

    public void SignIn(string userName, bool createPersistentCookie, string tenantName)
    {
    var ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30),
    createPersistentCookie, tenantName);
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
    HttpContext.Current.Response.AppendCookie(cookie);
    }
  3. 在您的 global.asax 文件中执行一些租户安全检查并允许在一个成员资格数据库中的租户之间进行用户分区

    protected void Application_AuthenticateRequest(object sender, EventArgs e)
    {
    //Since this method is called on every request
    //we want to fail as early as possible
    if (!Request.IsAuthenticated) return;
    var route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(Context));
    if (route == null || route.Route.GetType().Name == "IgnoreRouteInternal") return;
    if (!(Context.User.Identity is FormsIdentity)) return;
    //Get the current tenant specified in URL
    var currentTenant = route.GetRequiredString("tenant");
    //Get the tenant that that the user is logged into
    //from the Forms Authentication Ticket
    var id = (FormsIdentity)Context.User.Identity;
    var userTenant = id.Ticket.UserData;
    if (userTenant.Trim().ToLower() != currentTenant.Trim().ToLower())
    {
    //The user is attempting to access a different tenant
    //than the one they logged into so sign them out
    //an and redirect to the home page of the new tenant
    //where they can sign back in (if they are authorized!)
    FormsAuthentication.SignOut();
    Response.Redirect("/" + currentTenant);
    return;
    }
    //Set the application of the Sql Providers
    //to the current tenant to support partitioning
    //of users between tenants.
    Membership.ApplicationName = currentTenant;
    Roles.ApplicationName = currentTenant;
    ProfileManager.ApplicationName = currentTenant;
    }
  4. 对每个租户数据进行分区。这里有两个选项:

    4a。为每个租户使用单独的数据库。这为您的租户提供了最佳的数据安全性。在共享成员资格数据库中,添加一个以每个租户的唯一 appid 为键的表,并使用该表来存储和检索基于当前租户的连接字符串。

    4b。将所有数据存储在一个数据库中,并为每个表设置唯一的租户 ID。这为您的租户提供的数据安全性稍差,但仅使用一个 SQL Server 许可证。

关于asp.net-mvc - 使用 ASP.NET MVC 设置路由 {tenant}/{controller}/{action}/{id}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com