在MVC5架构建议中使用Identity 2.0.0

时间:2014-05-13 23:16:38

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

我正在尝试将最近发布的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插入此一个程序集即可。我的应用程序可以参考这个。然而,这与图层相反。但它封装了安全性。鉴于安全对象可以(或应该)在整个应用程序生命周期中驻留,这看起来根本不是一个坏主意。但是没有想过可扩展性。

1 个答案:

答案 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)))
    {

    }

我希望这可以帮到你!