在Asp.Net Identity UserManager上覆盖IsLockedOutAsync

时间:2015-11-02 03:03:06

标签: asp.net-mvc asp.net-identity

我需要在我的Asp.Net Identity UserManager上覆盖IsLockedOutAsync。我正在构建一个多租户应用程序,通过使用请求URL [tenant] .myapp.com来识别租户。用户是否被锁定的逻辑需要知道租户是谁。

问题是,使用覆盖IsLockedOutAsync方法(以及任何UserManager或SignInManager覆盖)异步,我发现我无法访问到HttpContext.Current - 它返回null。当然,这对我的申请来说是灾难性的!没有http上下文意味着没有网址,这意味着无法识别租户。

在覆盖这些异步方法时,有人可以建议我如何解决租户问题吗?在进行异步之前,我已经阅读了将所需属性从httpcontext传递到异步方法的其他建议,但在这些情况下,我无法控制异步过程。

1 个答案:

答案 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);
        }
    }
}
}
相关问题