From 9b29101c2d12185263815d6e0a50a183ff49e279 Mon Sep 17 00:00:00 2001 From: Dimitar Todorov <36155679+thermalthrottle@users.noreply.github.com> Date: Mon, 4 Apr 2022 22:48:32 +0300 Subject: [PATCH] Identity Rescafolding and DBContext changes --- RentACar/Data/Data/RentACarDbContext.cs | 78 ++++----- ....cs => 20220404172708_Changes.Designer.cs} | 110 ++++--------- ...Migration.cs => 20220404172708_Changes.cs} | 59 ++----- .../RentACarDbContextModelSnapshot.cs | 106 +++---------- RentACar/Data/Models/Rents.cs | 12 +- .../Areas/Identity/IdentityHostingStartup.cs | 1 + .../Pages/Account/AccessDenied.cshtml | 10 ++ .../Pages/Account/AccessDenied.cshtml.cs | 17 ++ .../Areas/Identity/Pages/Account/Login.cshtml | 6 +- .../Identity/Pages/Account/Login.cshtml.cs | 7 +- .../Identity/Pages/Account/Logout.cshtml.cs | 2 +- .../Account/Manage/ChangePassword.cshtml | 36 +++++ .../Account/Manage/ChangePassword.cshtml.cs | 101 ++++++++++++ .../Account/Manage/DeletePersonalData.cshtml | 33 ++++ .../Manage/DeletePersonalData.cshtml.cs | 84 ++++++++++ .../Manage/DownloadPersonalData.cshtml | 12 ++ .../Manage/DownloadPersonalData.cshtml.cs | 57 +++++++ .../Pages/Account/Manage/Email.cshtml | 43 +++++ .../Pages/Account/Manage/Email.cshtml.cs | 148 ++++++++++++++++++ .../Pages/Account/Manage/Index.cshtml | 30 ++++ .../Pages/Account/Manage/Index.cshtml.cs | 96 ++++++++++++ .../Pages/Account/Manage/ManageNavPages.cs | 50 ++++++ .../Pages/Account/Manage/PersonalData.cshtml | 27 ++++ .../Account/Manage/PersonalData.cshtml.cs | 34 ++++ .../Pages/Account/Manage/SetPassword.cshtml | 35 +++++ .../Account/Manage/SetPassword.cshtml.cs | 93 +++++++++++ .../Pages/Account/Manage/_Layout.cshtml | 29 ++++ .../Pages/Account/Manage/_ManageNav.cshtml | 15 ++ .../Account/Manage/_StatusMessage.cshtml | 10 ++ .../Pages/Account/Manage/_ViewImports.cshtml | 1 + .../Identity/Pages/Account/Register.cshtml | 30 ---- .../Identity/Pages/Account/Register.cshtml.cs | 58 +++---- .../Pages/Account/ResetPassword.cshtml | 37 +++++ .../Pages/Account/ResetPassword.cshtml.cs | 91 +++++++++++ .../Pages/Account/_StatusMessage.cshtml | 10 ++ .../Areas/Identity/Pages/_ViewImports.cshtml | 1 + .../Areas/Identity/Pages/_ViewStart.cshtml | 3 +- RentACar/WebApp/Controllers/CarsController.cs | 3 + RentACar/WebApp/Startup.cs | 6 +- RentACar/WebApp/WebApp.csproj | 8 +- ...osoft.AspNetCore.Cryptography.Internal.dll | Bin 41864 -> 41864 bytes ....AspNetCore.Cryptography.KeyDerivation.dll | Bin 21896 -> 22960 bytes ...spNetCore.Identity.EntityFrameworkCore.dll | Bin 97672 -> 97672 bytes ...rosoft.AspNetCore.Identity.UI.Views.V4.dll | Bin 367496 -> 367496 bytes .../Microsoft.AspNetCore.Identity.UI.dll | Bin 131464 -> 131464 bytes ...osoft.EntityFrameworkCore.Abstractions.dll | Bin 28552 -> 28552 bytes .../Microsoft.EntityFrameworkCore.Design.dll | Bin 301960 -> 301952 bytes ...crosoft.EntityFrameworkCore.Relational.dll | Bin 1257864 -> 1257856 bytes ...icrosoft.EntityFrameworkCore.SqlServer.dll | Bin 354176 -> 354184 bytes .../net5.0/Microsoft.EntityFrameworkCore.dll | Bin 1833864 -> 1833864 bytes ...soft.Extensions.FileProviders.Embedded.dll | Bin 31624 -> 31616 bytes .../Microsoft.Extensions.Identity.Core.dll | Bin 166792 -> 166784 bytes .../Microsoft.Extensions.Identity.Stores.dll | Bin 40824 -> 40832 bytes 53 files changed, 1250 insertions(+), 339 deletions(-) rename RentACar/Data/Migrations/{20220401141638_InitialMigration.Designer.cs => 20220404172708_Changes.Designer.cs} (83%) rename RentACar/Data/Migrations/{20220401141638_InitialMigration.cs => 20220404172708_Changes.cs} (85%) create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_Layout.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs create mode 100644 RentACar/WebApp/Areas/Identity/Pages/Account/_StatusMessage.cshtml diff --git a/RentACar/Data/Data/RentACarDbContext.cs b/RentACar/Data/Data/RentACarDbContext.cs index af66b2e..c6fec30 100644 --- a/RentACar/Data/Data/RentACarDbContext.cs +++ b/RentACar/Data/Data/RentACarDbContext.cs @@ -6,21 +6,14 @@ using Microsoft.EntityFrameworkCore; namespace Data { - public class RentACarDbContext : IdentityDbContext + public class RentACarDbContext : IdentityDbContext { public virtual DbSet Cars { get; set; } public virtual DbSet Rents { get; set; } - private UserManager userManager { get; set; } - private RoleManager roleManager { get; set; } - - public RentACarDbContext() - { - //TODO: initialize UserManager and RoleManager - } public RentACarDbContext(DbContextOptions dbContextOptions) : base(dbContextOptions) { - //TODO: initialize UserManager and RoleManager + } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) @@ -33,57 +26,48 @@ namespace Data protected override async void OnModelCreating(ModelBuilder modelBuilder) { + + base.OnModelCreating(modelBuilder); + + this.Database.EnsureCreated(); string[] roles = { "Admin", "Employee" }; foreach (string role in roles) { - if (!await roleManager.RoleExistsAsync(role)) + IdentityRole roleToCheck = await this.Roles.FirstOrDefaultAsync(roleToCheck => roleToCheck.Name == role); + if (roleToCheck == null) { - await roleManager.CreateAsync(new IdentityRole(role)); + //this.Roles.Add(new IdentityRole(role)); + modelBuilder.Entity().HasData(new IdentityRole(role)); } } - User initialUser = new User + PasswordHasher passwordHasher = new PasswordHasher(); + + User initialUser = new User(); + initialUser.Id = Guid.NewGuid().ToString(); + initialUser.UserName = "admin"; + initialUser.PasswordHash = passwordHasher.HashPassword(initialUser, "admin"); + + + if (this.Users.FirstOrDefaultAsync() != null) { - UserName = "admin", - PasswordHash = "admin", - }; - modelBuilder.Entity().HasData(initialUser); - await userManager.AddToRoleAsync(initialUser, roles[0]); + modelBuilder.Entity().HasData(initialUser); + IdentityRole adminRole = await this.Roles.FirstOrDefaultAsync(role => role.Name == "Admin"); + modelBuilder.Entity>().HasData(new IdentityUserRole {RoleId = adminRole.Id, UserId = initialUser.Id}); + } - //modelBuilder.Entity().HasData( - // new User - // { - // Username = "user", - // Password = "user", - // FirstName = "User", - // LastName = "User", - // PersonalNumber = "0987654321", - // PhoneNumber = "0882750588", - // Email = "user@gmail.org", - // Role = User.RoleEnum.User - // } - //); - //modelBuilder.Entity().HasData( - // new User - // { - // Username = "manager", - // Password = "manager", - // FirstName = "Manager", - // LastName = "Manager", - // PersonalNumber = "0987654321", - // PhoneNumber = "0882750588", - // Email = "manager@gmail.org", - // Role = User.RoleEnum.Manager - // } - //); - base.OnModelCreating(modelBuilder); - modelBuilder.Entity() - .HasIndex(user => new { user.UserName }) - .IsUnique(true); modelBuilder.Entity().HasOne(rents => rents.User); modelBuilder.Entity().HasOne(rents => rents.Car); + + modelBuilder.Entity().HasData(new Car() + { + Id = 1, + Brand = "Trabant" + }) ; + + this.SaveChanges(); } } diff --git a/RentACar/Data/Migrations/20220401141638_InitialMigration.Designer.cs b/RentACar/Data/Migrations/20220404172708_Changes.Designer.cs similarity index 83% rename from RentACar/Data/Migrations/20220401141638_InitialMigration.Designer.cs rename to RentACar/Data/Migrations/20220404172708_Changes.Designer.cs index 97721c1..6f6cc10 100644 --- a/RentACar/Data/Migrations/20220401141638_InitialMigration.Designer.cs +++ b/RentACar/Data/Migrations/20220404172708_Changes.Designer.cs @@ -10,15 +10,15 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Data.Migrations { [DbContext(typeof(RentACarDbContext))] - [Migration("20220401141638_InitialMigration")] - partial class InitialMigration + [Migration("20220404172708_Changes")] + partial class Changes { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.13") + .HasAnnotation("ProductVersion", "5.0.15") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Data.Entities.Car", b => @@ -58,7 +58,7 @@ namespace Data.Migrations .HasColumnType("int") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("CarId") + b.Property("CarId") .HasColumnType("int"); b.Property("EndDate") @@ -88,10 +88,12 @@ namespace Data.Migrations .HasColumnType("int"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("Email") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("EmailConfirmed") .HasColumnType("bit"); @@ -109,10 +111,12 @@ namespace Data.Migrations .HasColumnType("datetimeoffset"); b.Property("NormalizedEmail") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedUserName") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); @@ -133,15 +137,20 @@ namespace Data.Migrations .HasColumnType("bit"); b.Property("UserName") - .HasColumnType("nvarchar(450)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); - b.HasIndex("UserName") - .IsUnique() - .HasFilter("[UserName] IS NOT NULL"); + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); - b.ToTable("User"); + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => @@ -195,71 +204,6 @@ namespace Data.Migrations b.ToTable("AspNetRoleClaims"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers"); - }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.Property("Id") @@ -344,7 +288,9 @@ namespace Data.Migrations { b.HasOne("Data.Entities.Car", "Car") .WithMany() - .HasForeignKey("CarId"); + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.HasOne("Data.Entities.User", "User") .WithMany() @@ -366,7 +312,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -375,7 +321,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -390,7 +336,7 @@ namespace Data.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -399,7 +345,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) diff --git a/RentACar/Data/Migrations/20220401141638_InitialMigration.cs b/RentACar/Data/Migrations/20220404172708_Changes.cs similarity index 85% rename from RentACar/Data/Migrations/20220401141638_InitialMigration.cs rename to RentACar/Data/Migrations/20220404172708_Changes.cs index 27fc668..5097a69 100644 --- a/RentACar/Data/Migrations/20220401141638_InitialMigration.cs +++ b/RentACar/Data/Migrations/20220404172708_Changes.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace Data.Migrations { - public partial class InitialMigration : Migration + public partial class Changes : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -26,6 +26,9 @@ namespace Data.Migrations columns: table => new { Id = table.Column(type: "nvarchar(450)", nullable: false), + FirstName = table.Column(type: "nvarchar(max)", nullable: true), + LastName = table.Column(type: "nvarchar(max)", nullable: true), + PersonalNumber = table.Column(type: "nvarchar(max)", nullable: true), UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), @@ -64,34 +67,6 @@ namespace Data.Migrations table.PrimaryKey("PK_Cars", x => x.Id); }); - migrationBuilder.CreateTable( - name: "User", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: true), - LastName = table.Column(type: "nvarchar(max)", nullable: true), - PersonalNumber = table.Column(type: "nvarchar(max)", nullable: true), - UserName = table.Column(type: "nvarchar(450)", nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(max)", nullable: true), - Email = table.Column(type: "nvarchar(max)", nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(max)", nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_User", x => x.Id); - }); - migrationBuilder.CreateTable( name: "AspNetRoleClaims", columns: table => new @@ -204,7 +179,7 @@ namespace Data.Migrations { Id = table.Column(type: "int", nullable: false) .Annotation("SqlServer:Identity", "1, 1"), - CarId = table.Column(type: "int", nullable: true), + CarId = table.Column(type: "int", nullable: false), StartDate = table.Column(type: "datetime2", nullable: false), EndDate = table.Column(type: "datetime2", nullable: false), UserId = table.Column(type: "nvarchar(450)", nullable: true) @@ -212,18 +187,18 @@ namespace Data.Migrations constraints: table => { table.PrimaryKey("PK_Rents", x => x.Id); + table.ForeignKey( + name: "FK_Rents_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); table.ForeignKey( name: "FK_Rents_Cars_CarId", column: x => x.CarId, principalTable: "Cars", principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_Rents_User_UserId", - column: x => x.UserId, - principalTable: "User", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( @@ -274,13 +249,6 @@ namespace Data.Migrations name: "IX_Rents_UserId", table: "Rents", column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_User_UserName", - table: "User", - column: "UserName", - unique: true, - filter: "[UserName] IS NOT NULL"); } protected override void Down(MigrationBuilder migrationBuilder) @@ -311,9 +279,6 @@ namespace Data.Migrations migrationBuilder.DropTable( name: "Cars"); - - migrationBuilder.DropTable( - name: "User"); } } } diff --git a/RentACar/Data/Migrations/RentACarDbContextModelSnapshot.cs b/RentACar/Data/Migrations/RentACarDbContextModelSnapshot.cs index 4bf9e27..9414400 100644 --- a/RentACar/Data/Migrations/RentACarDbContextModelSnapshot.cs +++ b/RentACar/Data/Migrations/RentACarDbContextModelSnapshot.cs @@ -16,7 +16,7 @@ namespace Data.Migrations #pragma warning disable 612, 618 modelBuilder .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.13") + .HasAnnotation("ProductVersion", "5.0.15") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); modelBuilder.Entity("Data.Entities.Car", b => @@ -56,7 +56,7 @@ namespace Data.Migrations .HasColumnType("int") .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("CarId") + b.Property("CarId") .HasColumnType("int"); b.Property("EndDate") @@ -86,10 +86,12 @@ namespace Data.Migrations .HasColumnType("int"); b.Property("ConcurrencyStamp") + .IsConcurrencyToken() .HasColumnType("nvarchar(max)"); b.Property("Email") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("EmailConfirmed") .HasColumnType("bit"); @@ -107,10 +109,12 @@ namespace Data.Migrations .HasColumnType("datetimeoffset"); b.Property("NormalizedEmail") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedUserName") - .HasColumnType("nvarchar(max)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("PasswordHash") .HasColumnType("nvarchar(max)"); @@ -131,15 +135,20 @@ namespace Data.Migrations .HasColumnType("bit"); b.Property("UserName") - .HasColumnType("nvarchar(450)"); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.HasKey("Id"); - b.HasIndex("UserName") - .IsUnique() - .HasFilter("[UserName] IS NOT NULL"); + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); - b.ToTable("User"); + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); }); modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => @@ -193,71 +202,6 @@ namespace Data.Migrations b.ToTable("AspNetRoleClaims"); }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("AspNetUsers"); - }); - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { b.Property("Id") @@ -342,7 +286,9 @@ namespace Data.Migrations { b.HasOne("Data.Entities.Car", "Car") .WithMany() - .HasForeignKey("CarId"); + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.HasOne("Data.Entities.User", "User") .WithMany() @@ -364,7 +310,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -373,7 +319,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -388,7 +334,7 @@ namespace Data.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) @@ -397,7 +343,7 @@ namespace Data.Migrations modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser", null) + b.HasOne("Data.Entities.User", null) .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) diff --git a/RentACar/Data/Models/Rents.cs b/RentACar/Data/Models/Rents.cs index 5f33094..77a541a 100644 --- a/RentACar/Data/Models/Rents.cs +++ b/RentACar/Data/Models/Rents.cs @@ -1,5 +1,7 @@ -using System; +using Microsoft.AspNetCore.Identity; +using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,13 +11,13 @@ namespace Data.Entities public class Rents { public int Id { get; set; } - + [ForeignKey("Car")] + public int CarId { get; set; } public virtual Car Car { get; set; } - public DateTime StartDate { get; set; } - public DateTime EndDate { get; set; } - + [ForeignKey("User")] + public string UserId { get; set; } public virtual User User { get; set; } } } diff --git a/RentACar/WebApp/Areas/Identity/IdentityHostingStartup.cs b/RentACar/WebApp/Areas/Identity/IdentityHostingStartup.cs index bb403e8..a7f5b0d 100644 --- a/RentACar/WebApp/Areas/Identity/IdentityHostingStartup.cs +++ b/RentACar/WebApp/Areas/Identity/IdentityHostingStartup.cs @@ -1,5 +1,6 @@ using System; using Data; +using Data.Entities; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI; diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml new file mode 100644 index 0000000..017f6ff --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml @@ -0,0 +1,10 @@ +@page +@model AccessDeniedModel +@{ + ViewData["Title"] = "Access denied"; +} + +
+

@ViewData["Title"]

+

You do not have access to this resource.

+
diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs new file mode 100644 index 0000000..0533326 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/AccessDenied.cshtml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace WebApp.Areas.Identity.Pages.Account +{ + public class AccessDeniedModel : PageModel + { + public void OnGet() + { + + } + } +} + diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml index 857833a..8e4d327 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml @@ -14,9 +14,9 @@
- - - + + +
diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml.cs index c5acdcc..0cd002d 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml.cs +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Login.cshtml.cs @@ -5,13 +5,13 @@ using System.Linq; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Data.Entities; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; -using Data.Entities; namespace WebApp.Areas.Identity.Pages.Account { @@ -44,7 +44,8 @@ namespace WebApp.Areas.Identity.Pages.Account public class InputModel { [Required] - public string Username { get; set; } + [EmailAddress] + public string Email { get; set; } [Required] [DataType(DataType.Password)] @@ -81,7 +82,7 @@ namespace WebApp.Areas.Identity.Pages.Account { // This doesn't count login failures towards account lockout // To enable password failures to trigger account lockout, set lockoutOnFailure: true - var result = await _signInManager.PasswordSignInAsync(Input.Username, Input.Password, Input.RememberMe, lockoutOnFailure: false); + var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false); if (result.Succeeded) { _logger.LogInformation("User logged in."); diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Logout.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Logout.cshtml.cs index 5755a27..bf0f8c6 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/Account/Logout.cshtml.cs +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Logout.cshtml.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Data.Entities; using Microsoft.AspNetCore.Authorization; +using Data.Entities; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml new file mode 100644 index 0000000..31a2ea5 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml @@ -0,0 +1,36 @@ +@page +@model ChangePasswordModel +@{ + ViewData["Title"] = "Change password"; + ViewData["ActivePage"] = ManageNavPages.ChangePassword; +} + +

@ViewData["Title"]

+ +
+
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs new file mode 100644 index 0000000..7a57349 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ChangePassword.cshtml.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public class ChangePasswordModel : PageModel + { + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + private readonly ILogger _logger; + + public ChangePasswordModel( + UserManager userManager, + SignInManager signInManager, + ILogger logger) + { + _userManager = userManager; + _signInManager = signInManager; + _logger = logger; + } + + [BindProperty] + public InputModel Input { get; set; } + + [TempData] + public string StatusMessage { get; set; } + + public class InputModel + { + [Required] + [DataType(DataType.Password)] + [Display(Name = "Current password")] + public string OldPassword { get; set; } + + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "New password")] + public string NewPassword { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm new password")] + [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } + } + + public async Task OnGetAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + var hasPassword = await _userManager.HasPasswordAsync(user); + if (!hasPassword) + { + return RedirectToPage("./SetPassword"); + } + + return Page(); + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + var changePasswordResult = await _userManager.ChangePasswordAsync(user, Input.OldPassword, Input.NewPassword); + if (!changePasswordResult.Succeeded) + { + foreach (var error in changePasswordResult.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } + + await _signInManager.RefreshSignInAsync(user); + _logger.LogInformation("User changed their password successfully."); + StatusMessage = "Your password has been changed."; + + return RedirectToPage(); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml new file mode 100644 index 0000000..c95ab92 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml @@ -0,0 +1,33 @@ +@page +@model DeletePersonalDataModel +@{ + ViewData["Title"] = "Delete Personal Data"; + ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ + + +
+
+
+ @if (Model.RequirePassword) + { +
+ + + +
+ } + +
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs new file mode 100644 index 0000000..c6bca09 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DeletePersonalData.cshtml.cs @@ -0,0 +1,84 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public class DeletePersonalDataModel : PageModel + { + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + private readonly ILogger _logger; + + public DeletePersonalDataModel( + UserManager userManager, + SignInManager signInManager, + ILogger logger) + { + _userManager = userManager; + _signInManager = signInManager; + _logger = logger; + } + + [BindProperty] + public InputModel Input { get; set; } + + public class InputModel + { + [Required] + [DataType(DataType.Password)] + public string Password { get; set; } + } + + public bool RequirePassword { get; set; } + + public async Task OnGet() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + RequirePassword = await _userManager.HasPasswordAsync(user); + return Page(); + } + + public async Task OnPostAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + RequirePassword = await _userManager.HasPasswordAsync(user); + if (RequirePassword) + { + if (!await _userManager.CheckPasswordAsync(user, Input.Password)) + { + ModelState.AddModelError(string.Empty, "Incorrect password."); + return Page(); + } + } + + var result = await _userManager.DeleteAsync(user); + var userId = await _userManager.GetUserIdAsync(user); + if (!result.Succeeded) + { + throw new InvalidOperationException($"Unexpected error occurred deleting user with ID '{userId}'."); + } + + await _signInManager.SignOutAsync(); + + _logger.LogInformation("User with ID '{UserId}' deleted themselves.", userId); + + return Redirect("~/"); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml new file mode 100644 index 0000000..87470c2 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml @@ -0,0 +1,12 @@ +@page +@model DownloadPersonalDataModel +@{ + ViewData["Title"] = "Download Your Data"; + ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ +@section Scripts { + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs new file mode 100644 index 0000000..5729bf2 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/DownloadPersonalData.cshtml.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public class DownloadPersonalDataModel : PageModel + { + private readonly UserManager _userManager; + private readonly ILogger _logger; + + public DownloadPersonalDataModel( + UserManager userManager, + ILogger logger) + { + _userManager = userManager; + _logger = logger; + } + + public async Task OnPostAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + _logger.LogInformation("User with ID '{UserId}' asked for their personal data.", _userManager.GetUserId(User)); + + // Only include personal data for download + var personalData = new Dictionary(); + var personalDataProps = typeof(User).GetProperties().Where( + prop => Attribute.IsDefined(prop, typeof(PersonalDataAttribute))); + foreach (var p in personalDataProps) + { + personalData.Add(p.Name, p.GetValue(user)?.ToString() ?? "null"); + } + + var logins = await _userManager.GetLoginsAsync(user); + foreach (var l in logins) + { + personalData.Add($"{l.LoginProvider} external login provider key", l.ProviderKey); + } + + Response.Headers.Add("Content-Disposition", "attachment; filename=PersonalData.json"); + return new FileContentResult(JsonSerializer.SerializeToUtf8Bytes(personalData), "application/json"); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml new file mode 100644 index 0000000..2a599ee --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml @@ -0,0 +1,43 @@ +@page +@model EmailModel +@{ + ViewData["Title"] = "Manage Email"; + ViewData["ActivePage"] = ManageNavPages.Email; +} + +

@ViewData["Title"]

+ +
+
+
+
+
+ + @if (Model.IsEmailConfirmed) + { +
+ +
+ +
+
+ } + else + { + + + } +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs new file mode 100644 index 0000000..f421033 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Email.cshtml.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; +using System.Text.Encodings.Web; +using System.Linq; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Identity.UI.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public partial class EmailModel : PageModel + { + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + private readonly IEmailSender _emailSender; + + public EmailModel( + UserManager userManager, + SignInManager signInManager, + IEmailSender emailSender) + { + _userManager = userManager; + _signInManager = signInManager; + _emailSender = emailSender; + } + + public string Username { get; set; } + + public string Email { get; set; } + + public bool IsEmailConfirmed { get; set; } + + [TempData] + public string StatusMessage { get; set; } + + [BindProperty] + public InputModel Input { get; set; } + + public class InputModel + { + [Required] + [EmailAddress] + [Display(Name = "New email")] + public string NewEmail { get; set; } + } + + private async Task LoadAsync(User user) + { + var email = await _userManager.GetEmailAsync(user); + Email = email; + + Input = new InputModel + { + NewEmail = email, + }; + + IsEmailConfirmed = await _userManager.IsEmailConfirmedAsync(user); + } + + public async Task OnGetAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + await LoadAsync(user); + return Page(); + } + + public async Task OnPostChangeEmailAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + var email = await _userManager.GetEmailAsync(user); + if (Input.NewEmail != email) + { + var userId = await _userManager.GetUserIdAsync(user); + var code = await _userManager.GenerateChangeEmailTokenAsync(user, Input.NewEmail); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + var callbackUrl = Url.Page( + "/Account/ConfirmEmailChange", + pageHandler: null, + values: new { userId = userId, email = Input.NewEmail, code = code }, + protocol: Request.Scheme); + await _emailSender.SendEmailAsync( + Input.NewEmail, + "Confirm your email", + $"Please confirm your account by clicking here."); + + StatusMessage = "Confirmation link to change email sent. Please check your email."; + return RedirectToPage(); + } + + StatusMessage = "Your email is unchanged."; + return RedirectToPage(); + } + + public async Task OnPostSendVerificationEmailAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + var userId = await _userManager.GetUserIdAsync(user); + var email = await _userManager.GetEmailAsync(user); + var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + var callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = userId, code = code }, + protocol: Request.Scheme); + await _emailSender.SendEmailAsync( + email, + "Confirm your email", + $"Please confirm your account by clicking here."); + + StatusMessage = "Verification email sent. Please check your email."; + return RedirectToPage(); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml new file mode 100644 index 0000000..e018437 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml @@ -0,0 +1,30 @@ +@page +@model IndexModel +@{ + ViewData["Title"] = "Profile"; + ViewData["ActivePage"] = ManageNavPages.Index; +} + +

@ViewData["Title"]

+ +
+
+
+
+
+ + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs new file mode 100644 index 0000000..cbffed3 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/Index.cshtml.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public partial class IndexModel : PageModel + { + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + + public IndexModel( + UserManager userManager, + SignInManager signInManager) + { + _userManager = userManager; + _signInManager = signInManager; + } + + public string Username { get; set; } + + [TempData] + public string StatusMessage { get; set; } + + [BindProperty] + public InputModel Input { get; set; } + + public class InputModel + { + [Phone] + [Display(Name = "Phone number")] + public string PhoneNumber { get; set; } + } + + private async Task LoadAsync(User user) + { + var userName = await _userManager.GetUserNameAsync(user); + var phoneNumber = await _userManager.GetPhoneNumberAsync(user); + + Username = userName; + + Input = new InputModel + { + PhoneNumber = phoneNumber + }; + } + + public async Task OnGetAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + await LoadAsync(user); + return Page(); + } + + public async Task OnPostAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + if (!ModelState.IsValid) + { + await LoadAsync(user); + return Page(); + } + + var phoneNumber = await _userManager.GetPhoneNumberAsync(user); + if (Input.PhoneNumber != phoneNumber) + { + var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber); + if (!setPhoneResult.Succeeded) + { + StatusMessage = "Unexpected error when trying to set phone number."; + return RedirectToPage(); + } + } + + await _signInManager.RefreshSignInAsync(user); + StatusMessage = "Your profile has been updated"; + return RedirectToPage(); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs new file mode 100644 index 0000000..f4e5adf --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/ManageNavPages.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Rendering; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public static class ManageNavPages + { + public static string Index => "Index"; + + public static string Email => "Email"; + + public static string ChangePassword => "ChangePassword"; + + public static string DownloadPersonalData => "DownloadPersonalData"; + + public static string DeletePersonalData => "DeletePersonalData"; + + public static string ExternalLogins => "ExternalLogins"; + + public static string PersonalData => "PersonalData"; + + public static string TwoFactorAuthentication => "TwoFactorAuthentication"; + + public static string IndexNavClass(ViewContext viewContext) => PageNavClass(viewContext, Index); + + public static string EmailNavClass(ViewContext viewContext) => PageNavClass(viewContext, Email); + + public static string ChangePasswordNavClass(ViewContext viewContext) => PageNavClass(viewContext, ChangePassword); + + public static string DownloadPersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, DownloadPersonalData); + + public static string DeletePersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, DeletePersonalData); + + public static string ExternalLoginsNavClass(ViewContext viewContext) => PageNavClass(viewContext, ExternalLogins); + + public static string PersonalDataNavClass(ViewContext viewContext) => PageNavClass(viewContext, PersonalData); + + public static string TwoFactorAuthenticationNavClass(ViewContext viewContext) => PageNavClass(viewContext, TwoFactorAuthentication); + + private static string PageNavClass(ViewContext viewContext, string page) + { + var activePage = viewContext.ViewData["ActivePage"] as string + ?? System.IO.Path.GetFileNameWithoutExtension(viewContext.ActionDescriptor.DisplayName); + return string.Equals(activePage, page, StringComparison.OrdinalIgnoreCase) ? "active" : null; + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml new file mode 100644 index 0000000..d64bd82 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml @@ -0,0 +1,27 @@ +@page +@model PersonalDataModel +@{ + ViewData["Title"] = "Personal Data"; + ViewData["ActivePage"] = ManageNavPages.PersonalData; +} + +

@ViewData["Title"]

+ +
+
+

Your account contains personal data that you have given us. This page allows you to download or delete that data.

+

+ Deleting this data will permanently remove your account, and this cannot be recovered. +

+
+ +
+

+ Delete +

+
+
+ +@section Scripts { + +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs new file mode 100644 index 0000000..d86ad57 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/PersonalData.cshtml.cs @@ -0,0 +1,34 @@ +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public class PersonalDataModel : PageModel + { + private readonly UserManager _userManager; + private readonly ILogger _logger; + + public PersonalDataModel( + UserManager userManager, + ILogger logger) + { + _userManager = userManager; + _logger = logger; + } + + public async Task OnGet() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + return Page(); + } + } +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml new file mode 100644 index 0000000..f1817aa --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml @@ -0,0 +1,35 @@ +@page +@model SetPasswordModel +@{ + ViewData["Title"] = "Set password"; + ViewData["ActivePage"] = ManageNavPages.ChangePassword; +} + +

Set your password

+ +

+ You do not have a local username/password for this site. Add a local + account so you can log in without an external login. +

+
+
+
+
+
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs new file mode 100644 index 0000000..e8b93e7 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/SetPassword.cshtml.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace WebApp.Areas.Identity.Pages.Account.Manage +{ + public class SetPasswordModel : PageModel + { + private readonly UserManager _userManager; + private readonly SignInManager _signInManager; + + public SetPasswordModel( + UserManager userManager, + SignInManager signInManager) + { + _userManager = userManager; + _signInManager = signInManager; + } + + [BindProperty] + public InputModel Input { get; set; } + + [TempData] + public string StatusMessage { get; set; } + + public class InputModel + { + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "New password")] + public string NewPassword { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm new password")] + [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } + } + + public async Task OnGetAsync() + { + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + var hasPassword = await _userManager.HasPasswordAsync(user); + + if (hasPassword) + { + return RedirectToPage("./ChangePassword"); + } + + return Page(); + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + var user = await _userManager.GetUserAsync(User); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + var addPasswordResult = await _userManager.AddPasswordAsync(user, Input.NewPassword); + if (!addPasswordResult.Succeeded) + { + foreach (var error in addPasswordResult.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } + + await _signInManager.RefreshSignInAsync(user); + StatusMessage = "Your password has been set."; + + return RedirectToPage(); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_Layout.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_Layout.cshtml new file mode 100644 index 0000000..3d882cc --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_Layout.cshtml @@ -0,0 +1,29 @@ +@{ + if (ViewData.TryGetValue("ParentLayout", out var parentLayout)) + { + Layout = (string)parentLayout; + } + else + { + Layout = "/Areas/Identity/Pages/_Layout.cshtml"; + } +} + +

Manage your account

+ +
+

Change your account settings

+
+
+
+ +
+
+ @RenderBody() +
+
+
+ +@section Scripts { + @RenderSection("Scripts", required: false) +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml new file mode 100644 index 0000000..6d2863c --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ManageNav.cshtml @@ -0,0 +1,15 @@ +@inject SignInManager SignInManager +@{ + var hasExternalLogins = (await SignInManager.GetExternalAuthenticationSchemesAsync()).Any(); +} + diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml new file mode 100644 index 0000000..208a424 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_StatusMessage.cshtml @@ -0,0 +1,10 @@ +@model string + +@if (!String.IsNullOrEmpty(Model)) +{ + var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; + +} \ No newline at end of file diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml new file mode 100644 index 0000000..cdc74bb --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Manage/_ViewImports.cshtml @@ -0,0 +1 @@ +@using WebApp.Areas.Identity.Pages.Account.Manage diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml index 7326a17..d9b50ab 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml @@ -17,36 +17,6 @@
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml.cs index 1bb8d65..8f92fe7 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml.cs +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/Register.cshtml.cs @@ -5,10 +5,9 @@ using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Threading.Tasks; -using Data; -using Data.Entities; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; +using Data.Entities; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.AspNetCore.Mvc; @@ -24,19 +23,19 @@ namespace WebApp.Areas.Identity.Pages.Account private readonly SignInManager _signInManager; private readonly UserManager _userManager; private readonly ILogger _logger; - private readonly RentACarDbContext _rentACartDbContext; + private readonly IEmailSender _emailSender; public RegisterModel( UserManager userManager, SignInManager signInManager, ILogger logger, - RentACarDbContext rentACarDbContext) - { + IEmailSender emailSender) + { _userManager = userManager; _signInManager = signInManager; _logger = logger; - _rentACartDbContext = rentACarDbContext; - } + _emailSender = emailSender; + } [BindProperty] public InputModel Input { get; set; } @@ -52,25 +51,6 @@ namespace WebApp.Areas.Identity.Pages.Account [Display(Name = "Email")] public string Email { get; set; } - [Required] - public string UserName { get; set; } - - [Required] - public string FirstName { get; set; } - - [Required] - public string LastName { get; set; } - public bool IsAdmin { get; set; } - - [Required] - [StringLength(10, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 10)] - public string EGN { get; set; } - - [Required] - [DataType(DataType.PhoneNumber)] - [StringLength(10, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 10)] - public string PhoneNumber { get; set; } - [Required] [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] [DataType(DataType.Password)] @@ -95,23 +75,33 @@ namespace WebApp.Areas.Identity.Pages.Account ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); if (ModelState.IsValid) { - var user = new User { Id = Guid.NewGuid().ToString(), UserName = Input.UserName, Email = Input.Email, FirstName = Input.FirstName, LastName = Input.LastName, PhoneNumber = Input.PhoneNumber, PersonalNumber = Input.EGN}; + var user = new User { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { - _logger.LogInformation("User created a new account with password."); - await _signInManager.SignInAsync(user, isPersistent: false); - if (Input.IsAdmin == true) + _logger.LogInformation("User created a new account with password."); + + var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + var callbackUrl = Url.Page( + "/Account/ConfirmEmail", + pageHandler: null, + values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl }, + protocol: Request.Scheme); + + await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", + $"Please confirm your account by clicking here."); + + if (_userManager.Options.SignIn.RequireConfirmedAccount) { - await _userManager.AddToRoleAsync(user, "Admin"); + return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }); } else { - await _userManager.AddToRoleAsync(user, "User"); + await _signInManager.SignInAsync(user, isPersistent: false); + return LocalRedirect(returnUrl); } - return LocalRedirect(returnUrl); } - foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml new file mode 100644 index 0000000..27bc951 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml @@ -0,0 +1,37 @@ +@page +@model ResetPasswordModel +@{ + ViewData["Title"] = "Reset password"; +} + +

@ViewData["Title"]

+

Reset your password.

+
+
+
+
+
+ +
+ + + +
+
+ + + +
+
+ + + +
+ +
+
+
+ +@section Scripts { + +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs b/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs new file mode 100644 index 0000000..b42f7c6 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/ResetPassword.cshtml.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.AspNetCore.WebUtilities; + +namespace WebApp.Areas.Identity.Pages.Account +{ + [AllowAnonymous] + public class ResetPasswordModel : PageModel + { + private readonly UserManager _userManager; + + public ResetPasswordModel(UserManager userManager) + { + _userManager = userManager; + } + + [BindProperty] + public InputModel Input { get; set; } + + public class InputModel + { + [Required] + [EmailAddress] + public string Email { get; set; } + + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + public string Password { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm password")] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } + + public string Code { get; set; } + } + + public IActionResult OnGet(string code = null) + { + if (code == null) + { + return BadRequest("A code must be supplied for password reset."); + } + else + { + Input = new InputModel + { + Code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)) + }; + return Page(); + } + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return Page(); + } + + var user = await _userManager.FindByEmailAsync(Input.Email); + if (user == null) + { + // Don't reveal that the user does not exist + return RedirectToPage("./ResetPasswordConfirmation"); + } + + var result = await _userManager.ResetPasswordAsync(user, Input.Code, Input.Password); + if (result.Succeeded) + { + return RedirectToPage("./ResetPasswordConfirmation"); + } + + foreach (var error in result.Errors) + { + ModelState.AddModelError(string.Empty, error.Description); + } + return Page(); + } + } +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/Account/_StatusMessage.cshtml b/RentACar/WebApp/Areas/Identity/Pages/Account/_StatusMessage.cshtml new file mode 100644 index 0000000..e996841 --- /dev/null +++ b/RentACar/WebApp/Areas/Identity/Pages/Account/_StatusMessage.cshtml @@ -0,0 +1,10 @@ +@model string + +@if (!String.IsNullOrEmpty(Model)) +{ + var statusMessageClass = Model.StartsWith("Error") ? "danger" : "success"; + +} diff --git a/RentACar/WebApp/Areas/Identity/Pages/_ViewImports.cshtml b/RentACar/WebApp/Areas/Identity/Pages/_ViewImports.cshtml index af3a34a..54ec829 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/_ViewImports.cshtml +++ b/RentACar/WebApp/Areas/Identity/Pages/_ViewImports.cshtml @@ -2,3 +2,4 @@ @using WebApp.Areas.Identity @using WebApp.Areas.Identity.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using Data.Entities diff --git a/RentACar/WebApp/Areas/Identity/Pages/_ViewStart.cshtml b/RentACar/WebApp/Areas/Identity/Pages/_ViewStart.cshtml index c4284f6..94fd419 100644 --- a/RentACar/WebApp/Areas/Identity/Pages/_ViewStart.cshtml +++ b/RentACar/WebApp/Areas/Identity/Pages/_ViewStart.cshtml @@ -1,3 +1,4 @@ -@{ + +@{ Layout = "/Views/Shared/_Layout.cshtml"; } diff --git a/RentACar/WebApp/Controllers/CarsController.cs b/RentACar/WebApp/Controllers/CarsController.cs index 823c87e..ca51976 100644 --- a/RentACar/WebApp/Controllers/CarsController.cs +++ b/RentACar/WebApp/Controllers/CarsController.cs @@ -7,6 +7,8 @@ using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Data; using Data.Entities; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Authorization; namespace WebApp.Controllers { @@ -44,6 +46,7 @@ namespace WebApp.Controllers } // GET: Cars/Create + [Authorize(Roles = "Admin")] public IActionResult Create() { return View(); diff --git a/RentACar/WebApp/Startup.cs b/RentACar/WebApp/Startup.cs index 2ba6b7c..416ff74 100644 --- a/RentACar/WebApp/Startup.cs +++ b/RentACar/WebApp/Startup.cs @@ -29,8 +29,7 @@ namespace API public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => - options.UseSqlServer( - Configuration.GetConnectionString("DefaultConnection"))); + options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddIdentity(options => { @@ -42,7 +41,10 @@ namespace API options.User.RequireUniqueEmail = false; }) + .AddRoles() + .AddDefaultUI() .AddEntityFrameworkStores(); + services.AddControllersWithViews(); services.AddRazorPages(); } diff --git a/RentACar/WebApp/WebApp.csproj b/RentACar/WebApp/WebApp.csproj index 8dd026f..880cf2b 100644 --- a/RentACar/WebApp/WebApp.csproj +++ b/RentACar/WebApp/WebApp.csproj @@ -7,10 +7,10 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Cryptography.Internal.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Cryptography.Internal.dll index 9882aa40c23775c011cf1ad99ad9d29e17a3a97e..468e8018cb64adc2c7aaf31b5936b522c31e6e07 100644 GIT binary patch delta 3235 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 diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Cryptography.KeyDerivation.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Cryptography.KeyDerivation.dll index 073a44e2a549753f6566f81fdfb4be7116532a10..46a9ed6870ee73dd7681a51a06bea577b0d2860d 100644 GIT binary patch delta 5922 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 diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Identity.EntityFrameworkCore.dll index 62437b8d92454959346289c8781a9f55a254f8e5..166b3c1bc7f8ef518fdb57030d05221a39dafd98 100644 GIT binary patch delta 3308 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 diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Identity.UI.Views.V4.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.AspNetCore.Identity.UI.Views.V4.dll index 5c312eac6400396289112aa89b99ac0d73b04d14..f26f7149fe9fadecd0d979983214b7d0090d5a96 100644 GIT binary patch delta 3241 zcmZuy2{@G78=r6ZD1@ObS+kb)n;FAQNhTTBUX&$N#zaWs%FZPFzExlP3ymmymKuYo zkQ5i$nIcNoE~3WTf82YY`~08(z2`meIq&=Xe(yQYbDnd4UmRT|jxLfG$9XQ6mYber zhLop8j6{zB(IdzwBOEqnfB=j(=ZFUcV(ZO0==J8D>binLwx{jIc_7P2K3uofSf@#J zRy=2~;RzfDqk%?iqqPwTEdZg3(||P4I8|)|mOvpmlL?TsGx{P~ntM_`&{1A9G9lSa9C<;B~Cn+MH$IyL~6(L#A znjD>|;OQIaY-SdEbSxQk+Q-%m2GtHT+L=G=2WpHyN@V-n{lJ*Eq~yP0Y8z#XoQ{`K zx~+iQU5#M3@4#XoeA5d&DQJ65c)VqB(Ym;B(cXAZpL1%}D~g|2!1g|hjlJ@7@M zygBAE;~_`l=;>F$4S@H8`Z9<>uscG44qpXzkSH7i!!`{Bnr+%UP9O6HIgr*kgep5H zAh2wwu-zF!W{(hic4o6KB5(*DHbQ12J5_`~VhjS$ww=uNkFPFl)RkSm!^0u8VB9qj z2jbY9LGaQQFoO>GgIAHVlIe_;g5>^v0}}!rjx(}8`u3S6J|~SQGIwoenyhaH!0CaY zh#=A`5nIf<^^GvPa~w!3m>vk;ltM!U2!qCBF*w3m(LERpJ4OGMLVj@NE$|HdEC|%6 zc7N(htzO;W9If~yvm#&eNMP5BR_3F=;{N0L^*1arY*!(K2;Vi zUp$Y~FUc&Nh;3Bge8)FG>C;$PZ7$1|%ug(SY;cmCDi@-?IQH#0F3j6PvoV2gSoG`V zx&4w%sez5U%(*6scUt|LEoJkO{6iM+SE-Xunh#7u+ZRv3ET^UH=S?ZiJjkF_$Enc| zm;3kGOO6C%;?nk6NAX-iJTEI4ecgEB#5IMly9!UYO(s@!QZJEwjV`?%=uAJ9k6oU? zS`0z6Ud@*$@gacA0b%QbeJAyH`5qGrcLP*kHZaPKHbP5cm`i@4`Z2~tmGEJU!V#pc zIlL7N687RU&Z3BkL!OW6Pc4vNr9(-gK|QcZ2x!5ngCpp`*&*O2Rm50_p++&&ckUb2 zhaZz0BGdr43+K;fv5f4|G2Mqs#HQn{)cwp_oQTYcdq(e?(%TMYd~@7?o?{{Dj%ob; z-3EZsXVdaMV~eZuW6zJ;-ln;Dx6>>JDAw2SVtcfD9=1;(fsL)>@rI8qpI(|fye^t^ zBTp*$RGwBwy5y7eIw~rmwhEfEmu-7jwZ=PKPHpzr)G&(^QOQjb^G3Vmzi4EQ(}%iE z#NG6s2AoO-n)vD}4t;bKxz*z&Z1zl6So%Zk@{{~#Igk3f>h0Dy`H4X%YM-G$uHpgB zw1pNWjWYjtpo3|j9cyy(-p_|hyu*c!_2k!AR#uaH0{o?vj#6`(WRHcEH`hFBh;e6Y z9ub52WnSSg^s1JP@ZZJSS0?q&38!MGuien{e0KdM!}ZI>Ym#`+6#L%1gBc?--6|>V zXw}9tv6Kk>x!W}xzx8geo^~9`T}Ul9w%A^&H$6TnW|XAkBR^R?TG~M0x-QO)z3G8v z?B^d4;YTiWCr44kJI-NBc^nXW=5{sGPtuE4Do5fSgmdmIzEHqmGgObxlje%{D*mvl z!#HpIYc9~v9DeWFIuP9aYR*MD*KZR!G1fU@Sj#m=IDl%a0x7@ypIjFec8E%9yqw|W zYn~Q>nHtCQgNwx|ZHbA!fRN?PtEDatxmUwM&vcEa1TmbC`i0!-cfvu`u75r{MhxgE zTX(tT(s7Mtt7&vM_$;W0>~e+ysj%`}X(b5?w$plUFfJCfrG~$XwOVuTafka5~4vN3nhcB#fd@AO@PaUs5|oWFAI9lCg{v|N57(cu{QWJW(F`X!_!h)S-z z@btTFnC_JaC@1RI;j5%f$6x-Vv@CQm(mppms{B@UNQrN(TJ4O6n5GSns>~YZvZ4to zae-D%Tzx$y5gNDJ`AN*qcII$O@X@=b78j$WMFMw+r^nB}_IXjTduVL5^MOs27isTd z2_nn8PKAiTUEbgekoD!4n9sc0WtiJ`VeB^Pkuv=|MTEx^X=4p1#ep|;xjKBT7tdGD z7kEog42$d3ZbQ7B$xB%;rDY=V!{}REnpb54ur)*5KaSw(Sc3k z!6JT=4pCd(5Q9Ujqj3-s1`8*LTYsr3z{x!|1V>mnO z)Kbz*rB+>;j&u&tHS^c1rJH6=gJIfX;`g?sieCC3d8n|}t2&IN2&(5qu6>W;<~xvh zcP?bZl@oRVeC(HL-xYN5bV0W<1JyoFj=iFua=H@7rk@&iQ~BN1c2#eleB74BarF18 zV`orIm2cBYGqJqBw2}*a0<4dOZ{e%PdX!YRjp9$!LAZ}5i_DHfRhxL;_gO2feEoZM z?h}=(PeKdtg5AF0@vc+Hgf;gFy&dke>;KHLPFw7-e1*ubs&-H89Zw2xY4vtkp!T&7 zxfi3Bs=gSAXCf(+@In$Ow)cB?Q8cNcZ2i-m@?hLc-KrTKmoIejWRMS_Ca0eknihzN zp})e*isbudGf1_;Z{52NZBrPOSQFzrNcV9=j?yQk@l!~u2j+ekPqHt6csIXU_>sO}U$LQa192)|TQ@WeN8g+4*bh&sWMa@N<#T zI(o_rv&{;#XXfLdXl@{=FIKn3f+Z*PJj2H|h-kZSo>JruBkYadHZbf*{r#H`gpr7m zf*zZ`f`!>{XjIU<^KTClSEX28cS?Li7=wq6KH&DxpAX2>diG`C7n)0>$MGC~d6G#v zFrT~iu8>Gd?_aJ!JU)eVr2wWj30h6ecIo3kKU*#J=U1kRVyH)up}Xmdsh}eFzg{Bh zZ4f1`;{O(rDiifJ^cTgFf~>)3KH^oVyog9B;`)PdDD=;Nuw@!}5LSgjAu63ofaJsk z{=VuE28SV>{TskTe*#bdbd-xnl?&hmqU?D%0kkHh4)GvC#Ao&bNC3f(0R$4MbIOg)Vi|eY6wAO=S}C@pLZzIHz{nI8$Fx%{B7_w1;cAO3W`YKlT6sFNom00U!wX#hY5sj4vo9 zcn@;RyO|fWC~D+1&)Pe|HsZze3&Rtjz2KLhr(}DVqK`O87KQQ`x|8>usuIej4iu0M zqO8Y{t;-XG6YH*#Qbfi)zyDOzKUEX);hMy7d1x%n_*dh7sI0L8jj5Sv zw2IE(-^`NE8K!pIRPgn^@lyYJPhab?;=0LDU9{irpyu1Ww1_Ix;e$IG%WnS#kAjt5 delta 3241 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 WIq6sf}uQb>fD)VO3)Dnl4a8j(ws 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 z z%)cs#hJVic-^i+yeQ8misx^+v%qPjlrVs6GPf@SL!hwEb5=fq+_M*#5nFNEf2V!3o zdm?TR?x#2iu*^9bZTN7+TVN%kvL|n?bDA1@waPM^?V{%+dDSofQ`c1lwa)%kJ^zhFVyci#3wXpi#ZNKrun*W=k#n4pf*MU`>|U j@Ipu9td-pBD(5g4pA4S;&^nDbQdWQevGx~J55~U%(K==f delta 3087 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 diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.Design.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.Design.dll index 80ce204fb1458422478668b35d4c9fdbb0543e99..671d92ea4ef1534215c5efc85cbd2e8e27924ee1 100644 GIT binary patch delta 3314 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 F{|)l$m0bV; delta 3281 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 delta 3320 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 Q{hpTiuB;dQFi&>;69DFy$^ZZW diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.SqlServer.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.SqlServer.dll index ead5ec318e8ea0ca493a613d1d0b455979510444..9580953a7e7c1f5e141d5a3dd5ca8260a7f23e84 100644 GIT binary patch delta 3287 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 delta 3320 zcmZve3pi9;8^>qQ%r-GJMu?94wOsceGmPBtLgkQKr5e}hlt?89!(b4lLAH=aN=Ycx zxD?XJaVc_5DM{rLMdTX3>72gr`Mz_${XFkp@BXiMt!J&h*85v4u|q7nL+nB#_S(#J zJS)Wkox^0kGzX$%rGW%#;D@0((g21a00<(Qc#JZyaK>X)#RO4*J?T~&$9{Mq&jb@v z@fc1j9!pFVF7X_n@4jVhb}Rm9psiN3IOk3}7I$nb)knvh2GdA7G%6ML)AjQs>rlM) z^z~?D9WU62s;{F%qWb#!>LWt{$Q2`zU@Z!)14Aej9zgL?v>+{*#Hm7qSrq!OdJAcW z@sY=MV;3bCA=;6IZ*^}<4$TMjQyHvBti0wrbTe+#?x03l^}&lVM-J?*{eyL!Ya>b& zC2M$3rjg=+6_MRladv%}8Nl&?{N+3VKRM#t`Z;Om291W#=N!{>x^}U_jB1-+mx1&dY=1kri!pEL2+SV=*YBI+6}wP z&L1-bh7gV=m>~_pB$z_ttp%B~ce4-)hDi`_b^iQ>LXo>P&;@yD1)9?D*GhT_qY8>< z-dF9viO03Q%9d5^9B?lVYp`8V5~WUiPxabk>Ypz1w~9K>s#dHqDwnrd#0|GC{X!ix zX}_R)8@UP#uzvTNJX!zL_8i;u2qL zq>qpjo}+eprm;6PH`S(_{+bPIN?lXd;BrmQ75*h(eNA;`E*?{g;gtaHysN*Uix zeUC3IOuZR4-16d+2SECywza_eqpDy_~Y%<7CRfpx@mCjv#h6;4Z8V1nDEWHsE)9UU)*KVV0xoMYMf`y3MWPqG5LZ znH?EguO-L*YdtMG9Bt@zlY}Z}&5Bz}aJK0g?8mO>j5-L-?e;541=&U~-7U(*L+=)| zGi_M+J)HSmc!AT>uiNT>&{nA)ffn=%t$GR84OcfM`hZI5=UMY zkc#tFYOd!Wb=ey6t+2=LEO7?s5u#d{9YYHaz&5y3%X7aR>R!xErYuC(^!}C}ut}1h z-^{FudctqSLP}3p+pcXMGa7!zK}&TNC&`D_;WC^E10!Evy;6zX(Oel=(-LE$6*^Zu zZ@f`+q;W4eZFTKJ=ux{5AH=M?a|G5iptr{|z0^dyCgq$r8qF)3FC|}|UmhOpAn4{_ z_~_-QB5#>;G@WfHDk@~Teelq6yc;+8CaylfW4%Q;tRPk0>wplY zrgTlkTa*2&`Z_%xr((KnngVQp#(W-A23sX=%$%Rqd0laoes+b)6qLoBi0nrPg}h)G z`hjV?sp7v0asP_h>DnuSSKl3`;n$HlKh8QA~d;;ox02W~A zVK4y95EG_F0~q3zB7)|lS@vWlB}j0sx%qOwzDvxU;2sinGA>e{z%l_p#!lkRD+py-djtx1GSy)!-%^;XLacAq^W z?X_Z~!{}}XBNuA(Gxq7fjCpzexogk$sfk&bc&6)M+g7u0(u*Bg#UZ~}_iwj(L)kKU z@HCtJa8zvcs&`$WdEQ1vYr9fl^2%ygp_w(S_iGvI&aY@cAHd%AEV+KLMaF#ngVRiJ z!QIr&B)S1Qf}f+j4^+ne-%UjK0*Nwer`k}dvT>gyY?X_zU+RAtELl!u$HYQ0(buA& zh`&zz-TT3Oy*q+_Wnm8{}iCpkkQYqjPnq{0VPd#di^e8ta=%1U@4Q;GSTe~wkaBhpsYE}DXyF278zAI^NA28%7RA61{o4opCZj!BQ zIfg0n(F3zljd>5=1=mKX)cy*DAjf^cw14C<(HAt8djZ@R7JK$Zxw*WvqL0noWTM2K z>WlSnyvg@Q9oK$l015U5W#j<&Upnfcj}iT8&%B&RMy)ZQ3f6Abu717d6uDfs$zlvC z^957re}e?1fR*!v^VhzJbp|h)?P?2%cvv?4$I(n&i_Tpmnd1a4{1wOuJ1&?8;x) zzS?y!aIWxcARrZOjaQCB9!gD*s!l+lBYdcB>gtol%E2q*As~?PiaKIqotWdGi_jdQT zQ0j>@9qZ~2m5+Qkl>N9>?NN7Im5=no zTFbpF;^*}zhH5kTC0g4lx|t8EpBmKoOgE%RvF^>E&k#_3->YB8%sL}CGl&j$58a4FHe<}8~^|S diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.EntityFrameworkCore.dll index c26b871086fdaaa4888e8c5154db481657293ba0..3a48e921253709998b39dc1367e8be216e92fe43 100644 GIT binary patch delta 3220 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 CAhhoQ diff --git a/RentACar/WebApp/bin/Debug/net5.0/Microsoft.Extensions.FileProviders.Embedded.dll b/RentACar/WebApp/bin/Debug/net5.0/Microsoft.Extensions.FileProviders.Embedded.dll index ffa5133c4850bb7fbafa28c6421f3cc20e649dc2..c683d7369a0fc76a5852463aba73ffd840258b46 100644 GIT binary patch delta 3356 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 delta 3326 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 GgZ&+fQ?88w delta 3373 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 JUq;Fr{{So*v9KgYLo;^BbJlTuvK_!D8 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 delta 3542 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 TlkVv7F9)kmF3smLIGp|$lnUwU