| @@ -9,6 +9,11 @@ | |||
| <ItemGroup> | |||
| <PackageReference Include="AutoMapper" Version="11.0.1" /> | |||
| <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="6.0.10" /> | |||
| <PackageReference Include="RestSharp" Version="108.0.2-alpha.0.6" /> | |||
| </ItemGroup> | |||
| @@ -0,0 +1,18 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Diligent.WebAPI.Business.MappingProfiles | |||
| { | |||
| public class UserMappingProfile : Profile | |||
| { | |||
| public UserMappingProfile() | |||
| { | |||
| #region DTO to Model | |||
| CreateMap<CreateUserRequestDto, User>(); | |||
| #endregion | |||
| } | |||
| } | |||
| } | |||
| @@ -2,8 +2,12 @@ | |||
| { | |||
| public interface IUserService | |||
| { | |||
| AuthenticateResponseDto? Authenticate(AuthenticateRequestDto model); | |||
| IEnumerable<User?> GetAll(); | |||
| User? GetById(int id); | |||
| Task<AuthenticateResponseDto?> Authenticate(AuthenticateRequestDto model); | |||
| Task<IEnumerable<User?>> GetAll(); | |||
| Task<User?> GetById(int id); | |||
| Task CreateUser(CreateUserRequestDto model); | |||
| } | |||
| } | |||
| @@ -1,24 +1,36 @@ | |||
| namespace Diligent.WebAPI.Business.Services | |||
| | |||
| namespace Diligent.WebAPI.Business.Services | |||
| { | |||
| public class UserService : IUserService | |||
| { | |||
| private readonly AuthorizationSettings _authSettings; | |||
| private readonly UserManager<User> _userManager; | |||
| private readonly IMapper _mapper; | |||
| public UserService(IOptions<AuthorizationSettings> authSettings) | |||
| public UserService(IOptions<AuthorizationSettings> authSettings, UserManager<User> userManager, IMapper mapper) | |||
| { | |||
| _authSettings = authSettings.Value; | |||
| _userManager = userManager; | |||
| _mapper = mapper; | |||
| } | |||
| // User list for testing | |||
| private readonly List<User> _users = new List<User> | |||
| public async Task<IEnumerable<User?>> GetAll() => | |||
| await _userManager.Users.ToListAsync(); | |||
| public async Task<User?> GetById(int id) => | |||
| await _userManager.FindByIdAsync(id.ToString()); | |||
| public async Task CreateUser(CreateUserRequestDto model) | |||
| { | |||
| new User { Id = 1, FirstName = "Test", LastName = "User", Username = "test", Password = "test" } | |||
| }; | |||
| var user = _mapper.Map<User>(model); | |||
| public AuthenticateResponseDto? Authenticate(AuthenticateRequestDto model) | |||
| await _userManager.CreateAsync(user, model.Password); | |||
| } | |||
| public async Task<AuthenticateResponseDto?> Authenticate(AuthenticateRequestDto model) | |||
| { | |||
| var user = _users.SingleOrDefault(x => x.Username == model.Username && x.Password == model.Password); | |||
| var user = await _userManager.Users.Where(x => x.UserName == model.Username).FirstOrDefaultAsync(); | |||
| // return null if user not found | |||
| if (user == null) | |||
| @@ -30,23 +42,13 @@ | |||
| return new AuthenticateResponseDto | |||
| { | |||
| Id = user.Id, | |||
| Username = user.Username, | |||
| Username = user.UserName, | |||
| FirstName = user.FirstName, | |||
| LastName = user.LastName, | |||
| Token = token | |||
| }; | |||
| } | |||
| public IEnumerable<User> GetAll() | |||
| { | |||
| return _users; | |||
| } | |||
| public User? GetById(int id) | |||
| { | |||
| return _users.FirstOrDefault(x => x.Id == id); | |||
| } | |||
| private string GenerateJwtToken(User user) | |||
| { | |||
| // generate token that is valid for 7 days | |||
| @@ -22,4 +22,6 @@ global using System.Text; | |||
| global using Newtonsoft.Json; | |||
| global using RestSharp; | |||
| global using AutoMapper; | |||
| global using AutoMapper; | |||
| global using Microsoft.AspNetCore.Identity; | |||
| @@ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Diligent.WebAPI.Contracts.DTOs.Auth | |||
| { | |||
| public class CreateUserRequestDto | |||
| { | |||
| public string FirstName { get; set; } | |||
| public string LastName { get; set; } | |||
| public string UserName { get; set; } | |||
| public string Email { get; set; } | |||
| public string Password { get; set; } | |||
| } | |||
| } | |||
| @@ -6,6 +6,14 @@ | |||
| <Nullable>enable</Nullable> | |||
| </PropertyGroup> | |||
| <ItemGroup> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="6.0.10" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <ProjectReference Include="..\Diligent.WebAPI.Data\Diligent.WebAPI.Data.csproj" /> | |||
| </ItemGroup> | |||
| @@ -1,6 +1,6 @@ | |||
| namespace Diligent.WebAPI.Data; | |||
| public class DatabaseContext : DbContext | |||
| public class DatabaseContext : IdentityDbContext<User, AppRole, int> | |||
| { | |||
| public DbSet<InsuranceCompany> InsuranceCompanies { get; set; } | |||
| public DbSet<Insurer> Insurers { get; set; } | |||
| @@ -10,11 +10,16 @@ | |||
| <PackageReference Include="AutoMapper" Version="11.0.1" /> | |||
| <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.3" /> | |||
| <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.3"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
| </PackageReference> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="6.0.10" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| @@ -0,0 +1,16 @@ | |||
| using Microsoft.AspNetCore.Identity; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| namespace Diligent.WebAPI.Data.Entities | |||
| { | |||
| public class AppRole : IdentityRole<int> | |||
| { | |||
| public AppRole(string name) : base(name) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -1,9 +1,9 @@ | |||
| namespace Diligent.WebAPI.Data.Entities; | |||
| using Microsoft.AspNetCore.Identity; | |||
| public class User : Base | |||
| namespace Diligent.WebAPI.Data.Entities; | |||
| public class User : IdentityUser<int> | |||
| { | |||
| public string FirstName { get; set; } | |||
| public string LastName { get; set; } | |||
| public string Username { get; set; } | |||
| public string Password { get; set; } | |||
| } | |||
| @@ -0,0 +1,548 @@ | |||
| // <auto-generated /> | |||
| using System; | |||
| using Diligent.WebAPI.Data; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.EntityFrameworkCore.Infrastructure; | |||
| using Microsoft.EntityFrameworkCore.Metadata; | |||
| using Microsoft.EntityFrameworkCore.Migrations; | |||
| using Microsoft.EntityFrameworkCore.Storage.ValueConversion; | |||
| #nullable disable | |||
| namespace Diligent.WebAPI.Data.Migrations | |||
| { | |||
| [DbContext(typeof(DatabaseContext))] | |||
| [Migration("20221020163934_AddedIdentity")] | |||
| partial class AddedIdentity | |||
| { | |||
| protected override void BuildTargetModel(ModelBuilder modelBuilder) | |||
| { | |||
| #pragma warning disable 612, 618 | |||
| modelBuilder | |||
| .HasAnnotation("ProductVersion", "6.0.10") | |||
| .HasAnnotation("Relational:MaxIdentifierLength", 128); | |||
| SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.AppRole", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ConcurrencyStamp") | |||
| .IsConcurrencyToken() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Name") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("NormalizedName") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("NormalizedName") | |||
| .IsUnique() | |||
| .HasDatabaseName("RoleNameIndex") | |||
| .HasFilter("[NormalizedName] IS NOT NULL"); | |||
| b.ToTable("AspNetRoles", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.InsuranceCompany", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("bigint"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"), 1L, 1); | |||
| b.Property<string>("City") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Country") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<DateTime>("CreatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime?>("DeletedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<string>("Fax") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("LegalAddress") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("LegalEmail") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Name") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PhoneNumber") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PostalCode") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<DateTime?>("UpdatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.HasKey("Id"); | |||
| b.ToTable("InsuranceCompanies"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.InsurancePolicy", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("bigint"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"), 1L, 1); | |||
| b.Property<DateTime>("CreatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime?>("DeletedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime>("EndDate") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<long>("InsurerId") | |||
| .HasColumnType("bigint"); | |||
| b.Property<decimal>("Premium") | |||
| .HasColumnType("decimal(18,2)"); | |||
| b.Property<DateTime>("StartDate") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<string>("Type") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<DateTime?>("UpdatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("InsurerId"); | |||
| b.ToTable("InsurancePolicies"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.Insurer", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("bigint"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"), 1L, 1); | |||
| b.Property<string>("Address") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("City") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Country") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<DateTime>("CreatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime>("DateOfBirth") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime?>("DeletedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<string>("Email") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("FirstName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<long>("InsuranceCompanyId") | |||
| .HasColumnType("bigint"); | |||
| b.Property<string>("LastName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PhoneNumber") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PostalCode") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<DateTime?>("UpdatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("InsuranceCompanyId"); | |||
| b.ToTable("Insurers"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.User", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<int>("AccessFailedCount") | |||
| .HasColumnType("int"); | |||
| b.Property<string>("ConcurrencyStamp") | |||
| .IsConcurrencyToken() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Email") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<bool>("EmailConfirmed") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("FirstName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("LastName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("LockoutEnabled") | |||
| .HasColumnType("bit"); | |||
| b.Property<DateTimeOffset?>("LockoutEnd") | |||
| .HasColumnType("datetimeoffset"); | |||
| b.Property<string>("NormalizedEmail") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("NormalizedUserName") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("PasswordHash") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PhoneNumber") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("PhoneNumberConfirmed") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("SecurityStamp") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("TwoFactorEnabled") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("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", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.WebhookDefinition", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("bigint"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"), 1L, 1); | |||
| b.Property<DateTime>("CreatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime?>("DeletedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<string>("Description") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("DisplayName") | |||
| .IsRequired() | |||
| .HasMaxLength(100) | |||
| .HasColumnType("nvarchar(100)"); | |||
| b.Property<string>("Name") | |||
| .IsRequired() | |||
| .HasMaxLength(100) | |||
| .HasColumnType("nvarchar(100)"); | |||
| b.Property<DateTime?>("UpdatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.HasKey("Id"); | |||
| b.ToTable("WebhookDefinitions"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.WebhookSubscription", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("bigint"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("Id"), 1L, 1); | |||
| b.Property<DateTime>("CreatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<DateTime?>("DeletedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<bool>("IsActive") | |||
| .HasColumnType("bit"); | |||
| b.Property<DateTime?>("UpdatedAtUtc") | |||
| .HasColumnType("datetime2"); | |||
| b.Property<long>("WebhookDefinitionId") | |||
| .HasColumnType("bigint"); | |||
| b.Property<string>("WebhookURL") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("WebhookDefinitionId"); | |||
| b.ToTable("WebhookSubscriptions"); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ClaimType") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("ClaimValue") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("RoleId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("RoleId"); | |||
| b.ToTable("AspNetRoleClaims", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ClaimType") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("ClaimValue") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("UserId"); | |||
| b.ToTable("AspNetUserClaims", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b => | |||
| { | |||
| b.Property<string>("LoginProvider") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("ProviderKey") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("ProviderDisplayName") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("LoginProvider", "ProviderKey"); | |||
| b.HasIndex("UserId"); | |||
| b.ToTable("AspNetUserLogins", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b => | |||
| { | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.Property<int>("RoleId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("UserId", "RoleId"); | |||
| b.HasIndex("RoleId"); | |||
| b.ToTable("AspNetUserRoles", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b => | |||
| { | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.Property<string>("LoginProvider") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("Name") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("Value") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.HasKey("UserId", "LoginProvider", "Name"); | |||
| b.ToTable("AspNetUserTokens", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.InsurancePolicy", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.Insurer", "Insurer") | |||
| .WithMany() | |||
| .HasForeignKey("InsurerId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| b.Navigation("Insurer"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.Insurer", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.InsuranceCompany", "InsuranceCompany") | |||
| .WithMany() | |||
| .HasForeignKey("InsuranceCompanyId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| b.Navigation("InsuranceCompany"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.WebhookSubscription", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.WebhookDefinition", "WebhookDefinition") | |||
| .WithMany() | |||
| .HasForeignKey("WebhookDefinitionId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| b.Navigation("WebhookDefinition"); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.AppRole", null) | |||
| .WithMany() | |||
| .HasForeignKey("RoleId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.AppRole", null) | |||
| .WithMany() | |||
| .HasForeignKey("RoleId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| #pragma warning restore 612, 618 | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,225 @@ | |||
| using System; | |||
| using Microsoft.EntityFrameworkCore.Migrations; | |||
| #nullable disable | |||
| namespace Diligent.WebAPI.Data.Migrations | |||
| { | |||
| public partial class AddedIdentity : Migration | |||
| { | |||
| protected override void Up(MigrationBuilder migrationBuilder) | |||
| { | |||
| migrationBuilder.CreateTable( | |||
| name: "AspNetRoles", | |||
| columns: table => new | |||
| { | |||
| Id = table.Column<int>(type: "int", nullable: false) | |||
| .Annotation("SqlServer:Identity", "1, 1"), | |||
| Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| NormalizedName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true) | |||
| }, | |||
| constraints: table => | |||
| { | |||
| table.PrimaryKey("PK_AspNetRoles", x => x.Id); | |||
| }); | |||
| migrationBuilder.CreateTable( | |||
| name: "AspNetUsers", | |||
| columns: table => new | |||
| { | |||
| Id = table.Column<int>(type: "int", nullable: false) | |||
| .Annotation("SqlServer:Identity", "1, 1"), | |||
| FirstName = table.Column<string>(type: "nvarchar(max)", nullable: false), | |||
| LastName = table.Column<string>(type: "nvarchar(max)", nullable: false), | |||
| UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| NormalizedUserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| Email = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| NormalizedEmail = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true), | |||
| EmailConfirmed = table.Column<bool>(type: "bit", nullable: false), | |||
| PasswordHash = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| SecurityStamp = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| PhoneNumber = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| PhoneNumberConfirmed = table.Column<bool>(type: "bit", nullable: false), | |||
| TwoFactorEnabled = table.Column<bool>(type: "bit", nullable: false), | |||
| LockoutEnd = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true), | |||
| LockoutEnabled = table.Column<bool>(type: "bit", nullable: false), | |||
| AccessFailedCount = table.Column<int>(type: "int", nullable: false) | |||
| }, | |||
| constraints: table => | |||
| { | |||
| table.PrimaryKey("PK_AspNetUsers", x => x.Id); | |||
| }); | |||
| migrationBuilder.CreateTable( | |||
| name: "AspNetRoleClaims", | |||
| columns: table => new | |||
| { | |||
| Id = table.Column<int>(type: "int", nullable: false) | |||
| .Annotation("SqlServer:Identity", "1, 1"), | |||
| RoleId = table.Column<int>(type: "int", nullable: false), | |||
| ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| ClaimValue = table.Column<string>(type: "nvarchar(max)", 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: "int", nullable: false) | |||
| .Annotation("SqlServer:Identity", "1, 1"), | |||
| UserId = table.Column<int>(type: "int", nullable: false), | |||
| ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| ClaimValue = table.Column<string>(type: "nvarchar(max)", 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: "nvarchar(450)", nullable: false), | |||
| ProviderKey = table.Column<string>(type: "nvarchar(450)", nullable: false), | |||
| ProviderDisplayName = table.Column<string>(type: "nvarchar(max)", nullable: true), | |||
| UserId = table.Column<int>(type: "int", 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<int>(type: "int", nullable: false), | |||
| RoleId = table.Column<int>(type: "int", 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<int>(type: "int", nullable: false), | |||
| LoginProvider = table.Column<string>(type: "nvarchar(450)", nullable: false), | |||
| Name = table.Column<string>(type: "nvarchar(450)", nullable: false), | |||
| Value = table.Column<string>(type: "nvarchar(max)", 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, | |||
| filter: "[NormalizedName] IS NOT NULL"); | |||
| 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, | |||
| filter: "[NormalizedUserName] IS NOT NULL"); | |||
| } | |||
| 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"); | |||
| } | |||
| } | |||
| } | |||
| @@ -17,11 +17,41 @@ namespace Diligent.WebAPI.Data.Migrations | |||
| { | |||
| #pragma warning disable 612, 618 | |||
| modelBuilder | |||
| .HasAnnotation("ProductVersion", "6.0.3") | |||
| .HasAnnotation("ProductVersion", "6.0.10") | |||
| .HasAnnotation("Relational:MaxIdentifierLength", 128); | |||
| SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.AppRole", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ConcurrencyStamp") | |||
| .IsConcurrencyToken() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Name") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("NormalizedName") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("NormalizedName") | |||
| .IsUnique() | |||
| .HasDatabaseName("RoleNameIndex") | |||
| .HasFilter("[NormalizedName] IS NOT NULL"); | |||
| b.ToTable("AspNetRoles", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.InsuranceCompany", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| @@ -178,6 +208,82 @@ namespace Diligent.WebAPI.Data.Migrations | |||
| b.ToTable("Insurers"); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.User", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<int>("AccessFailedCount") | |||
| .HasColumnType("int"); | |||
| b.Property<string>("ConcurrencyStamp") | |||
| .IsConcurrencyToken() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("Email") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<bool>("EmailConfirmed") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("FirstName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("LastName") | |||
| .IsRequired() | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("LockoutEnabled") | |||
| .HasColumnType("bit"); | |||
| b.Property<DateTimeOffset?>("LockoutEnd") | |||
| .HasColumnType("datetimeoffset"); | |||
| b.Property<string>("NormalizedEmail") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("NormalizedUserName") | |||
| .HasMaxLength(256) | |||
| .HasColumnType("nvarchar(256)"); | |||
| b.Property<string>("PasswordHash") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("PhoneNumber") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("PhoneNumberConfirmed") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("SecurityStamp") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<bool>("TwoFactorEnabled") | |||
| .HasColumnType("bit"); | |||
| b.Property<string>("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", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.WebhookDefinition", b => | |||
| { | |||
| b.Property<long>("Id") | |||
| @@ -248,6 +354,109 @@ namespace Diligent.WebAPI.Data.Migrations | |||
| b.ToTable("WebhookSubscriptions"); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ClaimType") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("ClaimValue") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("RoleId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("RoleId"); | |||
| b.ToTable("AspNetRoleClaims", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b => | |||
| { | |||
| b.Property<int>("Id") | |||
| .ValueGeneratedOnAdd() | |||
| .HasColumnType("int"); | |||
| SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"), 1L, 1); | |||
| b.Property<string>("ClaimType") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<string>("ClaimValue") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("Id"); | |||
| b.HasIndex("UserId"); | |||
| b.ToTable("AspNetUserClaims", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b => | |||
| { | |||
| b.Property<string>("LoginProvider") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("ProviderKey") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("ProviderDisplayName") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("LoginProvider", "ProviderKey"); | |||
| b.HasIndex("UserId"); | |||
| b.ToTable("AspNetUserLogins", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b => | |||
| { | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.Property<int>("RoleId") | |||
| .HasColumnType("int"); | |||
| b.HasKey("UserId", "RoleId"); | |||
| b.HasIndex("RoleId"); | |||
| b.ToTable("AspNetUserRoles", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b => | |||
| { | |||
| b.Property<int>("UserId") | |||
| .HasColumnType("int"); | |||
| b.Property<string>("LoginProvider") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("Name") | |||
| .HasColumnType("nvarchar(450)"); | |||
| b.Property<string>("Value") | |||
| .HasColumnType("nvarchar(max)"); | |||
| b.HasKey("UserId", "LoginProvider", "Name"); | |||
| b.ToTable("AspNetUserTokens", (string)null); | |||
| }); | |||
| modelBuilder.Entity("Diligent.WebAPI.Data.Entities.InsurancePolicy", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.Insurer", "Insurer") | |||
| @@ -280,6 +489,57 @@ namespace Diligent.WebAPI.Data.Migrations | |||
| b.Navigation("WebhookDefinition"); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.AppRole", null) | |||
| .WithMany() | |||
| .HasForeignKey("RoleId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.AppRole", null) | |||
| .WithMany() | |||
| .HasForeignKey("RoleId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<int>", b => | |||
| { | |||
| b.HasOne("Diligent.WebAPI.Data.Entities.User", null) | |||
| .WithMany() | |||
| .HasForeignKey("UserId") | |||
| .OnDelete(DeleteBehavior.Cascade) | |||
| .IsRequired(); | |||
| }); | |||
| #pragma warning restore 612, 618 | |||
| } | |||
| } | |||
| @@ -2,4 +2,5 @@ | |||
| global using Microsoft.Extensions.Configuration; | |||
| global using Microsoft.Extensions.DependencyInjection; | |||
| global using System.ComponentModel.DataAnnotations; | |||
| global using Diligent.WebAPI.Data.Entities; | |||
| global using Diligent.WebAPI.Data.Entities; | |||
| global using Microsoft.AspNetCore.Identity.EntityFrameworkCore; | |||
| @@ -19,10 +19,18 @@ | |||
| return Ok("Hello from protected route"); | |||
| } | |||
| [HttpPost] | |||
| public async Task<IActionResult> CreateUser([FromBody]CreateUserRequestDto model) | |||
| { | |||
| await _userService.CreateUser(model); | |||
| return Ok(); | |||
| } | |||
| [HttpPost("authenticate")] | |||
| public IActionResult Authenticate([FromBody] AuthenticateRequestDto model) | |||
| public async Task<IActionResult> Authenticate([FromBody] AuthenticateRequestDto model) | |||
| { | |||
| var response = _userService.Authenticate(model); | |||
| var response = await _userService.Authenticate(model); | |||
| if (response == null) | |||
| return BadRequest(new { message = "Username or password is incorrect" }); | |||
| @@ -21,12 +21,17 @@ | |||
| <ItemGroup> | |||
| <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" /> | |||
| <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.9" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.2.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.0.0" /> | |||
| <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="5.0.0" /> | |||
| <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.3"> | |||
| <PrivateAssets>all</PrivateAssets> | |||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | |||
| </PackageReference> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="6.0.10" /> | |||
| <PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="6.0.10" /> | |||
| <PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.2" /> | |||
| <PackageReference Include="Serilog.AspNetCore" Version="5.0.0" /> | |||
| <PackageReference Include="Serilog.Sinks.Seq" Version="5.1.1" /> | |||
| @@ -8,6 +8,7 @@ | |||
| public static void ConfigureHost(this WebApplicationBuilder builder) | |||
| { | |||
| builder.ConfigureAuth(); | |||
| builder.ConfigureIdentity(); | |||
| builder.ConfigureValidationMiddleware(); | |||
| builder.ConfigureSwagger(); | |||
| @@ -0,0 +1,16 @@ | |||
| | |||
| namespace Diligent.WebAPI.Host.Extensions | |||
| { | |||
| public static class IdentityConfigurationExtension | |||
| { | |||
| public static void ConfigureIdentity(this WebApplicationBuilder builder) | |||
| { | |||
| IServiceCollection services = builder.Services; | |||
| services.AddIdentity<User, AppRole>() | |||
| .AddRoles<AppRole>() | |||
| .AddEntityFrameworkStores<DatabaseContext>() | |||
| .AddDefaultTokenProviders(); | |||
| } | |||
| } | |||
| } | |||
| @@ -3,6 +3,7 @@ global using Diligent.WebAPI.Host.Middlewares; | |||
| global using Diligent.WebAPI.Host.Options; | |||
| global using Diligent.WebAPI.Host.Attributes; | |||
| global using Diligent.WebAPI.Data; | |||
| global using Diligent.WebAPI.Data.Extensions; | |||
| global using Diligent.WebAPI.Data.Entities; | |||
| @@ -32,4 +33,5 @@ global using System.Net; | |||
| global using System.Text; | |||
| global using System.IdentityModel.Tokens.Jwt; | |||
| global using AutoMapper; | |||
| global using Swashbuckle.AspNetCore.SwaggerGen; | |||
| global using Swashbuckle.AspNetCore.SwaggerGen; | |||
| global using Microsoft.AspNetCore.Identity; | |||
| @@ -1,6 +1,6 @@ | |||
| { | |||
| "ConnectionStrings": { | |||
| "WebApi": "Data Source=localhost,2433;User=sa;Password=developer_pw;Initial Catalog=WebApiDB;MultipleActiveResultSets=True" | |||
| "WebApi": "Server=.;Database=HRCenter;Trusted_Connection=True;MultipleActiveResultSets=true" | |||
| }, | |||
| "Authorization": { | |||
| "Secret": "SECRET_ASKGFH#$_#((Y)#I%EWJGDSJTGKEOS@$SAF" | |||