Search code examples
asp.net-mvc-4simplemembership

MVC4 simplemembership not working after publish


I have the following problem with using MVC4 SimpleMembership: Register and Login methods work fine in local debugg mode, but after publish they crash the site. The cause from what i saw is that for example when i register an user the information is stored in my UserProfile table but nothing in webpages_Membership table. So it would appear that the WebSecurity can't access for some reason the webpages_Membership table.

I configured a basic MVC4 project to use SimpleMembership by enabling it in my WebConfig file like this:

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

Added my connectionstring:

<add name="RMBase" providerName="System.Data.SqlClient" connectionString="Data Source=SQL5003.Smarterasp.net;Initial Catalog=DB_9C0558_test;User Id=DB_9C0558_test_admin;Password=*****" />

Initialised the connection in Global.asax: AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        WebSecurityConfig.InitializeDatabase();

And in my App_Start folder i added the class for WebSecurityConfig

 public static void InitializeDatabase()
    {
        WebSecurity.InitializeDatabaseConnection("RMBase", "UserProfile", "UserID", "UserName", true);

    }

Added my DBContext class

public class RMDatabase : DbContext
{
    public RMDatabase() : base("RMBase") { }
}

And my Login/Register methods look like this:

  [HttpGet]
    public ActionResult Login()
    {
        return View(new Authentication());
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(Authentication model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        if (WebSecurity.Login(model.Username, model.Password))
        {
            return RedirectToAction("Index","Home");
        }
        else
        {
            ViewBag.ErrorMessage = "incorect";
            return View(model);
        }

    }

    [HttpGet]
    public ActionResult Register()
    {
        return View(new Registration());
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Register(Registration model)
    {
        if (ModelState.IsValid)
        {
            if (!WebSecurity.UserExists(model.Username))
            {
                WebSecurity.CreateUserAndAccount(model.Username, model.Password);
                WebSecurity.Login(model.Username, model.Password);
                return RedirectToAction("Index","Home");
            }
            ViewBag.ErrorMessage = "incorect";
        }
        return View(model);
    }

Anyone see something that i did wrong that may be the cause of this?


Solution

  • Install Elmah.MVC, then in the Application_Error event in Global.asax, add

    var exception = Server.GetLastError();
    Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
    

    Then, on the site, navigate to /elmah, which should now have the exception logged for you.