Browse Source

Created ClaimsHttpTenantResolveContributer.

pull/221/head
Halil İbrahim Kalkan 8 years ago
parent
commit
fd0f010f5c
  1. 4
      src/MicroserviceDemo/MicroserviceDemo.Web/MicroservicesDemoWebModule.cs
  2. 9
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs
  3. 24
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ClaimsHttpTenantResolveContributer.cs
  4. 2
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs
  5. 19
      src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs

4
src/MicroserviceDemo/MicroserviceDemo.Web/MicroservicesDemoWebModule.cs

@ -127,8 +127,6 @@ namespace MicroserviceDemo.Web
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
app.UseMultiTenancy();
app.UseStaticFiles(); app.UseStaticFiles();
app.UseVirtualFiles(); app.UseVirtualFiles();
@ -140,6 +138,8 @@ namespace MicroserviceDemo.Web
app.UseAuthentication(); app.UseAuthentication();
app.UseMultiTenancy();
app.UseMvc(routes => app.UseMvc(routes =>
{ {
routes.MapRoute( routes.MapRoute(

9
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyModule.cs

@ -14,10 +14,11 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
{ {
services.Configure<TenantResolveOptions>(options => services.Configure<TenantResolveOptions>(options =>
{ {
options.TenantResolvers.Insert(0, new QueryStringTenantResolveContributer()); options.TenantResolvers.Insert(0, new ClaimsHttpTenantResolveContributer());
options.TenantResolvers.Insert(1, new RouteTenantResolveContributer()); options.TenantResolvers.Insert(1, new QueryStringTenantResolveContributer());
options.TenantResolvers.Insert(2, new HeaderTenantResolveContributer()); options.TenantResolvers.Insert(2, new RouteTenantResolveContributer());
options.TenantResolvers.Insert(3, new CookieTenantResolveContributer()); options.TenantResolvers.Insert(3, new HeaderTenantResolveContributer());
options.TenantResolvers.Insert(4, new CookieTenantResolveContributer());
}); });
services.AddAssemblyOf<AbpAspNetCoreMultiTenancyModule>(); services.AddAssemblyOf<AbpAspNetCoreMultiTenancyModule>();

24
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/ClaimsHttpTenantResolveContributer.cs

@ -0,0 +1,24 @@
using System.Linq;
using Microsoft.AspNetCore.Http;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.AspNetCore.MultiTenancy
{
public class ClaimsHttpTenantResolveContributer : HttpTenantResolveContributerBase
{
protected override void ResolveFromHttpContext(ITenantResolveContext context, HttpContext httpContext)
{
if (httpContext.User?.Identity?.IsAuthenticated == true)
{
base.ResolveFromHttpContext(context, httpContext);
context.Handled = true;
}
}
protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext)
{
var tenantKey = context.GetAspNetCoreMultiTenancyOptions().TenantKey;
return httpContext.User.Claims.FirstOrDefault(c => c.Type == tenantKey)?.Value;
}
}
}

2
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs

@ -29,7 +29,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
} }
} }
private void ResolveFromHttpContext(ITenantResolveContext context, HttpContext httpContext) protected virtual void ResolveFromHttpContext(ITenantResolveContext context, HttpContext httpContext)
{ {
var tenantIdOrName = GetTenantIdOrNameFromHttpContextOrNull(context, httpContext); var tenantIdOrName = GetTenantIdOrNameFromHttpContextOrNull(context, httpContext);
if (!tenantIdOrName.IsNullOrEmpty()) if (!tenantIdOrName.IsNullOrEmpty())

19
src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -27,13 +28,18 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
public async Task Invoke(HttpContext httpContext) public async Task Invoke(HttpContext httpContext)
{ {
//TODO: Try-catch and return "unknown tenant" if found tenant is not in the store..? using (SetCurrentTenant(await ResolveCurrentTenantAsync()))
{
await _next(httpContext);
}
}
private async Task<TenantInfo> ResolveCurrentTenantAsync()
{
var tenantIdOrName = _tenantResolver.ResolveTenantIdOrName(); var tenantIdOrName = _tenantResolver.ResolveTenantIdOrName();
if (tenantIdOrName == null) if (tenantIdOrName == null)
{ {
await _next(httpContext); return null;
return;
} }
var tenant = await FindTenantAsync(tenantIdOrName); var tenant = await FindTenantAsync(tenantIdOrName);
@ -42,10 +48,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
throw new AbpException("There is no tenant with given tenant id or name: " + tenantIdOrName); throw new AbpException("There is no tenant with given tenant id or name: " + tenantIdOrName);
} }
using (SetCurrent(tenant)) return tenant;
{
await _next(httpContext);
}
} }
private async Task<TenantInfo> FindTenantAsync(string tenantIdOrName) private async Task<TenantInfo> FindTenantAsync(string tenantIdOrName)
@ -60,7 +63,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy
} }
} }
private IDisposable SetCurrent(TenantInfo tenant) private IDisposable SetCurrentTenant([CanBeNull] TenantInfo tenant)
{ {
var parentScope = _currentTenantIdAccessor.Current; var parentScope = _currentTenantIdAccessor.Current;
_currentTenantIdAccessor.Current = new TenantIdWrapper(tenant?.Id); _currentTenantIdAccessor.Current = new TenantIdWrapper(tenant?.Id);

Loading…
Cancel
Save