Asp.net mvc 3 MVC3:EF代码优先和身份验证

Asp.net mvc 3 MVC3:EF代码优先和身份验证,asp.net-mvc-3,entity-framework,authentication,code-first,Asp.net Mvc 3,Entity Framework,Authentication,Code First,我正在SQLExpress数据库上构建一个MVC3 EF代码第一个应用程序。对我来说非常重要的是,每当模式改变或类似的事情发生时,数据库都会自动生成。现在,我将身份验证添加到我的应用程序中,并研究了MVC附带的身份验证框架。但是,似乎每次生成新数据库时都需要运行aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一个数据库中 我基本上想知道我的选择是什么 是否可以使用身份验证框架并以与实体框架生成其他数据相同的方式自动生成身份验证框架 如果没有,我可以编写自己的身

我正在SQLExpress数据库上构建一个MVC3 EF代码第一个应用程序。对我来说非常重要的是,每当模式改变或类似的事情发生时,数据库都会自动生成。现在,我将身份验证添加到我的应用程序中,并研究了MVC附带的身份验证框架。但是,似乎每次生成新数据库时都需要运行aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一个数据库中

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

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

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

您可以覆盖dbmigrations配置的seed方法或创建迁移

然后,如果您有权限,您应该能够执行从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:

一些有用的链接:

您可以先从一个基于代码的自定义提供者开始,然后根据需要扩展它(也可以在网站上阅读推荐的用法)

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

但你也有其他选择

a) 编写自己的Db初始值设定项并为数据库设置种子(如此处所建议的。注意:您可以使用不同的方法,从运行aspnet表格SQL脚本到为aspnet表格创建模型等)或

b) 使用“保留”数据库的Db初始值设定项,并首先使用aspnet表准备数据库

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


希望这有帮助

看起来也不错-也许这最好放在“种子”中,即在第一次创建数据库时(或者迁移必须是初始的)-并且由于可能的权限问题(我没有尝试过,但对于运行自定义批处理文件和更一般的情况来说,这似乎是一个非常好的方案)-也就是说,从Seed控制它比从PM控制台控制它更容易,因为这通常是通过PM启动的(坦白地说,我不知道在某些情况下会发生什么情况-虽然可能会发生工作-我通常以管理员身份运行VS,所以可能不会看到任何问题)。