1

멀티 테넌시 (MVC3, EF 사용) 및 사용자 지정 SQL 멤버쉽 공급자에 관한 질문이 있습니다.MVC3 및 사용자 지정 멤버쉽 공급자와의 멀티 테넌시

추가 사용자 기반 특성과 함께 응용 프로그램 테이블에 userId를 포함해야하므로 사용자 지정 사용자 및 역할 멤버십 클래스가 만들어졌습니다. 나는 이것을 멀티 테넌시 응용 프로그램으로 변환하고 있습니다. 공유 db, 공유 응용 프로그램 모델을 사용할 것입니다. 테넌트 정보 (URL 포함)를 저장하고 Tenant_id가 모든 테이블에 포함 된 마스터 테넌트 (Master Tenant) 테이블이 있습니다. 이제 우리는 응용 프로그램 자체에 대한 변경 작업을하고 있습니다.

tenantUrl.mybaseURL.com과 같은 URL을 사용하여 테넌트가 로그인한다는 가정이 있습니다.

- User goes to URL to login 
- The Account controller logon method calls the Custom validate method passing in user/pwd and the tenantId (which has been looked up from the db using the URL). 
- The custom validate method checks if the user/password/tenantId combination are valid. 
- If valid, we set the tenant Id in a HttpRequest Object and login the user 
- For each db access, we lookup the Request object for the tenandId and use that as a filter. 

편집 : 이것은 내 TenantContext 클래스 내가 tenantId

public class TenantContext 
{ 
    public static int TenantId 
    { 
     set 
     { 

      if (!HttpContext.Current.Items.Contains("tenant-code")) 
       HttpContext.Current.Items.Add("tenant-code", value); 

      HttpContext.Current.Items["tenant-code"] = value; 
     } 

     get {return HttpContext.Current.Items.Contains("tenant-code") ? Convert.ToInt32(HttpContext.Current.Items["tenant-code"]) : -1; } 

    } 
} 

를 얻기/설정 될 위치이며, 나는이 알고리즘에 따라 내 사용자 지정 사용자 유효성 검사 방법을 변경하기 위하여려고하고있다

TenantId는 위 컨텍스트의 계정 컨트롤러 로그인에서 설정됩니다.

위 방법을 사용하는 것이 좋습니까? 아니면 더 좋은 방법이 있습니까? 아무도 내가 알고 있어야하는이 문제를 보지 않습니까?

나는 여기에서 AppSettings에 저장된 임차인의 예를 보았습니다 Handling data access in multi tenant site. 이것이 더 좋은 방법인가요?

고마워요

+0

나머지 로그인 작업 동안 tenantId를 가져 오는 방법을 묻는 중입니까? 또는 로그인 한 사용자가 작성한 후속 요청에 대해 tenantId를 가져 오는 방법을 묻는 중입니까? HttpContext에 tenantId를 설정했기 때문에 묻습니다. 이후의 각 요청마다 항목을 가져 오려면 어딘가에서 가져와야합니다. 맞습니까? –

+0

안녕하세요 Amith, 위의 알고리즘이 맞는지 물어 보았습니다. 이것이 내 첫 번째 멀티 테넌트 앱이므로 부탁드립니다. 유효한 사용자 인 경우 URl을 기반으로 db에서 tenantId를 가져 와서 Request 객체에 저장합니다. – SimpleUser

+0

당신이 한 일에 해결책을 게시 할 수있는 기회가 있습니까? –

답변

0

귀하의 알고리즘은 완벽하며 실제로 이런 종류의 구현 작업을 수행하고 있습니다. 나는 당신에게 사용자 정의 객체를 사용하여 서로 다른 계층에 걸쳐 사용자 신원을 유지할 것을 제안합니다. 이 HttpContext는 WCF 서비스의 경우 및 세입자의 소유이고 다른 세입자를 대신하여 작동하는 사용자 컨텍스트에서 사용자를 도와주지 않으므로 사용자 ID, tenantid 등을 포함하게됩니다. 따라서 사용자를 식별하는 UserIdentity 객체를 갖는 것이 더 좋은 옵션입니다. 또한 테넌트 티드를 데이터 액세스 레이어로 보내고 모든 환경에서 사용할 수 없으므로 테넌트 ID를 요청에서 유추하지 않습니다.

+0

안녕하세요 saravanan - EF Navigation 속성으로 멀티 테넌시를 해본 적이 있습니까? 당신이 이것을 점검 할 시간이 있다면 나는 정말로 고마워 할 것입니다. http://stackoverflow.com/questions/19826316/virtual-navigation-properties-and-ultultancy – RobVious

+0

죄송합니다. 지연된 응답. IObjectSet 확장을 만든 다음 테넌트 기반 필터를 수행 한 다음 IQueryable 을 반환 할 수 있습니다. 이 경우, 당신은 전화 할 것입니다. Include ("entity"). FilterTenant() 그리고 이것은 사용하기 쉽고 옳은 방법 일 것입니다 ... – Saravanan