加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC5架构中的Identity 2.0.0建议

发布时间:2020-12-16 09:54:18 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试将最近发布的ASP.NET Identity 2.0.0集成到3层MVC应用程序中.我不确定我是朝着正确的方向前进的.我可以看到两种方法. 在第一种方法中,我已经将Identity集成到每个逻辑层.有一些技术问题整合但仍在发展中. 在第二种方法中,使用专用于安全性的独立封
我正在尝试将最近发布的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,并且没有“真正的”数据库代码,因为它属于数据层.

Side-issue:我有点不舒服,在Web / App_Start / Startup.Auth中,我必须实例化Busness Logic对象才能调用

app.CreatePerOwinContext(ApplicationDbContext.Create);

在数据层中.我还没有考虑过这个问题.这是另一个问题(但我发现它与我选择的架构有关).

方法2

创建一个纯粹用于不包含层的安全性的程序集,即只需将Identity 2.0.0插入这个程序集即可.我的应用程序可以参考这个.然而,这与图层相反.但它封装了安全性.鉴于安全对象可以(或应该)在整个应用程序生命周期中驻留,这看起来根本不是一个坏主意.但是没有考虑过可扩展性.

解决方法

我已经采用方法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)))
    {

    }

我希望这可以帮助你!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读