我需要在我的Asp.Net Identity UserManager上覆盖IsLockedOutAsync。我正在构建一个多租户应用程序,通过使用请求URL [tenant] .myapp.com来识别租户。用户是否被锁定的逻辑需要知道租户是谁。
问题是,使用覆盖IsLockedOutAsync方法(以及任何UserManager或SignInManager覆盖)异步,我发现我无法访问到HttpContext.Current - 它返回null。当然,这对我的申请来说是灾难性的!没有http上下文意味着没有网址,这意味着无法识别租户。
在覆盖这些异步方法时,有人可以建议我如何解决租户问题吗?在进行异步之前,我已经阅读了将所需属性从httpcontext传递到异步方法的其他建议,但在这些情况下,我无法控制异步过程。
答案 0 :(得分: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);
}
}
}
}