有没有人成功地将带有OWIN ASP.NET身份的IoC附加到与WebApi(或MVC)应用程序共享相同的DbContext?

我希望,如果ASP.Net身份加载用户,则它将在该应用程序其余部分中使用的dbcontext中加载。

(使用AutoFac作为IoC-但不介意使用其他容器作为示例)

编辑:
2014年6月6日:更具体一点,当ASP.Net身份尝试使用DbContext时,它必须与应用程序的其余部分使用相同的DbContext 实例。否则,它将创建相同DbContext的两个实例。我已经在使用.PerHttpApiRequest()扩展名了。

我发现的问题是,在设置OWIN类时,我找不到以下方法:
1)将容器连接到OWIN管道;
2)告诉OWIN使用该容器解析所需的类,以便它可以共享相同的作用域(即OAUthServerOptions或可能包含其他依赖项的任何其他对象)

话虽如此,如何设置ASP.Net Identity来解决上述两点?

最佳答案

编辑:添加了根据注释实例化OWIN管道。

由于ASP.NET Identity使用的IdentityDbContext继承自DbContext,因此您可以像这样简单地创建继承自IdentityDbContext的自己的实现。

public class ApplicationContext : IdentityDbContext<ApplicationUser>
{
     //additional DbSets
    public DbSet<OtherEntity> OtherEntities { get; set; }
}

public class ApplicationUser : IdentityUser
{
    //any custom properties you want for your user.
}

public class OtherEntity
{
    [Key]
    public int Id { get; set; }
}

现在,从统一的角度来看,就使用IoC而言,我像这样注册UserStore的实例
public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new InjectionConstructor(typeof(ApplicationContext)));
}

然后围绕用户管理器创建一个包装器
public class ApplicationUserManager : UserManager<ApplicationUser>
{
    public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
    {
    }
}

并在需要用户管理器的任何地方注入(inject)。

对于OWIN管道,您需要像这样通过容器实例化OAuthAuthorizationProvider。
container.RegisterType<IOAuthAuthorizationServerProvider, ApplicationOAuthProvider>(new InjectionConstructor("self", typeof(ApplicationUserManager)));

然后例如在WebApi中,您只需在启动时从容器中获取实例。
static Startup()
        {
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = (IOAuthAuthorizationServerProvider)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IOAuthAuthorizationServerProvider)),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(5),
                AllowInsecureHttp = true,
                RefreshTokenProvider = new SimpleRefreshTokenProvider()
            };
        }

10-07 19:24
查看更多