ASP.net标识、IoC和共享DbContext



是否有人成功地将带有OWIN ASP.NET Identity的IoC附加为与WebApi(或MVC)应用程序共享相同的DbContext?

我希望如果ASP.Net标识加载用户,那么它将在与应用程序其余部分中使用的dbcontext中加载。

(使用AutoFac作为IoC,但不介意其他容器的例子)

编辑:2014年1月6日:更具体地说,当ASP.Net标识尝试使用DbContext时,它需要与应用程序的其他部分是相同的DbContext实例。否则,它将创建同一DbContext的两个实例。我已经在使用.PerHttpApiRequest()扩展。

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

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

EDIT:添加了根据注释实例化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()
};
}

相关内容

  • 没有找到相关文章

最新更新