feat: Integrate ASP.NET Core Identity for user authentication
This commit integrates ASP.NET Core Identity into the application to enable user registration, login, and management. This lays the groundwork for securing data per user.
**Key Changes:**
*   **DbContext Configuration:**
    *   Modified `ApplicationDbContext.cs` to inherit from `IdentityDbContext<IdentityUser>`.
    *   Removed an unnecessary `using` statement from `ApplicationDbContext.cs`.
*   **Program.cs Setup:**
    *   Configured `AddDefaultIdentity<IdentityUser>` with `AddEntityFrameworkStores<ApplicationDbContext>()` to register Identity services.
    *   Ensured correct ordering of `UseAuthentication()` and `UseAuthorization()` middleware.
    *   Added `app.MapRazorPages()` to enable the Identity UI pages.
    *   Verified core package versions in `turf_tasker.csproj` for consistency across EF Core and Identity components (`8.0.6`).
*   **Identity UI:**
    *   Scaffolded ASP.NET Core Identity pages (Login, Register, Manage, etc.) to provide the user interface for authentication.
    *   Added a `_LoginPartial.cshtml` partial view to the `Views/Shared` folder.
    *   Rendered `_LoginPartial` in `Views/Shared/_Layout.cshtml` to display login/register/logout links in the navigation bar.
*   **Migrations:**
    *   Created and applied a new migration (`AddIdentitySchema`) to create the necessary ASP.NET Core Identity database tables (e.g., `AspNetUsers`, `AspNetRoles`).
			
			
This commit is contained in:
		
							parent
							
								
									60567d7969
								
							
						
					
					
						commit
						b24beb3154
					
				
					 79 changed files with 5246 additions and 12 deletions
				
			
		
							
								
								
									
										222
									
								
								Migrations/20250621230711_AddIdentitySchema.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								Migrations/20250621230711_AddIdentitySchema.cs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,222 @@ | |||
| using System; | ||||
| using Microsoft.EntityFrameworkCore.Migrations; | ||||
| 
 | ||||
| #nullable disable | ||||
| 
 | ||||
| namespace turf_tasker.Migrations | ||||
| { | ||||
|     /// <inheritdoc /> | ||||
|     public partial class AddIdentitySchema : Migration | ||||
|     { | ||||
|         /// <inheritdoc /> | ||||
|         protected override void Up(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetRoles", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     Name = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     NormalizedName = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     ConcurrencyStamp = table.Column<string>(type: "TEXT", nullable: true) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetRoles", x => x.Id); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetUsers", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     UserName = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     NormalizedUserName = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     Email = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     NormalizedEmail = table.Column<string>(type: "TEXT", maxLength: 256, nullable: true), | ||||
|                     EmailConfirmed = table.Column<bool>(type: "INTEGER", nullable: false), | ||||
|                     PasswordHash = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     SecurityStamp = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     ConcurrencyStamp = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     PhoneNumber = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     PhoneNumberConfirmed = table.Column<bool>(type: "INTEGER", nullable: false), | ||||
|                     TwoFactorEnabled = table.Column<bool>(type: "INTEGER", nullable: false), | ||||
|                     LockoutEnd = table.Column<DateTimeOffset>(type: "TEXT", nullable: true), | ||||
|                     LockoutEnabled = table.Column<bool>(type: "INTEGER", nullable: false), | ||||
|                     AccessFailedCount = table.Column<int>(type: "INTEGER", nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetUsers", x => x.Id); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetRoleClaims", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(type: "INTEGER", nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     RoleId = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     ClaimType = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     ClaimValue = table.Column<string>(type: "TEXT", nullable: true) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", | ||||
|                         column: x => x.RoleId, | ||||
|                         principalTable: "AspNetRoles", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetUserClaims", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     Id = table.Column<int>(type: "INTEGER", nullable: false) | ||||
|                         .Annotation("Sqlite:Autoincrement", true), | ||||
|                     UserId = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     ClaimType = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     ClaimValue = table.Column<string>(type: "TEXT", nullable: true) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetUserClaims_AspNetUsers_UserId", | ||||
|                         column: x => x.UserId, | ||||
|                         principalTable: "AspNetUsers", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetUserLogins", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     LoginProvider = table.Column<string>(type: "TEXT", maxLength: 128, nullable: false), | ||||
|                     ProviderKey = table.Column<string>(type: "TEXT", maxLength: 128, nullable: false), | ||||
|                     ProviderDisplayName = table.Column<string>(type: "TEXT", nullable: true), | ||||
|                     UserId = table.Column<string>(type: "TEXT", nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetUserLogins_AspNetUsers_UserId", | ||||
|                         column: x => x.UserId, | ||||
|                         principalTable: "AspNetUsers", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetUserRoles", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     UserId = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     RoleId = table.Column<string>(type: "TEXT", nullable: false) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetUserRoles_AspNetRoles_RoleId", | ||||
|                         column: x => x.RoleId, | ||||
|                         principalTable: "AspNetRoles", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetUserRoles_AspNetUsers_UserId", | ||||
|                         column: x => x.UserId, | ||||
|                         principalTable: "AspNetUsers", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateTable( | ||||
|                 name: "AspNetUserTokens", | ||||
|                 columns: table => new | ||||
|                 { | ||||
|                     UserId = table.Column<string>(type: "TEXT", nullable: false), | ||||
|                     LoginProvider = table.Column<string>(type: "TEXT", maxLength: 128, nullable: false), | ||||
|                     Name = table.Column<string>(type: "TEXT", maxLength: 128, nullable: false), | ||||
|                     Value = table.Column<string>(type: "TEXT", nullable: true) | ||||
|                 }, | ||||
|                 constraints: table => | ||||
|                 { | ||||
|                     table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); | ||||
|                     table.ForeignKey( | ||||
|                         name: "FK_AspNetUserTokens_AspNetUsers_UserId", | ||||
|                         column: x => x.UserId, | ||||
|                         principalTable: "AspNetUsers", | ||||
|                         principalColumn: "Id", | ||||
|                         onDelete: ReferentialAction.Cascade); | ||||
|                 }); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AspNetRoleClaims_RoleId", | ||||
|                 table: "AspNetRoleClaims", | ||||
|                 column: "RoleId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "RoleNameIndex", | ||||
|                 table: "AspNetRoles", | ||||
|                 column: "NormalizedName", | ||||
|                 unique: true); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AspNetUserClaims_UserId", | ||||
|                 table: "AspNetUserClaims", | ||||
|                 column: "UserId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AspNetUserLogins_UserId", | ||||
|                 table: "AspNetUserLogins", | ||||
|                 column: "UserId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "IX_AspNetUserRoles_RoleId", | ||||
|                 table: "AspNetUserRoles", | ||||
|                 column: "RoleId"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "EmailIndex", | ||||
|                 table: "AspNetUsers", | ||||
|                 column: "NormalizedEmail"); | ||||
| 
 | ||||
|             migrationBuilder.CreateIndex( | ||||
|                 name: "UserNameIndex", | ||||
|                 table: "AspNetUsers", | ||||
|                 column: "NormalizedUserName", | ||||
|                 unique: true); | ||||
|         } | ||||
| 
 | ||||
|         /// <inheritdoc /> | ||||
|         protected override void Down(MigrationBuilder migrationBuilder) | ||||
|         { | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetRoleClaims"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetUserClaims"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetUserLogins"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetUserRoles"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetUserTokens"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetRoles"); | ||||
| 
 | ||||
|             migrationBuilder.DropTable( | ||||
|                 name: "AspNetUsers"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Blake Ridgway
						Blake Ridgway