MVC3: EF Code First 和身份验证

4
我正在构建一个基于MVC3 EF Code First的应用程序,使用的是SQLExpress数据库。对于我来说,每当架构发生变化或类似情况时,自动生成数据库非常重要。现在我正在为我的应用程序添加身份验证,并研究了随MVC一起提供的身份验证框架。但是,似乎需要每次生成新数据库时运行aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一数据库中。
我想知道我的选择有哪些;
- 是否可能使用身份验证框架,并像实体框架生成我的其他数据那样自动生成它? - 如果不行,我可以编写自己的身份验证,但仍然有哪些部分可以使用?换句话说,我是否需要编写自定义成员资格提供程序或任何类似的东西?我想继续使用[authenticate]等属性。 - 我需要指导方向。
2个回答

3
你可以覆盖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:

一些有用的链接:


看起来不错——也许最好将其放置在“Seed”中,即第一次创建数据库时(或迁移必须是初始迁移),因为可能存在权限问题(我没有尝试过,但似乎是一个非常好的场景)。例如运行自定义批处理文件等,更普遍的情况是从“Seed”更容易控制它,而不是例如从PM控制台控制,因为这通常是从PM内部启动的(老实说,我不知道在某些情况下会出现什么情况-虽然可能应该工作-我通常以管理员身份运行VS因此可能不会看到任何问题)。 - NSGaga-mostly-inactive

3
您可以从CodeFirst Membership Provider开始,这是一个基于Code First的自定义提供程序,并根据需要进行扩展(还可以通过网站上的推荐使用方式进行阅读)。
以上是我认为最好的方法,因为您可以真正地将两者集成在一起(例如,在您需要直接访问成员身份表时,与您自己的用户/客户端表相关联等)。
但是,您也有其他选项...
a)编写自己的Db初始化器并种植数据库(例如建议在https://dev59.com/ZG035IYBdhLWcg3wYO11#5462981中所建议的)。注意:您可以利用不同的方法,从运行aspnet表SQL脚本到为aspnet表创建模型等。
b)使用“保留”数据库的Db初始化器-并首先使用aspnet表准备数据库。
c) 最后一个建议是使用迁移(正如@Chris所建议的)。迁移非常强大。您可以运行Update-Database -Script生成SQL而不是更改数据库,然后将其与aspnet脚本或种子数据库结合使用,用于创建或更新数据库。迁移需要一些学习,但对于任何更复杂的内容都值得付出努力。
希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接