Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using MVC 4 SimpleMembership with an existing database-first EF model

I am trying to use SimpleMembership in my MVC 4 for the first time and I already have an existing database and EF5 model created based on it! I searched a lot but I cant find how I could use it in my case and also to have everything under my own model.

It would be great if somebody can give me an idea how to do this.

Thanks

like image 360
Amin Avatar asked Feb 27 '13 12:02

Amin


People also ask

How do you update the model when using database first approach?

Right-click anywhere on the design surface, and select Update Model from Database. In the Update Wizard, select the Refresh tab and then select Tables > dbo > Student. Click Finish. After the update process is finished, the database diagram includes the new MiddleName property.

What is DB first approach in MVC?

The Database First Approach provides an alternative to the Code First and Model First approaches to the Entity Data Model. It creates model codes (classes, properties, DbContext etc.) from the database in the project and those classes become the link between the database and controller.


2 Answers

Purely as a point of reference, it might be a good idea to create a new Internet Application template of an ASP.NET MVC 4 Web Application project (i.e. via File > New Project).

If you look at the AccountController, as @zms6445 says, it is decorated with an InitializeSimpleMembership attribute. You can find the implementation of this attribute in the InitializeSimpleMembershipAttribute.cs file in the Filters folder within the root directory.

In here, this is the missing part of the puzzle - you need to hook up your existing database so that it is used by the SimpleMembershipProvider. This is the code you need:

private class SimpleMembershipInitializer
{
    public SimpleMembershipInitializer()
    {
        try
        {
            if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("CONNECTION_STRING_NAME", "USER_TABLE", "USER_ID_FIELD", "USER_NAME_FIELD", autoCreateTables: true);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("Something is wrong", ex);
        }
    }
}

Some things to note:

  1. CONNECTION_STRING_NAME is an entry in your web.config ConnectionStrings - you CANNOT use the model connection string here - the SimpleMembershipProvider does not recognise that format! You need to specify an System.Data.SqlClient connection string, e.g.

    <add name="CONNECTION_STRING_NAME" connectionString="data source=SERVER;initial catalog=DATABASE;user id=USER;password=PASSWORD;" providerName="System.Data.SqlClient" />

  2. USER_TABLE is the table in your database to hold extra user information, such as first name, surname etc. This is linked to the autogenerated tables via the USER_ID_FIELD.

  3. USER_ID_FIELD is usually the primary key of your Users table. It must be of type int.

  4. USER_ID_NAME is a unique name for the user, which could be an Email address.

  5. autoCreateTables is set to true to ensure the tables required for the SimpleMembership to work are created if they don't already exist.

Of course, this code only gets fired if you hit a page via the AccountController, since this has been decorated by the attribute. You could put a breakpoint in there and see it in action.

This should get you started - the Internet Application template is a pretty good template to follow if you get stuck.

Hope this helps.

like image 63
Alistair Findlay Avatar answered Oct 09 '22 18:10

Alistair Findlay


In your web.config in the appSettings tag, add the line

<add key="enableSimpleMembership" value="true"/>

SimpleMembership is built in so from here you simply need to write

[InitializeSimpleMembership]

above your public class AccountController: Controller

When you want to force a user to log in for a certain page you write in the pages controller

[Authorize]

That tables will be automatically generated in your database. If you want to add more fields to these tables you will need to simply google it.

Here's a link for more information http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

like image 28
zms6445 Avatar answered Oct 09 '22 20:10

zms6445