我一直在研究新版本ASP的新功能.NET Identity 2.1及其增强功能之一是集成到OWIN中间件中的新IoC功能.

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

这句话接收一个函数委托,它返回示例中提供的manager实现的新实例:

 public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,
        IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 

我个人不喜欢这个实现,因为我无法使用容器为这些管理者注入任何依赖项.

此外,还有一个"IdentityFactoryOptions"和一个"IOwinContext",它们"神奇地"注入到函数中,我无法将其拉出到我的IoC容器中.

有谁对此实现有更好的解决方法吗?

推荐答案

我从开箱即用的MVC5安装开始,并将AutoFac用作IoC容器.听起来我想要达到和你类似的目标,所以让我解释一下我都做了些什么.作为免责声明,我对使用IOC和身份认同相当陌生.

如果您使用自己的IOC,我认为IOwinContext在IOC角色中是不必要的-我切换到使用AutoFac注册我的ApplicationUserManager.要做到这一点,我必须:

从启动中删除CreateWinContext行.验证,因为我将在AutoFac中注册ApplicationDbContextApplicationUserManager.

//app.CreatePerOwinContext(ApplicationDbContext.Create);
//app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

修改ApplicationUserManager构造函数参数,包括Create函数中的所有内容.

public ApplicationUserManager(IUserStore<ApplicationUser> store, IdentityFactoryOptions<ApplicationUserManager> options)
        : base(store)
{
    //all the code from the 'Create' function here, using `this` for `manager`
}

将AccountController设置为有一个以ApplicationUserManager为参数的构造函数,并放弃从OwinContext中获取ApplicationUserManagerUserManager属性.

private ApplicationUserManager _userManager; //every thing that needs the old UserManager property references this now
public AccountController(ApplicationUserManager userManager) 
{
    _userManager = userManager;
}

向AutoFac注册所有内容,包括IdentityFactoryOptions的实例.

var x = new ApplicationDbContext();
builder.Register<ApplicationDbContext>(c => x);
builder.Register<UserStore<ApplicationUser>>(c => new UserStore<ApplicationUser>(x)).AsImplementedInterfaces();
builder.Register<IdentityFactoryOptions<ApplicationUserManager>>(c => new IdentityFactoryOptions<ApplicationUserManager>()
{
    DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("ApplicationName")
});
builder.RegisterType<ApplicationUserManager>();

这是粗略的总结.我可能错过了一路上必须做的其他一些调整.

Asp.net相关问答推荐

是否可以发布 ASP.NET 5 应用程序以使目标机器不需要安装 DNX?

如何在 ASP.NET 中以 'YYYY-MM-DD' 格式获取当前日期?

系统日期时间?与 System.DateTime

如何将 JQuery 与母版页一起使用?

ASP MVC 授权除少数之外的所有操作

SignalR + Autofac + OWIN:为什么 GlobalHost.ConnectionManager.GetHubContext 不起作用?

ASP.NET Web 应用程序 (.NET Framework) 与 ASP.NET Core Web 应用程序 (.NET Framework) 之间的差异

如何防止 Azure 网站进入Hibernate 状态?

iframe.readyState 在 chrome 中不起作用

使用 JavaScript 更改 ASP.NET 标签的可见性

使用域用户的 SQL 连接字符串?

返回 IHttpActionResult vs IEnumerable vs IQueryable

为什么 Asp.Net Identity IdentityDbContext 是一个黑盒?

无法使用单例Microsoft.AspNetCore.Hosting.Internal.HostedServiceExecutor中的范围服务MyDbContext

显示单选按钮列表内联

在 JavaScript 中获取当前会话值?

在 ASP.NET 中使用 MasterPages 时使用 JQuery 的正确方法?

IIS 8.0 ASP.NET 和错误 500.19

盒式磁带包与 MVC4 包

如何在asp.net的GridView中按列名而不是按索引获取单元格值