Introduction

Every real-world application needs:

Companies always ask this in interviews.

Students search this topic daily.

So this blog has high view potential.

What We Will Build

We will create:

This is beginner-friendly and easy to understand.

Step 1: Create Database

Open SQL Server and run:

CREATE DATABASE LoginMVCDB;

USE LoginMVCDB;

CREATE TABLE Users
(
    Id INT PRIMARY KEY IDENTITY(1,1),
    Username NVARCHAR(100),
    Email NVARCHAR(100),
    Password NVARCHAR(100)
);

Explanation

Note: For learning purposes only. In real projects, always hash passwords.

Step 2: Create ASP.NET MVC Project

Step 3: Add Connection String

Open Web.config and add the following:

<connectionStrings>
  <add name="dbcs"
       connectionString="Data Source=YOUR_SERVER;Initial Catalog=LoginMVCDB;Integrated Security=True"
       providerName="System.Data.SqlClient"/>
</connectionStrings>

Replace YOUR_SERVER with your SQL Server name.

Step 4: Create Model

Create User.cs inside the Models folder.

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

Why Model?

Model transfers data between:

Step 5: Create AccountController

Add namespaces:

using System.Configuration;
using System.Data.SqlClient;
using YourProjectName.Models;

Registration Feature

Registration GET Method

public ActionResult Register()
{
    return View();
}

This shows an empty registration form.

Registration POST Method

[HttpPost]
public ActionResult Register(User user)
{
    string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;

    using (SqlConnection con = new SqlConnection(cs))
    {
        string query = "INSERT INTO Users(Username,Email,Password) VALUES(@Username,@Email,@Password)";
        SqlCommand cmd = new SqlCommand(query, con);

        cmd.Parameters.AddWithValue("@Username", user.Username);
        cmd.Parameters.AddWithValue("@Email", user.Email);
        cmd.Parameters.AddWithValue("@Password", user.Password);

        con.Open();
        cmd.ExecuteNonQuery();
    }

    ViewBag.Message = "Registration Successful!";
    return View();
}

Explanation

Registration View

@model YourProjectName.Models.User

<h2>Register</h2>

@using (Html.BeginForm())
{
    <p>Username: @Html.TextBoxFor(m => m.Username)</p>
    <p>Email: @Html.TextBoxFor(m => m.Email)</p>
    <p>Password: @Html.PasswordFor(m => m.Password)</p>

    <input type="submit" value="Register" />
}

<p>@ViewBag.Message</p>

Login Feature

Login GET Method

public ActionResult Login()
{
    return View();
}

Login POST Method

[HttpPost]
public ActionResult Login(User user)
{
    string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;

    using (SqlConnection con = new SqlConnection(cs))
    {
        string query = "SELECT * FROM Users WHERE Email=@Email AND Password=@Password";
        SqlCommand cmd = new SqlCommand(query, con);

        cmd.Parameters.AddWithValue("@Email", user.Email);
        cmd.Parameters.AddWithValue("@Password", user.Password);

        con.Open();
        SqlDataReader dr = cmd.ExecuteReader();

        if (dr.Read())
        {
            Session["Username"] = dr["Username"].ToString();
            return RedirectToAction("Dashboard");
        }
        else
        {
            ViewBag.Message = "Invalid Email or Password";
        }
    }

    return View();
}

Explanation

Dashboard

public ActionResult Dashboard()
{
    if (Session["Username"] == null)
    {
        return RedirectToAction("Login");
    }

    return View();
}

Dashboard View

<h2>Welcome @Session["Username"]</h2>

<p>You have successfully logged in.</p>

@Html.ActionLink("Logout", "Logout")

Logout

public ActionResult Logout()
{
    Session.Clear();
    return RedirectToAction("Login");
}

Security Note

This example stores passwords directly.

In real applications:

Final Output

User flow:

You now have a complete working login and registration system.

Why This Blog Gets High Views

Conclusion

In this article, we learned: