2009-11-09 12 views
8

Chciałbym skonfigurować aplikację MVC dla wielu dzierżawców aplikacji ASP.NET MVC. Idealnie byłoby, gdyby ta aplikacja miała trasę z numerem {tenant}/{controller}/{action}/{id}, z których każdy tenant reprezentowałby logiczną instancję aplikacji (po prostu niezależne konta wielu użytkowników).Skonfiguruj trasę {lokator}/{controller}/{action}/{id} za pomocą MVC ASP.NET?

Drobne szczegóły, jak to jest jeszcze dość niejasne dla mnie. Każdy przewodnik dostępny do ustawienia takiego systemu multi-tenant z ASP.NET MVC?

Odpowiedz

12

Obecnie pracuję nad podobnym projektem przy użyciu ASP.Net MVC, uwierzytelnianie formularzy i dostawców SQL dla członkostwa/Role/profil. Oto podejście Biorę:

  1. Zarejestruj domyślną trasę jako `{najemcy}/{kontroler}/{działania}/{id}

  2. Zmień domyślne zachowanie FormsAuthenticationService że pochodzi ze standardowym szablonem MVC. Powinien ustawić UserData biletu uwierzytelnienia, aby zawierał nazwę dzierżawcy (z twojej trasy).

    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. W pliku global.asax zrobić kilka kontroli bezpieczeństwa najemcy i umożliwić partioning użytkowników między lokatorów w jednej bazie członkostwa

    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. podziału każde dane lokatorów. Oto dwie opcje:

    4a. Użyj osobnej bazy danych dla każdego lokatora. Zapewnia to najlepsze zabezpieczenie danych dla lokatorów. W bazie danych współużytkowanych członków dodaj tabelę, która jest wpisana w unikatowy appid dla każdego dzierżawcy i użyj tej tabeli do przechowywania i pobierania ciągu połączenia na podstawie bieżącego dzierżawcy.

    4b. Przechowuj wszystkie dane w jednej bazie danych i wpisz każdą tabelę na unikalnym identyfikatorze dzierżawcy. Zapewnia to nieco mniej bezpieczeństwa danych dla lokatorów, ale korzysta tylko z jednej licencji SQL Server.

+2

Przepraszamy za nieaktualną odpowiedź, ale Pracuję nad czymś podobnym i myślę, że twoje rozwiązanie może działać, ale dokumenty mówią, że istnieje tylko jeden domyślny dostawca dla wszystkich żądań przychodzących na serwer. Myślę więc, że ustawienie nazwy aplikacji może być warunkiem wyścigowym. –

+0

CShipley, masz absolutną rację. Kiedy sam korzystałem z tego rozwiązania, prawie oszalałem, próbując rozwiązywać problemy, gdy miałem równoczesnych użytkowników różnych najemców. Myślę, że sposobem jest napisanie fragmentu uwierzytelnienia od zera lub wdrożenie własnego dostawcy członkostwa. Wybrałem przeniesienie do osobnego wystąpienia aplikacji dla każdego dzierżawcy, dopóki nie uzyskałem informacji o opracowanym niestandardowym schemacie uwierzytelniania. –

+0

Jak radzisz sobie z użytkownikiem, który może działać w imieniu więcej niż jednego najemcy? –

2

Będziesz probe findtheselinksuseful.

+0

Powiązane pytanie jest rzeczywiście istotne, ale niestety nie przesłano dobrych odpowiedzi. Właściwie jedyny trafny post łączy się z jeszcze jednym postem, z jeszcze mniej trafnymi odpowiedziami :-( –

+0

Ten sux. Domyślam się, że poczekam, aż znajdziesz odpowiedź, a ja użyję tego, co znajdziesz wtedy: D –

+0

Dzięki, te linki są świetne! –

Powiązane problemy