是否有人成功地使用OWIN ASP.NET Identity附加IoC以与WebApi(或MVC)应用程序共享相同的DbContext?
我希望如果ASP.Net标识加载用户,它会加载到与应用程序其余部分相同的dbcontext中。
(使用AutoFac作为IoC - 但不介意其他容器的示例)
修改:
06 / Jan / 2014:为了更具体一点,当ASP.Net标识尝试使用DbContext时,它需要与应用程序的其余部分相同的DbContext 实例。否则,它将创建相同DbContext的两个实例。我已经在使用.PerHttpApiRequest()
扩展名了。
我发现的问题是,在设置OWIN类时,我无法找到方法: 1)将容器连接到OWIN管道; 2)告诉OWIN使用该容器解析它所需的类,以便它可以共享相同的范围(即OAUthServerOptions或任何其他可能包含其他依赖项的内容)
话虽如此,你如何设置解决上述两点的ASP.Net Identity?
答案 0 :(得分:3)
编辑:根据评论添加实例化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)
{
}
}
并在需要用户管理员的任何地方注入。
对于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()
};
}