我正在尝试将最近发布的ASP.NET Identity 2.0.0集成到3层MVC应用程序中。我不确定我是朝着正确的方向前进的。我可以看到两种方法。
在第一种方法中,我已经将Identity集成到每个逻辑层。有一些技术问题整合但仍在发展。
在第二种方法中,使用专用于安全性的独立封装组件。
我现在已经采用了方法1,但质疑一切。还有其他任何方法吗?
方法1
Web
Startup.cs
/App_Start/Startup.Auth
/Controllers/Account
/Controllers/Manage
/Controllers/RolesAdmin
/Controllers/UserAdmin
/ViewModels
/Views
Business Logic
/Service/AccountService
/Service/ApplicationRoleManager
/Service/ApplicationUserManager
/Service/EmailService
/Service/SmsService
/Service/SignInHelper
Data
ApplicationDbContext
ApplicationUser
所以,我只是简单地使用了Identity并将其插入我认为合适的每一层。 我已将大部分日志放在业务逻辑层中,因为它不属于Web,并且没有“真正的”数据库代码,因为它属于数据层。
副问题:我有点不舒服,在Web / App_Start / Startup.Auth中,我必须实例化Busness Logic对象才能调用
app.CreatePerOwinContext(ApplicationDbContext.Create);
在数据层中。我还没有考虑过这个问题。这是另一个问题(但我发现它与我选择的架构有关)。
方法2
创建纯粹用于不包含层的安全性的程序集,即只需将Identity 2.0.0插入此一个程序集即可。我的应用程序可以参考这个。然而,这与图层相反。但它封装了安全性。鉴于安全对象可以(或应该)在整个应用程序生命周期中驻留,这看起来根本不是一个坏主意。但是没有想过可扩展性。
答案 0 :(得分:3)
我已经采用了方法1,并且在创建上下文时,我有一个帮助器类,我尝试从HttpContext.Current。[" DbActiveContext"]获取上下文并使用它,如果它存在,如果不存在然后创建一个新的,并为整个应用程序使用单个上下文。因此,您不会为aspnet标识创建一个上下文,而为应用程序的其余部分创建另一个上下文。看起来您尝试在第一种方法中使用存储库模式,如果是这种情况,那么您的标识模型应该在数据库层中,对于完整存储库模式,您应该在创建时使用依赖注入通过这样做,在运行时创建对象之前,您将不会有依赖关系。
namespace Data.Common
{
public class ConnectionHelper : IConnectionHelper
{
private ApplicationDbContext _context;
public ApplicationDbContext Context
{
get
{
if (_context == null && HttpContext.Current.Items["DbActiveContext"] != null)
{
_context = (ApplicationDbContext)HttpContext.Current.Items["DbActiveContext"];
}
else if (_context == null && HttpContext.Current.Items["DbActiveContext"] == null)
{
_context = new ApplicationDbContext();
HttpContext.Current.Items.Add("DbActiveContext", _context);
}
return _context;
}
set { _context = value; }
}
}
}
此外,如果您想在DI服务层中使用usermanager,您可以执行以下操作:
public UserController()
: this(
new ApplicationUserManager(new UserStore<ApplicationUser>(new ConnectionHelper().Context)),
new UserService())
{
}
使用UserService签名,如:
public class UserService
{
private readonly IRepository<ApplicationUser> _user;
private readonly UserManager<ApplicationUser> _userManager;
public UserService(IRepository<ApplicationUser> user,
UserManager<ApplicationUser> userManager)
{
_user = user;
_userManager = userManager;
}
public UserService()
: this(
new Repository<ApplicationUser>(new ConnectionHelper()),
new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ConnectionHelper().Context)))
{
}
我希望这可以帮到你!