MVC3:EF Code First和身份验证

时间:2012-04-28 10:20:14

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

我正在SQLExpress数据库上构建MVC3 EF Code First应用程序。对我来说非常重要的是,只要架构发生变化或类似的情况,就会自动生成数据库。现在我正在为我的应用程序添加身份验证,并查看了MVC附带的身份验证框架。但是,因为它似乎需要我每次生成新数据库时运行aspnet_regsql.exe。我真的需要Authentication表与我的应用程序数据库在同一个数据库中。

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

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

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

2 个答案:

答案 0 :(得分: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”添加到我的项目中,并将构建操作更改为“Copy if newer”。

更新2:

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

更新3:

一些有用的链接:

答案 1 :(得分:3)

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

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

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

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

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

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

希望这会有所帮助