2017-03-21 13 views
0

WebAPI 프로젝트에서 다중 임대를 구현하려고합니다.OwinContext 환경에 추가 된 요소가 없습니다.

내 Startup.Auth.cs에서 선택한 Tenant 개체를 IOwinContext에 추가하고 있습니다.

 app.Use(async (ctx, next) => 
     { 
      Tenant tenant = GetTenantBasedUrl(ctx.Request.Uri.Host); 
      if (tenant == null) 
      { 
       throw new ApplicationException("tenant not found"); 
      } 
      ctx.Environment.Add("MultiTenant", tenant); 
      await next(); 
     } 

여기서 GetTenantBaseUrl 함수는 선택된 Tenant 개체를 반환합니다. 저는 Tenant 객체를 얻기 위해 모든 컨트롤러에 구현할 ApiController를 구현하는 클래스를 만들었습니다. 내 컨트롤러에서

public class MultiTenantWebApiController : ApiController 
{ 
    public Tenant Tenant 
    { 
     get 
     { 
      object multiTenant; 
      IDictionary<string, object> dic = HttpContext.Current.GetOwinContext().Environment; 
      if (!HttpContext.Current.GetOwinContext().Environment.TryGetValue("MultiTenant", out multiTenant)) 
      { 
       throw new ApplicationException("Could Not Find Tenant"); 
      } 
      return (Tenant)multiTenant; 
     } 
    } 

} 

은 내가 OwinContext 환경에서 "멀티 테넌트"키를 얻고있다하지만 난 내 OwinContext 환경 예에서 "멀티 테넌트"키가 표시되지 않습니다 가져 ApplicationOAuthProvider 클래스에서 같은 시도 : 아래 getEnvironment 변수 :

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 
{ 
    private readonly string _publicClientId; 

// some code here 

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     try 
     { 
      **IDictionary getEnvironment = HttpContext.Current.GetOwinContext().Environment;** 
     // some code 

왜 내 컨트롤러 안에있는 동안 ApplicationOutProvider의 OwinContext.Environment에 "MultiTenant"키가 나타나지 않는지 아는 사람이 있습니까?

감사합니다.

답변

0

각 api 컨트롤러에 삽입 된 컨텍스트를 사용하여 테넌트와 해당 컨텍스트가 레이어 전체에 표시되도록 할 수 있다고 제안합니다. 컨텍스트 공급자가 다음 [아래 주어진 Autofac를 사용하는 예]를 DI 프레임 워크에서 컨텍스트 공급자를 등록이

public class ClaimsContextDataProvider : IUserContextDataProvider 
    { 
     public Guid UserId 
     { 
      get 
      { 
       var userId = (Thread.CurrentPrincipal as ClaimsPrincipal)?.FindFirst(ClaimTypes.Sid)?.Value; 
       return TryGetGuidFromString(userId); 
      } 
     } 
} 

처럼 뭔가를 찾고있을 수

builder.RegisterType<ClaimsContextDataProvider>().As<IUserContextDataProvider>();

다음과 같은 BaseApiController 뭔가를 아래 스 니펫

public Guid TenantId { get { return _userContext.TenantId; } } 

     public BaseApiController(IMapper mapper, IUserContextDataProvider userContext) 
     { 
      _mapper = mapper; 
      _userContext = userContext; 
     } 

파생 된 c 내부의 BaseApiController의 TenantId 속성에 액세스하기 여기에 설명 할 깊은 조금, 주시기 바랍니다 ontrollers [CountriesController.cs]

// POST api/countries 
     public async Task<HttpResponseMessage> PostCountry(CountryRequestModel requestModel) 
     { 
      Country country = _mapper.Map<CountryRequestModel, Country>(requestModel); 
      country.CreatedOn = DateTimeOffset.Now; 
      country.TenantId = TenantId; 

      await _countryService.AddAsync(country); 

      CountryDto countryDto = _mapper.Map<Country, CountryDto>(country); 
      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, countryDto); 
      response.Headers.Location = GetCountryLink(country.Id); 

      return response; 
     } 

당신은 샘플 응용 프로그램에서 모양과 아래의 링크

Multi-Tenant dev template

그것에서 주어진 템플릿을 취할 수 문서를 자유롭게 읽을 수 있습니다. here

+0

굉장한 Saravanan .. 같은 세부 문서를 제공해 주셔서 감사합니다. 고맙습니다! –

+0

@TarunOhri : 유용하다고 생각되면 답변으로 표시하십시오. – Saravanan