问题在过滤器类中初始化SimpleMembership

时间:2013-07-21 18:57:04

标签: c# asp.net simplemembership

我正在尝试初始化属性类,但出于某种原因,我正在努力解决结果。

我在visual studio 2012中创建了MVC4“Basic”项目模板。我在项目中创建了名为Filters的文件夹,并创建了类InitializeSimpleMembership.cs。我有家庭控制器和相关的视图,最后我在家庭控制器类中调用[InitializeSimpleMembership]但没有结果。应用程序未生成必需的表。 (注意:我之前创建了数据库)

我正在尝试使用最少的代码初始化SimpleMemberShip,以便我可以理解并使其变得复杂。

在过滤器文件夹

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;

namespace SimpleLogin_System_04.Filters
 {
  public class InitializeSimpleMembership : ActionFilterAttribute
  {
    private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        { 
          try
            {                  
              WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
               throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, ex);
            }
        }
    }
  }
}

的HomeController

namespace SimpleLogin_System_04.Controllers
 {
[InitializeSimpleMembership]
public class HomeController : Controller
{    
    public ActionResult Index()
    {
        return View();
    }
}
}

Web.config;连接字符串

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=dd3;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\dd3.mdf" />
</connectionStrings>

2 个答案:

答案 0 :(得分:1)

我没有看到任何调用 SimpleMembershipInitializer 的构造函数的东西,它具有初始化数据库的代码。为什么不将该代码放在 InitializeSimpleMembership 的默认构造函数中。

我建议只将初始化放在Global.asax Application_Start 方法中,而不是使用过滤器类,因为您将它放在 HomeController 中。 MVC 4 Internet模板在 AccountController 上使用过滤器的原因仅在于使用安全性时延迟加载安全性。如果你总是希望它初始化,只需使用Global.asax。有关initialization of SimpleMembership in this article的详细说明。

答案 1 :(得分:0)

是的,我已经意识到我没有调用构造函数。我想继续使用过滤器命名空间,因为最终我将添加延迟加载。只是暂时试图将事物分解成最小的部分,这样我才能理解安全行为。

加上我错过了很少的实现......但是系统现在正在运行!在这里,我有办法解决问题。

过滤文件夹

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using SimpleLogin_System_04.Models;

namespace SimpleLogin_System_04.Filters
{
public class InitializeSimpleMembership : ActionFilterAttribute
{
    public InitializeSimpleMembership()
    {
        try
        {
            if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }
    }
}

}

webconfig

<connectionStrings>
  <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=DB4;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\DB4.mdf" />
</connectionStrings>

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
  </providers>
</membership>

<roleManager enabled="true">
  <providers>
    <add name="DefaultRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
  </providers>
</roleManager>

帐户控制器类

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller

和我在代码运行之前创建的数据库因为我不希望系统创建一个如果它找不到一个。虽然它是在简单的成员资格数据库连接初始化阶段创建表..