Frage

Ich würde die Einrichtung wie ein Multi-Tenant ASP.NET MVC-app. Idealerweise würde diese App eine Route mit {tenant}/{controller}/{action}/{id}, die jeweils tenant eine logische Instanz der app darstellt (einfach unabhängige Multi-User-Konten)

Das feinkörnige Detail, wie zu tun, was mir noch recht unklar sind. Jede Anleitung zur Verfügung Einrichtung solchen Multi-Tenant-Schema mit ASP.NET MVC?

War es hilfreich?

Lösung

Ich bin derzeit an einem ähnlichen Projekt arbeitet ASP.Net MVC verwenden, Formularauthentifizierung und die SQL-Provider für Mitgliedschaft / Rollen / Profile. Hier ist der Ansatz, den ich nehme:

  1. Registrieren Sie die Standardroute als `{Mieter} / {Controller} / {Aktion} / {id}

  2. ändern Sie das Standardverhalten des FormsAuthenticationService, die mit der Standard-MVC-Vorlage kommt. Es sollte die Userdata des Authentifizierungsticket stellen Sie den Mieter Namen enthält (aus Ihrer Route).

    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. In Ihrer Datei global.asax einige Mieter Sicherheitsüberprüfung und ermöglichen partioning der Nutzer zwischen den Mietern in einer Mitgliedschaft Datenbank

    zu tun
    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. Partition jeweils Mieter Daten. Hier sind zwei Möglichkeiten:

    4a. Verwenden Sie für jeden Mieter eine separate Datenbank. Dies bietet die beste Datensicherheit für Ihre Mieter. In der Mitgliederdatenbank geteilt, fügen Sie eine Tabelle, die auf einzigartige appid für jeden Mieter und verwenden Sie diese Tabelle die Verbindungszeichenfolge verkeilt ist auf dem aktuellen Mieter Basis zu speichern und abzurufen.

    4b. Speichern Sie alle Daten in einer Datenbank und Schlüssel jeder Tabelle auf der einzigartigen Mieter-ID. Dies bietet etwas weniger Datensicherheit für Ihre Mieter, sondern verwendet nur eine SQL-Server-Lizenz.

Andere Tipps

Sie werden prob finden < a href = "http://lukesampson.com/post/303245177/subdomains-for-a-single-application-with-asp-net-mvc" rel = "nofollow noreferrer"> diese links nützlich .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top