Skip to content

Commit b96bc39

Browse files
committed
WIP Identity
1 parent f3c2bc9 commit b96bc39

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+557
-307
lines changed

src/Learn.Server.Data.SqlServer/Identity/Models/IdentityUser.cs renamed to src/Learn.Server.Data.Abstractions/ApplicationUser.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
using Microsoft.AspNetCore.Identity;
22
using System;
33

4-
namespace Learn.Server.Data.SqlServer.Identity.Models
4+
namespace Learn.Server.Data
55
{
6-
public class IdentityUser : IdentityUser<int>
6+
public class ApplicationUser : IdentityUser
77
{
8+
public override string Id
9+
{
10+
get => base.Id;
11+
set
12+
{
13+
if (value != null && !int.TryParse(value, out var _))
14+
{
15+
throw new ArgumentOutOfRangeException(nameof(value));
16+
}
17+
18+
base.Id = value;
19+
}
20+
}
21+
822
public override string ConcurrencyStamp
923
{
1024
get => base.ConcurrencyStamp;

src/Learn.Server.Data.Abstractions/Learn.Server.Data.Abstractions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<PrivateAssets>all</PrivateAssets>
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
</PackageReference>
14+
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="3.1.8" />
1415
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.13.1.21947">
1516
<PrivateAssets>all</PrivateAssets>
1617
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

src/Learn.Server.Data.SqlServer.Database/Learn.Server.Data.SqlServer.Database.sqlproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<Folder Include="Scripts" />
6868
<Folder Include="Tables\Identity" />
6969
<Folder Include="Procedures\Identity" />
70+
<Folder Include="Procedures\Identity\User" />
7071
</ItemGroup>
7172
<ItemGroup>
7273
<Build Include="Tables\CoursePath.sql" />
@@ -87,8 +88,12 @@
8788
<Build Include="Tables\Identity\UserLogin.sql" />
8889
<Build Include="Tables\Identity\UserRole.sql" />
8990
<Build Include="Tables\Identity\UserToken.sql" />
90-
<Build Include="Procedures\Identity\CreateUser.sql" />
9191
<Build Include="Tables\Audit\UserAudit.sql" />
92+
<Build Include="Procedures\Identity\User\CreateUser.sql" />
93+
<Build Include="Procedures\Identity\User\DeleteUser.sql" />
94+
<Build Include="Procedures\Identity\User\FindUserById.sql" />
95+
<Build Include="Procedures\Identity\User\FindUserByNormalizedUserName.sql" />
96+
<Build Include="Procedures\Identity\User\UpdateUser.sql" />
9297
</ItemGroup>
9398
<ItemGroup>
9499
<None Include="Learn.Server.Data.SqlServer.Database.publish.xml">

src/Learn.Server.Data.SqlServer.Database/Procedures/Identity/CreateUser.sql renamed to src/Learn.Server.Data.SqlServer.Database/Procedures/Identity/User/CreateUser.sql

File renamed without changes.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
CREATE PROCEDURE [Identity].[DeleteUser]
2+
@Id INT,
3+
@ConcurrencyStamp UNIQUEIDENTIFIER
4+
AS
5+
6+
SET NOCOUNT ON;
7+
SET XACT_ABORT ON;
8+
9+
DECLARE @AuditId INT = NEXT VALUE FOR [Audit].[UserAuditSequence];
10+
DECLARE @AuditTypeId INT = (SELECT [Id] FROM [Audit].[AuditType] WHERE [Name] = 'DELETED');
11+
DECLARE @AuditTimestamp DATETIMEOFFSET = SYSDATETIMEOFFSET();
12+
13+
DELETE [Identity].[User]
14+
15+
OUTPUT
16+
17+
@AuditId,
18+
@AuditTypeId,
19+
@AuditTimestamp,
20+
21+
[deleted].[Id],
22+
[deleted].[UserName],
23+
[deleted].[NormalizedUserName],
24+
[deleted].[Email],
25+
[deleted].[NormalizedEmail],
26+
[deleted].[EmailConfirmed],
27+
[deleted].[PasswordHash],
28+
[deleted].[SecurityStamp],
29+
[deleted].[ConcurrencyStamp],
30+
[deleted].[PhoneNumber],
31+
[deleted].[PhoneNumberConfirmed],
32+
[deleted].[TwoFactorEnabled],
33+
[deleted].[LockoutEnd],
34+
[deleted].[LockoutEnabled],
35+
[deleted].[AccessFailedCount]
36+
37+
INTO [Audit].[UserAudit]
38+
(
39+
[AuditId],
40+
[AuditTypeId],
41+
[AuditTimestamp],
42+
43+
[Id],
44+
[UserName],
45+
[NormalizedUserName],
46+
[Email],
47+
[NormalizedEmail],
48+
[EmailConfirmed],
49+
[PasswordHash],
50+
[SecurityStamp],
51+
[ConcurrencyStamp],
52+
[PhoneNumber],
53+
[PhoneNumberConfirmed],
54+
[TwoFactorEnabled],
55+
[LockoutEnd],
56+
[LockoutEnabled],
57+
[AccessFailedCount]
58+
)
59+
60+
OUTPUT
61+
62+
[deleted].[Id],
63+
[deleted].[UserName],
64+
[deleted].[NormalizedUserName],
65+
[deleted].[Email],
66+
[deleted].[NormalizedEmail],
67+
[deleted].[EmailConfirmed],
68+
[deleted].[PasswordHash],
69+
[deleted].[SecurityStamp],
70+
[deleted].[ConcurrencyStamp],
71+
[deleted].[PhoneNumber],
72+
[deleted].[PhoneNumberConfirmed],
73+
[deleted].[TwoFactorEnabled],
74+
[deleted].[LockoutEnd],
75+
[deleted].[LockoutEnabled],
76+
[deleted].[AccessFailedCount]
77+
78+
WHERE
79+
[Id] = @Id
80+
AND [ConcurrencyStamp] = @ConcurrencyStamp
81+
82+
RETURN 0;
83+
GO
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
CREATE PROCEDURE [Identity].[FindUserById]
2+
@Id INT
3+
AS
4+
5+
SET NOCOUNT ON;
6+
SET XACT_ABORT ON;
7+
8+
SELECT
9+
10+
[Id],
11+
[UserName],
12+
[NormalizedUserName],
13+
[Email],
14+
[NormalizedEmail],
15+
[EmailConfirmed],
16+
[PasswordHash],
17+
[SecurityStamp],
18+
[ConcurrencyStamp],
19+
[PhoneNumber],
20+
[PhoneNumberConfirmed],
21+
[TwoFactorEnabled],
22+
[LockoutEnd],
23+
[LockoutEnabled],
24+
[AccessFailedCount]
25+
26+
FROM
27+
[Identity].[User]
28+
29+
WHERE
30+
[Id] = @Id
31+
32+
RETURN 0;
33+
GO
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
CREATE PROCEDURE [Identity].[FindUserByNormalizedUserName]
2+
@NormalizedUserName NVARCHAR(255)
3+
AS
4+
5+
SET NOCOUNT ON;
6+
SET XACT_ABORT ON;
7+
8+
SELECT
9+
10+
[Id],
11+
[UserName],
12+
[NormalizedUserName],
13+
[Email],
14+
[NormalizedEmail],
15+
[EmailConfirmed],
16+
[PasswordHash],
17+
[SecurityStamp],
18+
[ConcurrencyStamp],
19+
[PhoneNumber],
20+
[PhoneNumberConfirmed],
21+
[TwoFactorEnabled],
22+
[LockoutEnd],
23+
[LockoutEnabled],
24+
[AccessFailedCount]
25+
26+
FROM
27+
[Identity].[User]
28+
29+
WHERE
30+
[NormalizedUserName] = @NormalizedUserName
31+
32+
RETURN 0;
33+
GO
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
CREATE PROCEDURE [Identity].[UpdateUser]
2+
@Id INT,
3+
@UserName NVARCHAR(255),
4+
@NormalizedUserName NVARCHAR(255),
5+
@Email NVARCHAR(255),
6+
@NormalizedEmail NVARCHAR(255),
7+
@EmailConfirmed BIT,
8+
@PasswordHash NVARCHAR(255),
9+
@PhoneNumber NVARCHAR(255),
10+
@PhoneNumberConfirmed BIT,
11+
@TwoFactorEnabled BIT,
12+
@LockoutEnd DATETIMEOFFSET,
13+
@LockoutEnabled BIT,
14+
@AccessFailedCount INT,
15+
@SecurityStamp UNIQUEIDENTIFIER,
16+
@ConcurrencyStamp UNIQUEIDENTIFIER
17+
AS
18+
19+
SET NOCOUNT ON;
20+
SET XACT_ABORT ON;
21+
22+
DECLARE @NewConcurrencyStamp UNIQUEIDENTIFIER = NEWID();
23+
24+
DECLARE @AuditId INT = NEXT VALUE FOR [Audit].[UserAuditSequence];
25+
DECLARE @AuditTypeId INT = (SELECT [Id] FROM [Audit].[AuditType] WHERE [Name] = 'UPDATED');
26+
DECLARE @AuditTimestamp DATETIMEOFFSET = SYSDATETIMEOFFSET();
27+
28+
UPDATE [Identity].[User]
29+
SET
30+
[UserName] = @UserName,
31+
[NormalizedUserName] = @NormalizedUserName,
32+
[Email] = @Email,
33+
[NormalizedEmail] = @NormalizedEmail,
34+
[EmailConfirmed] = @EmailConfirmed,
35+
[PasswordHash] = @PasswordHash,
36+
[PhoneNumber] = @PhoneNumber,
37+
[PhoneNumberConfirmed] = @PhoneNumberConfirmed,
38+
[TwoFactorEnabled] = @TwoFactorEnabled,
39+
[LockoutEnd] = @LockoutEnd,
40+
[LockoutEnabled] = @LockoutEnabled,
41+
[AccessFailedCount] = @AccessFailedCount,
42+
[SecurityStamp] = @SecurityStamp,
43+
[ConcurrencyStamp] = @NewConcurrencyStamp
44+
45+
OUTPUT
46+
47+
@AuditId,
48+
@AuditTypeId,
49+
@AuditTimestamp,
50+
51+
[inserted].[Id],
52+
[inserted].[UserName],
53+
[inserted].[NormalizedUserName],
54+
[inserted].[Email],
55+
[inserted].[NormalizedEmail],
56+
[inserted].[EmailConfirmed],
57+
[inserted].[PasswordHash],
58+
[inserted].[SecurityStamp],
59+
[inserted].[ConcurrencyStamp],
60+
[inserted].[PhoneNumber],
61+
[inserted].[PhoneNumberConfirmed],
62+
[inserted].[TwoFactorEnabled],
63+
[inserted].[LockoutEnd],
64+
[inserted].[LockoutEnabled],
65+
[inserted].[AccessFailedCount]
66+
67+
INTO [Audit].[UserAudit]
68+
(
69+
[AuditId],
70+
[AuditTypeId],
71+
[AuditTimestamp],
72+
73+
[Id],
74+
[UserName],
75+
[NormalizedUserName],
76+
[Email],
77+
[NormalizedEmail],
78+
[EmailConfirmed],
79+
[PasswordHash],
80+
[SecurityStamp],
81+
[ConcurrencyStamp],
82+
[PhoneNumber],
83+
[PhoneNumberConfirmed],
84+
[TwoFactorEnabled],
85+
[LockoutEnd],
86+
[LockoutEnabled],
87+
[AccessFailedCount]
88+
)
89+
90+
OUTPUT
91+
92+
[inserted].[Id],
93+
[inserted].[UserName],
94+
[inserted].[NormalizedUserName],
95+
[inserted].[Email],
96+
[inserted].[NormalizedEmail],
97+
[inserted].[EmailConfirmed],
98+
[inserted].[PasswordHash],
99+
[inserted].[SecurityStamp],
100+
[inserted].[ConcurrencyStamp],
101+
[inserted].[PhoneNumber],
102+
[inserted].[PhoneNumberConfirmed],
103+
[inserted].[TwoFactorEnabled],
104+
[inserted].[LockoutEnd],
105+
[inserted].[LockoutEnabled],
106+
[inserted].[AccessFailedCount]
107+
108+
WHERE
109+
[Id] = @Id
110+
AND [ConcurrencyStamp] = @ConcurrencyStamp
111+
112+
RETURN 0;
113+
GO

src/Learn.Server.Data.SqlServer.Database/Scripts/Script.PostDeployment.Seed.Audit.AuditType.sql

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
WITH [Source] AS
33
(
44
SELECT
5-
[Key],
5+
[Id],
66
[Name]
77
FROM
88
(
@@ -11,23 +11,23 @@ WITH [Source] AS
1111
(2, 'UPDATED'),
1212
(3, 'DELETED')
1313

14-
) AS [X] ([Key], [Name])
14+
) AS [X] ([Id], [Name])
1515
)
1616
MERGE [Audit].[AuditType] AS [Target]
1717
USING [Source]
18-
ON [Source].[Key] = [Target].[Key]
18+
ON [Source].[Id] = [Target].[Id]
1919
WHEN MATCHED AND [Target].[Name] != [Source].[Name] THEN
2020
UPDATE SET
2121
[Name] = [Source].[Name]
2222
WHEN NOT MATCHED BY TARGET THEN
2323
INSERT
2424
(
25-
[Key],
25+
[Id],
2626
[Name]
2727
)
2828
VALUES
2929
(
30-
[Key],
30+
[Id],
3131
[Name]
3232
)
3333
WHEN NOT MATCHED BY SOURCE THEN

src/Learn.Server.Data.SqlServer.Database/Tables/Identity/User.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
[PhoneNumber] NVARCHAR(255) NOT NULL,
1313
[PhoneNumberConfirmed] BIT NOT NULL,
1414
[TwoFactorEnabled] BIT NOT NULL,
15-
[LockoutEnd] DATETIMEOFFSET NOT NULL,
15+
[LockoutEnd] DATETIMEOFFSET NULL,
1616
[LockoutEnabled] BIT NOT NULL,
1717
[AccessFailedCount] INT NOT NULL,
1818

0 commit comments

Comments
 (0)