【问题标题】:MVC3: EF Code First and authenticationMVC3:EF 代码优先和身份验证
【发布时间】:2012-05-08 21:48:24
【问题描述】:

我正在 SQLExpress DB 上构建 MVC3 EF Code First 应用程序。对我来说非常重要的是,每当架构更改或类似情况时,数据库都会自动生成。现在我正在向我的应用程序添加身份验证,并查看了 MVC 附带的身份验证框架。但是,看起来每次生成新数据库时都需要我运行 aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一数据库中。

我基本上想知道我的选择是什么;

  • 是否可以使用身份验证框架并以与实体框架生成我的其他数据相同的方式自动生成它?
  • 如果不是,我可以编写自己的身份验证,但是还有可以使用的部件吗?换句话说,我是否需要编写自定义会员提供程序或类似的东西?我想继续使用 [authenticate] 等属性。

我可以在正确的方向上使用一些指针。

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework authentication code-first


    【解决方案1】:

    您可以覆盖 DbMigrationsConfiguration 的种子方法或创建迁移。

    然后您应该能够执行可以从 aspnet_regsql.exe 生成的 SQL 或在您有权限的情况下执行 aspnet_regsql.exe。

    更新 1:

    我最终做了如下:

    Add-Migration AspNetRegSql
    
    public partial class AspNetRegSql : DbMigration
    {
        public override void Up()
        {
            Migrate(false);
        }
    
        public override void Down()
        {
            Migrate(true);
        }
    
        private static void Migrate(bool down)
        {
            var action = down ? "R" : "A";
            var connectionstring = ConfigurationManager.ConnectionStrings["DataContext"];
            var arguments = string.Format(@"-Q -C ""{0}"" -{1} mrp", connectionstring, action);
    
            var processStartInfo = new ProcessStartInfo
            {
                WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", string.Empty),
                FileName = "aspnet_regsql.exe",
                Arguments = arguments,
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden
            };
    
            using (var process = Process.Start(processStartInfo))
            {
                process.WaitForExit();
            }
        }
    }
    

    然后将“aspnet_regsql.exe”添加到我的项目中,并将构建操作更改为“如果较新则复制”。

    更新 2:

    我不知道 NSGaga 发布的库 - 我没有看过它,但建议你也考虑一下。

    更新 3:

    一些有用的链接:

    【讨论】:

    • 看起来也不错 - 也许这只是放在“种子”中更好,即第一次创建数据库时(或迁移必须是初始数据库) - 并且因为可能的权限问题(我没有尝试过,但对于例如运行自定义批处理文件来说似乎是一个非常好的场景,并且更通用) - 即从种子控制它更容易 - 比从例如PM 控制台,因为这通常是从 PM 启动的(坦率地说,我不知道在某些情况下会如何实现 - 尽管可能应该工作 - 我通常以管理员身份运行 VS,因此可能不会看到任何问题)。
    【解决方案2】:

    您可以从 CodeFirst Membership Provider 开始 - 这是一个基于代码的自定义提供程序 - 并在需要时对其进行扩展(也可以通读网站上的推荐用法)。

    以上是 IMO 最好的方法,因为您可以真正整合两者(例如,如果您可能需要直接访问会员表,与您自己的用户/客户表相关等)。

    但你也有其他选择......

    a) 编写自己的 Db 初始化程序并为数据库播种(就像这里建议的 https://stackoverflow.com/a/5462981/417747。注意:您可以使用不同的方法,从运行 aspnet 表 SQL 脚本到为 aspnet 表创建模型等)或

    b) 使用“保留”数据库的 Db 初始化程序 - 并首先使用 aspnet 表准备数据库

    c)(最后但并非最不重要)使用迁移(正如@Chris 正确建议的那样)。迁移非常强大。您可以运行Update-Database -Script 来生成 SQL 而不是更改数据库 - 然后将其组合(与 aspnet 脚本或种子数据库)并使用它来创建或更新数据库。迁移需要一些学习,但对于任何更复杂的事情来说,再次付出努力都是值得的。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多