简单的注入器注册ASP.NET身份& Web API

时间:2015-11-20 02:55:01

标签: c# asp.net-web-api asp.net-identity owin simple-injector

与Simple Injector放在一起时,对Asp .net和Identity的使用存在一些混淆。有一些关于OWIN如何反模式以及asp .net基本模板有多糟糕的文章!!

无论如何,我理解的最后一个问题是确保在生成用户身份令牌时遵守OWIN请求管道时注入正确的依赖关系。

我可能还不熟悉Simple Injector或OWIN,但我尝试通过覆盖简单的注入器注册来手动注册AccountController。

有人可以确认以下代码是否正确?我可以看到它在Visual Studio中使用Register和Login。我可以使用相同的过程获取令牌并对自己进行身份验证以进行不同的登录。但是在项目中使用之前要确定这是否正确。

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var container = new Container();
        container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
        container.Options.AllowOverridingRegistrations = true;
        ApplicationUserManager um = new ApplicationUserManager(
            new UserStore<ApplicationUser>(new ApplicationDbContext()));
        SecureDataFormat<AuthenticationTicket> sdt = 
            new SecureDataFormat<AuthenticationTicket>(
                new TicketSerializer(), 
                new DpapiDataProtectionProvider().Create("ASP.NET Identity"), 
                TextEncodings.Base64);
        container.Register<AccountController>(
            () => new AccountController(um, sdt), Lifestyle.Singleton);
        container.Options.AllowOverridingRegistrations = false;

        container.Verify();
        app.Use(async (context, next) =>
        {
            using (container.BeginExecutionContextScope())
            {
                await next();
            }
        });
        GlobalConfiguration.Configuration.DependencyResolver =
            new SimpleInjectorWebApiDependencyResolver(container);
        ConfigureAuth(app);
    }

1 个答案:

答案 0 :(得分:1)

我看到一个错误,那就是您的ApplicationDbContextAccountController都变成了单身人士。这可能是您在开发过程中不会注意到的,但这会导致生产中出现问题。当您在新请求上重用相同的控制器实例时,MVC将抛出异常,DbContext中的数据将很快变得陈旧,DbContext不是线程安全的。相反,您可以执行以下操作:

var sdt = new SecureDataFormat<AuthenticationTicket>(
    new TicketSerializer(), 
    new DpapiDataProtectionProvider().Create("ASP.NET Identity"), 
    TextEncodings.Base64);

container.Options.AllowOverridingRegistrations = true;

container.Register<AccountController>(() => 
    new AccountController(
        new ApplicationUserManager(
            new UserStore<ApplicationUser>(new ApplicationDbContext())), 
        sdt),
    Lifestyle.Scoped);

container.Options.AllowOverridingRegistrations = false;