2015-11-02 43 views
0

我需要覆蓋我的Asp.Net身份用戶管理器上的IsLockedOutAsync。我正在構建一個多租戶應用程序,通過使用請求URL [tenant] .myapp.com來識別租戶。用戶是否被鎖定的邏輯需要知道租戶是誰。覆蓋Asp.Net身份用戶管理器上的IsLockedOutAsync

的問題是,隨着覆蓋IsLockedOutAsync方法(和任何的UserManager或SignInManager的覆蓋爲此事)被異步,我發現,我沒有訪問HttpContext.Current - 它返回null 。當然,這對我的應用來說是災難性的!沒有http上下文意味着沒有url,這意味着無法識別租戶。

請問有人會建議如何在重寫這些異步方法時解決租戶問題?在閱讀異步之前,我已經閱讀了將httpcontext中的所需屬性傳遞給異步方法的其他建議,但在這些情況下,我不控制異步過程。

回答

0

這樣做:使用中間件。我不確定下面的代碼是否100%好。但是你可以看到它是如何完成的。

啓動類:

public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseTenantResolver(); 
} 



using Microsoft.AspNet.Builder; 

namespace Multitenant 
{ 
    public static class TenantResolverMiddlewareAppBuilderExtensions 
    { 
     public static void UseTenantResolver(this IApplicationBuilder builder) 
     { 
      builder.UseMiddleware<TenantResolverMiddleware>(); 
     } 
    } 
} 


namespace Multitenant 
{ 
public class TenantResolverMiddleware 
{ 
    private readonly RequestDelegate _next; 
    private readonly ILogger _logger; 

    public TenantResolverMiddleware(RequestDelegate next, ILoggerFactory loggerFactory) 
    { 
     _next = next; 
     _logger = loggerFactory.CreateLogger<TenantResolverMiddleware>(); 
    } 

    public async Task Invoke(HttpContext context) 
    { 
     using (_logger.BeginScope("TenantResolverMiddleware")) 
     { 
      var tenant = new Tenant 
      { 
       Id = "tenant1" // todo: determine this based on HttpContext etc. 
      }; 

      _logger.LogInformation(string.Format("Resolved tenant. Current tenant: {0}", tenant.Id)); 

      var tenantFeature = new TenantFeature(tenant); 
      context.Features.Set<ITenantFeature>(tenantFeature); 

      await _next(context); 
     } 
    } 
} 
}