ASp.net identity 2.0 samples - 控制器构造函数,DB构造函数和Owin中间件的重用

时间:2014-05-15 17:31:39

标签: asp.net-mvc-5 asp.net-identity

我已从此处引用的链接安装了asp.net identity 2.0示例:

http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

并对样本和最佳实践提出一些具体问题。我意识到样本是测试版,所以这可以解释我的一些问题\问题。

1)为什么大多数控制器构造器例如AccountController在其构造函数中获取UserManager类的实例。没有我可以看到的DI,控制器也有一个UserManager类型的公共属性,它从Owin Context获得一个缓存的实例。这只是(坏)脚手架的产品)还是我错过了一些微妙的DI?

2)我希望使用其他特定于应用程序的数据来扩充ApplicationUser和ApplicationDBContext。要获取当前ApplicationDBContext类的副本,看起来我必须获取当前的Owin上下文,然后从中获取ApplicationDBContext的副本。它是否正确?我正在考虑使用ApplicationDBContext属性和UserManager属性创建基本控制器类,这些属性遵循AccountController中演示的模式,然后从中继承需要这些属性的控制器。

3)隐含的假设是每个HTTP请求都需要一个有效的applicationdbcontext吗?这不是浪费吗?

4)最后,我希望添加一个ApprovedByAdmin属性,该属性仅允许用户登录,如果他们的注册已被管理员批准。我设想将此添加到applicationuser。根据Login方法的示例,通过UserManager类对各种属性进行检查,例如:

UserManager.IsLockedOutAsync(user.Id))
UserManager.CheckPasswordAsync(user, password))

我不确定为什么每个都是作为单独的异步调用完成的,但由于我无法修改UserManager,我是否必须执行以下操作:

var user = await UserManager.FindByNameAsync(userName);

if(!user.ApprovedByAdmin)
{
    ....
}

我认为这就是我现在的所有问题!

1 个答案:

答案 0 :(得分:2)

  1. AccountControllers使UserManagers具有可测试性,如果需要,可以轻松进行DI
  2. 是的,您应该从OwinContext获取ApplicationDbContext,每个请求应该只有一个DbContext。
  3. 默认情况下,cookiemiddleware需要有一个db上下文来验证身份cookie是否有效,所以需要它。除非直到实际使用了访问数据库的方法,否则创建db上下文不会增加很多开销。
  4. 你在用户身上做的事情很好。通常,您可以使用ApplicationUserManager扩展UserManager,但是如果您希望在不更改应用程序代码的情况下更换UserStores,则只需要这样做。通常,这只会影响使用poco类上的导航属性编写LINQ查询,这些属性依赖于EF特定的延迟加载功能。