C# 使用ASP.NET Webforms、OWIN和ASP.NET Identity了解Autofac中间件的使用

C# 使用ASP.NET Webforms、OWIN和ASP.NET Identity了解Autofac中间件的使用,c#,webforms,owin,autofac,asp.net-identity-2,C#,Webforms,Owin,Autofac,Asp.net Identity 2,我目前正在更新一个使用MembershipProvider和RoleProvider的旧ASP.NET Webforms应用程序,以使用较新的ASP.NET标识类。此外,我使用Autofac进行依赖项注入,为了保持一致性,我希望能够将其用于新的标识类 ASP.NET Identity现在依赖于OWIN中间件,通过添加以下Startup.cs类,我已成功地将OWIN中间件设置合并到我的应用程序中: internal partial class Startup { public void C

我目前正在更新一个使用MembershipProvider和RoleProvider的旧ASP.NET Webforms应用程序,以使用较新的ASP.NET标识类。此外,我使用Autofac进行依赖项注入,为了保持一致性,我希望能够将其用于新的标识类

ASP.NET Identity现在依赖于OWIN中间件,通过添加以下Startup.cs类,我已成功地将OWIN中间件设置合并到我的应用程序中:

internal partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var builder = new ContainerBuilder();

        AutofacConfig.RegisterTypes(builder);
        AutofacConfig.RegisterIdentityTypes(builder, app);

        var container = builder.Build();
        Global.SetContainer(container);

        app.UseAutofacMiddleware(container);

        ConfigureAuth(app);
    }
}
我向Autofac注册标识类,如下所示:

internal static class AutofacConfig
{      
    public static void RegisterIdentityTypes(ContainerBuilder builder, IAppBuilder app)
    {
        builder.RegisterType<ApplicationUserStore>().As<IUserStore<ApplicationUser>>().InstancePerRequest();
        builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest();
        builder.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest();
        builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest();
        builder.Register(c => app.GetDataProtectionProvider()).InstancePerRequest();
    }
}
所以一切似乎都很好,但我觉得有些地方不对劲,我不知道OWIN和Autofac在哪里连接,甚至不需要。如果我从Startup.cs中删除下面的行,则向火中添加燃料

    app.UseAutofacMiddleware(container);
…一切都正常工作!这不可能是对的,不是吗

MVC的许多示例似乎表明这是获取标识对象的正确方法(通过GetOwinContext()调用):

有人能给我指出正确的方向吗?

对于一个简单的场景,app.useAutofactMiddleware(容器);将处理向OWIN请求范围添加Autofac生存期以及向管道中添加使用Autofac注册的中间件

请参阅以确认

基本上,如果您要将Autofac中的任何东西注入OWIN管道(即中间件),您需要这条线路。但对于您的场景,看起来您并没有做任何类似的事情,因此删除该行不会对您造成任何影响

至于从OWIN管道解析对象,您实际上不需要这样做——您已经从Autofac解析了对象。但是,
SecurityStampValidator
仍然从OWIN解析
ApplicationUserManager
,因此您仍然需要向OWIN注册它:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

app.CreatePerOwinContext(()=>DependencyResolver.Current.GetService,以了解其背后的原因。

好的,这对我来说是有意义的。然后,我应该做的是检查我的OWIN中间件语言模块是否带有app.UseAutofacMiddleware()调用。它使用OWIN中间件层和Autofac根据站点所需的语言切换线程区域性。如果没有这一行,我应该会看到它失败。今晚我将进行测试!感谢您的澄清。只是我之前的评论。因此我注释掉了这一行,我的中间件仍然可以正常工作。但是我现在取消了rstand因为我在Autofac中使用WebForms,并且在我的Global.asax.cs文件中实现了IContainerProviderAccessor,所以在我的中间件中,我访问Autofac的BeginLifetimeScope()方法(通过我的Global.asax.cs类)来解析我的DI对象。因此,我不需要应用程序。UseAutofaciduler()打电话。@Gareth,这很有道理。好东西,你已经打到底了!
    app.UseAutofacMiddleware(container);
    protected void SignInClick(object sender, EventArgs e)
    {
        var signInManager = this.Context.GetOwinContext().GetUserManager<ApplicationSignInManager>();

        // Validate the user password
        var result = signInManager.PasswordSignIn(
            this.email.Text,
            this.password.Text,
            this.remember.Checked,
            true);

        ....
    }
 app.UseAutofacMiddleware(container);
app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());