Question

Je voudrais installer un mutualisée d'application ASP.NET MVC. Idéalement, cette application aurait un itinéraire avec {tenant}/{controller}/{action}/{id}, chaque tenant représentant une instance logique de l'application (comptes multi-utilisateurs simplement indépendants)

Les détails à grains fins comment faire qui sont encore assez clair pour moi. Tout guide disponible pour installer ce système multi-locataire avec ASP.NET MVC?

Était-ce utile?

La solution

Je travaille actuellement sur un projet similaire en utilisant ASP.Net MVC, l'authentification des formulaires et les fournisseurs SQL pour des membres / Rôles / Profil. Voici l'approche que je prends:

  1. Enregistrer la route par défaut comme `{locataire} / {contrôleur} / {action} / {id}

  2. Modifier le comportement par défaut du FormsAuthenticationService qui vient avec le modèle standard MVC. Il faut régler la UserData du ticket d'authentification pour inclure le nom du locataire (de votre itinéraire).

    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. Dans votre fichier global.asax pour faire des vérifications de sécurité des locataires et permettre à des utilisateurs entre partitionnement des locataires dans une base de données de membres

    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. données Regroupe chacun des locataires. Voici deux options:

    4a. Utiliser une base de données séparée pour chaque locataire. Cette offre la meilleure sécurité des données pour vos locataires. Dans la base de données de membres partagés, ajouter une table qui est calée sur appid unique pour chaque locataire et utiliser ce tableau pour stocker et récupérer la chaîne de connexion en fonction du locataire actuel.

    4b. Stocker toutes les données dans une base de données et chaque table de clés sur l'identifiant du locataire unique. Cela donne un peu moins de sécurité des données pour vos locataires, mais utilise une seule licence SQL Server.

Autres conseils

Vous prob trouver < a href = "http://lukesampson.com/post/303245177/subdomains-for-a-single-application-with-asp-net-mvc" rel = "nofollow"> noreferrer ces links utile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top