From ebbf90476da983d7e1b7fec1acf4d837bf2fa63a Mon Sep 17 00:00:00 2001 From: Koval1997 Date: Mon, 10 Oct 2022 13:50:47 +0500 Subject: [PATCH 01/49] chore: clear solution --- AspNetCore.JwtAuthentication.sln | 168 +------------------------------ 1 file changed, 5 insertions(+), 163 deletions(-) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index e1ce8a8..bbeb505 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -5,60 +5,7 @@ VisualStudioVersion = 17.0.31919.166 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Core", "JwtAuthentication.Core\JwtAuthentication.Core.csproj", "{5F9739DA-4676-4B13-BE6C-5F5194AFE812}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{330BB423-781B-4A8C-BBC9-2F95B5349B2A}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.BaseAuthentication", "Examples\Example.NetCore5.0.BaseAuthentication\Example.NetCore5.0.BaseAuthentication.csproj", "{36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.PermissionBasedAuthorization", "Examples\Example.NetCore5.0.PermissionBasedAuthorization\Example.NetCore5.0.PermissionBasedAuthorization.csproj", "{51E0C282-0942-4367-95EB-F248E80A5D6F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.WithCredentialsValidator", "Examples\Example.NetCore5.0.WithCredentialsValidator\Example.NetCore5.0.WithCredentialsValidator.csproj", "{E2BC2C97-161E-41E4-B224-DFC62AD56768}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.0.BaseAuthentication", "Examples\Example.NetCore3.0.BaseAuthentication\Example.NetCore3.0.BaseAuthentication.csproj", "{6AB1E6C4-563A-4447-8024-6C31C9A45141}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.1.BaseAuthentication", "Examples\Example.NetCore3.1.BaseAuthentication\Example.NetCore3.1.BaseAuthentication.csproj", "{43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.CookiesBasedAuthentication", "Examples\Example.NetCore5.0.CookiesBasedAuthentication\Example.NetCore5.0.CookiesBasedAuthentication.csproj", "{32E74378-AAF5-4CA6-8633-30997453E58A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore5.0.AuthenticationUsingIdentityUser\Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj", "{1DF1D001-0194-4CD8-82DD-40AF57FC1432}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore5.0.AuthenticationWithRefreshToken\Example.NetCore5.0.AuthenticationWithRefreshToken.csproj", "{12915347-991A-4EA0-983D-03121E1C527B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Examples\Tests\Tests.csproj", "{EF8EF2D5-9483-400E-B938-ADDB467BF300}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.BaseAuthentication", "Examples\Example.NetCore6.0.BaseAuthentication\Example.NetCore6.0.BaseAuthentication.csproj", "{DDA26737-950C-4B23-B66A-1733FB482A29}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore5.0", "NetCore5.0", "{7A925031-2656-4CEB-821A-D76739E0E5A2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore3.", "NetCore3.", "{614DB4C6-A4BE-4BBF-B385-C34985CA1FC3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore6.0", "NetCore6.0", "{4FF83CB3-A634-4D07-BEE0-B5391B86F071}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingIdentityUser\Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj", "{28707296-5273-471B-89FB-FA3D6C62CA67}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore6.0.AuthenticationWithRefreshToken\Example.NetCore6.0.AuthenticationWithRefreshToken.csproj", "{5AE1CC8C-80A2-46AF-A02E-BE129080F489}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.CookiesBasedAuthentication", "Examples\Example.NetCore6.0.CookiesBasedAuthentication\Example.NetCore6.0.CookiesBasedAuthentication.csproj", "{E3C800A0-012F-4440-BD78-813FE51F4830}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.PermissionBasedAuthorization", "Examples\Example.NetCore6.0.PermissionBasedAuthorization\Example.NetCore6.0.PermissionBasedAuthorization.csproj", "{421DEC55-2DF8-4DCB-B53D-ED59C15062A2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.WithCredentialsValidator", "Examples\Example.NetCore6.0.WithCredentialsValidator\Example.NetCore6.0.WithCredentialsValidator.csproj", "{2652FCF8-3604-435E-8963-92A4A365FA33}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj", "{C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore6.0.RefreshTokenWithConfidenceInterval\Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj", "{ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore5.0.RefreshTokenWithConfidenceInterval\Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{FCB88633-BC91-4F64-8BA5-00C43608D012}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -70,119 +17,14 @@ Global {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.Build.0 = Release|Any CPU - {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.Build.0 = Release|Any CPU - {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.Build.0 = Release|Any CPU - {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.Build.0 = Release|Any CPU - {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.Build.0 = Release|Any CPU - {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.Build.0 = Release|Any CPU - {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.Build.0 = Release|Any CPU - {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.Build.0 = Release|Any CPU - {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.Build.0 = Release|Any CPU - {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.Build.0 = Release|Any CPU - {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.Build.0 = Release|Any CPU - {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.Build.0 = Release|Any CPU - {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.Build.0 = Release|Any CPU - {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.Build.0 = Release|Any CPU - {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.Build.0 = Release|Any CPU - {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.Build.0 = Release|Any CPU - {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.Build.0 = Release|Any CPU - {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.Build.0 = Release|Any CPU - {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.Build.0 = Release|Any CPU - {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.Build.0 = Release|Any CPU - {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.Build.0 = Release|Any CPU - {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.Build.0 = Release|Any CPU + {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {51E0C282-0942-4367-95EB-F248E80A5D6F} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {E2BC2C97-161E-41E4-B224-DFC62AD56768} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {6AB1E6C4-563A-4447-8024-6C31C9A45141} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} - {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} - {32E74378-AAF5-4CA6-8633-30997453E58A} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {1DF1D001-0194-4CD8-82DD-40AF57FC1432} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {12915347-991A-4EA0-983D-03121E1C527B} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {EF8EF2D5-9483-400E-B938-ADDB467BF300} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} - {DDA26737-950C-4B23-B66A-1733FB482A29} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {7A925031-2656-4CEB-821A-D76739E0E5A2} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} - {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} - {4FF83CB3-A634-4D07-BEE0-B5391B86F071} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} - {28707296-5273-471B-89FB-FA3D6C62CA67} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {5AE1CC8C-80A2-46AF-A02E-BE129080F489} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {E3C800A0-012F-4440-BD78-813FE51F4830} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {421DEC55-2DF8-4DCB-B53D-ED59C15062A2} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {2652FCF8-3604-435E-8963-92A4A365FA33} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} - {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} EndGlobalSection From d3e7adc85a49f175fa9fa005ac3a5179c8bdfbb8 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:08:12 +0500 Subject: [PATCH 02/49] chore(Assets): #65: move logo from solution to project --- .../Assets}/logo.png | Bin JwtAuthentication.Identity/Assets/logo.png | Bin 0 -> 249532 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename {Assets => JwtAuthentication.Core/Assets}/logo.png (100%) create mode 100644 JwtAuthentication.Identity/Assets/logo.png diff --git a/Assets/logo.png b/JwtAuthentication.Core/Assets/logo.png similarity index 100% rename from Assets/logo.png rename to JwtAuthentication.Core/Assets/logo.png diff --git a/JwtAuthentication.Identity/Assets/logo.png b/JwtAuthentication.Identity/Assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7 GIT binary patch literal 249532 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%0A5ROakV*}qlU(Z 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 z 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 literal 0 HcmV?d00001 From 927b3e6b6f628d2d75dc8f0c46634c1bd7ff5658 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:10:47 +0500 Subject: [PATCH 03/49] chore(Assets): #65: add links to logo in csproj files --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 4 ++++ JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index f02336f..4e2c054 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -49,4 +49,8 @@ + + + + diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index 7aa760b..a3eab6b 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -35,4 +35,8 @@ + + + + From e0e3be9b0d66351a7638b0058e018ea446c1ddd2 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:11:13 +0500 Subject: [PATCH 04/49] chore: add .idea folder to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 57b82a5..c9840a1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ **/.vs/* **.user **/lib/* +**/.idea/* -*Backup.* \ No newline at end of file +*Backup.* From 877432fe342cfb764af6335ba7716f12edfff0a8 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Mon, 9 Jun 2025 11:20:55 +0500 Subject: [PATCH 05/49] =?UTF-8?q?chore(Assets):=20#65:=20update=20logo=20f?= =?UTF-8?q?ile=20to=20128=C3=97128=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JwtAuthentication.Core/Assets/logo.png | Bin 249532 -> 19815 bytes JwtAuthentication.Identity/Assets/logo.png | Bin 249532 -> 19815 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/JwtAuthentication.Core/Assets/logo.png b/JwtAuthentication.Core/Assets/logo.png index 2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7..02816870c0ca1b9e1bc9f313880bc96910280be7 100644 GIT binary patch literal 19815 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�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 SC5oN^0000bNn=KgovXEY*+KP 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%0A5ROakV*}qlU(Z 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 z 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 diff --git a/JwtAuthentication.Identity/Assets/logo.png b/JwtAuthentication.Identity/Assets/logo.png index 2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7..02816870c0ca1b9e1bc9f313880bc96910280be7 100644 GIT binary patch literal 19815 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�|vad;i5j61p~^)cVIW^N2K9jH}Br4%&*?`xDVbGYKHyW!!Uy*8 z?D&`#Zd;jVT6Cp_y^~AB%V-ZapCw77C0l?cMgf8AM(I&EVU}w41_{%`GF~Y-C=6x4 zfVyGUG%QZ^*efipRxGS0D24T+>}^aW)dVU6t%;ybApp=?C~^)?ta2@xp_O7ww^T|_ zd}(j?5gf8{@t;a2z>QK(X)Kk2(kg;h1U!L&4QXscP)t?L+_a2U!?fQe;AmZmNekM- zGNWZ!^hu1NQd8_{3r{`<#8xx!C{-)eGJ#qtN++Lfs|{?2z;;tJF^1nMIx=GJ_`1v^ z9@kRIy28kTrsS(9cPJF2u7Q`_6RBQF?9@i1O`uhQy%uIh)7Oe=(9C?`K*56{FjG1XmI(5_3P%S{ zlr@9{;Q^*AkR52&POc+eGyl_Tc?w{BQ3i7t0c`826NAn?RVT&N0bgY3dCNkTl&f9Z zAZ%f&l`y!C6JaQck3(Hk+5|-qDR#PW^0;Du1XPsct6X!My2!a;a~?D$r^5jl%UI`x zP?L~y%&(w;gVa&!fKw@pB+$rNGR&XNc;FiLaR@jh3y<#cML>c~SEMWq}Uyyd!5?0e6Xt>=1Tc|L)0>3P5;0!*72 zb!1k)cXPnOqvxd;{DWK2Sp%~VZM(WGu`SU8gw@8_mEBGtC{4feq>ZA?G-=bK2vk<% zQ_FtW(r87cG?PTrZ4I47voUY5bqkFn^MRsj=*=sbE|k>MYZw+>swUj4xA{QlPQE+@ zb^}bTW7p4cXq0YgXemNVhaO64N+T{Ii9X@bQOu2^QZO|dACkxlTWsjkwq5|4tEqiU zsTJA;`Yq@zXL#avj$_#0yGCss4^3yBIN`Cafy`sP#VD94*!O{v4?KkD@!)xD+j9S5 z>ewTbM%y5%Zlhw=&^AmSfy*~Q$L=Ppp)5C-CAK9-0e*O;qwKF+!`F@-PI&@~Hh5aA z=wBV9s|IHc^Ik$?G?%E^QkJ`dr)yyyq>fN)5@XSg!%s`ad;*iPWZ+a_nmE#G#%8VX zRJ=Q@_{Olx03&WvD?Eldj)`jMgp3l8R*E7h9N<(S5J=OdejiMr^(j8dps5+PEA)(_YbT5nSXbb*ViFuR&<6$zM!-9K;8Il!`)KV^ z1(7u|^fRIaIM~?|7jUJ4)432+%>tTgZCO%Vo&sdHC$YAs)sAi>55a3iaE`_*>L#EE z1>LG47|oSnc$-dnUR?qT6#}hR*s`K+Tk3i)arB~r7!2TA+CypwZbcfQCh-Ra!k6QbrsuLPGSt1GK?@N zwO~;hntF<{hPF50DlMbMgrBQhez=>_Do^1R*R|ovpxA9&E_%l$LQFfyVwJ-xVq!9B zT*Ka;45PksUg{9?O2WVC9#BIyI<_paEioOeGeO>tu~pdCVM4$qhFaCQUcoE{S13%X zdCXYe7Uw1JY8lTnN;S$g^sJ?^j=ZtB#Y9HFDh=!FFrT724%f8Ymvk8!!+~1xPG9rI zDrJbJjkvxc5NJ_B%JM&PX*5Afg;7dlm6D$+2_J$jC_4kFX6UR>9TdS;%o5AK?J~<# zwD&kwGpQVp?3KK!D)~#jjG^-sUel)qm7)&^UzCSKG2$!)9g9hu7RGZq&ISwHm%(Rn zWeR8df-BMjdTOg3t4&?)FH>b3Uc2QCr*v0efhiy~Ab4hC^ zMsuK{G!h!tiDjBtMk^huy+7=)+dPIzEp6*L?JF8D9Xvlr%|USN(r{Tdj8vdho{E<0 zuq6EEjY`xH5O9by@aV`Rh5#NKNd9823p?9zFqfoIuaM@|v@7A@ z;xu^GU6$CEX90ZhQUu|!XyN_|7_0HxW3@+3OJ=JXyFD9goX?Mpn~qbg{EaXyD0$xoTN41{DIAbc%HJG~8$bo6<9e6phAED<}66JT7>&5|n*N z5jdb#0TmQA9-|aqK?t6OawMw28Oi#MXlYVQsag)2iu0<*B${hIO>faMQ4XqWJRI&M zGburNyw{9F;JP-<<_j)pC4`QN$toS^36xs$46YJoSnb0@a~Nz$af*(Kutf#4S+*>( zEl&Zo(o%XI7@L;e+>jVYH&{#v^cBo9n1q@|6OK%u6QB4Vt$DtIo`FH*&{;;v9n&^2 zKE4vxp1iKax+r#B$)s%2pM1P4Qnc4qBLD#T+Qev3a1<sDWr1J89k{*Bh?6!9=KeJW1A}WHCR!cba`yx zQgZ?L1vteY`Uc(3FxGH;P@Fobn0He~8Js^e;J#kxC}rv$c*iwuSW%jxRh&#Llh%=D zhDn|9q)F7`%U&2xzwcqysuW}HQ#B)AK#idYjhf3I24Mx|T3S9z* zK)?k@t6_>KN23VrYlrcQ34xjNBuXL=jb~0x8{ojVe4wp(v#!M?6RVZ2l6ru(0GWcV z`}v*CFXAhl<_0iU8WjTPb%@liKPpV|m4t%x3C#Av-+=u>x}G`?s*V(-jQ60`koLf( zOT%uj1Dw}X z2UAWIhDEN}?-+K+pz`&`6wSfJSlEYR)vCOD527AZZ&ilQ44? zlWxLCZtU~llQA6BuwKUAz!I1M8=wO3)N@|s=B((zC1xB`1w*o%r^_$!T&ESV7;0)P zQxv-)a6z@~1JI&T4A9(5%Qc%IbdHZ{GicA@l^UPDAs}L7Z#H?FP z+v)&x_*Yo|YA_5#%cE*RUk5tDkf11)XGUOzC&zPznrj4ZsG2v@A{?GQx;Hfknpip9 zio&TwD`4d->p<7Z0I1yu`M{YkV&sKpep3_k`!O|5>*I7ZCl+M74Yvh2xDMGMmZBw+ z8)y_HtzeB>L#MMe6u3ktFwv}PII!Xe7qytYgOTL6QIMuw+uoL+gRl@r%P_@hDHb8k z0L8DM`14Img+&=pccggCYg~B^ztZ95ZNqy)gUk?e@v8t;A@x`eSny%Bh9Tjjq2VPc zPN@V%V2bAf8Z?^QLd(0AVyqi3DUYL#T|IH&6b<5DB+G}2J5XtPFI9;74+|Mj-#Q2n z@`It|yG)Nah1eUYm3&uP?r$;|Yq_W)-<3H8|Mh+-`p`}#f2|rBhGmS*BX;AXKEx%g z*5f2Bn%0f6HDDvp*>a0*L?V++sEQX-%+Hj<#?_h^>!KpC$S z1x6JWEJSzL$Tfn6P)p-SlF3o>MT;9h%18Pyj>9QpuL7~)RA(~ON@>`-3TruB7=s(i zHH)51B%5zbC6cu=nWWoYY8A)w6d=z6Hu^vpAB1)y)DYzK&bpLt+Ny+P1u)W*?P8Xz zbw}g~nhR;lW#4kjd3Fa~Y_Fqq+hftrIaQp53y;HzJ;W~;$Z+49qr%V`vO_hX`9*48 zL*Q{7BIsB!sv7xzSj=(r(WrRs9BBloxfyl}oRt4pnJ58~(@$a@VR(>t*?XXlGlPMf ziclT4rH{dkK(E5@z6;b!d~GclD(!+PWWc5BLVrb$vsuzwo-SS9vIGk@6>>&}qpRx( z`0}oF@U}Iu05^}3Ky2DL?8h@Yo(yjJ^;Ge`3@&yoyP2WW?J?}G(#`t(O!oyc+c(7i zzK{Yrgf$2Q0cHp{0V$}O-(tZ-%#O_X;n_1P=HmmAo7j;`ViJz##Rj=PH8&%Um`e~K z+8|1xfi6@JL$fVF*XY=F>_MeM^R}&wsNGnFcYFwR5#3@UvkdE6+(1yEQ&2gC0v!Ei ziEVibaOatnWGJDHLM%ZNn>4C8jU!8B?!Oa|M$(Ie5)WNRYzsf^>rK$o#z-$wJU1+0cRH6-NGJlC@Gm~hiQ z1j#EN?f5EwEr4D59wq_`bq=~Cm_P+->=->1L8O<@7@{fYcI5oRW*6oOTwOr1B9<_X zvxV}$97~@habt%bGcw@{woUJZHzc$fCvU*deMu zOq1#;BxCr4y5hOd}R_;8+bye>J>8rV&wZ{Hs7%BVm9bU>A{FR%~caMH8ornwJ9 zMTmfo7Q$3suC62a;&5PR&XFP*ZZ?>x!|ScfwN)ms>1&ui1nOnTXnQ4Kv5MKhj+bL+ z-+n)I)2P6$lz(Trl!Q-90ntq>_ghzRtn<6e65H}DKogW4({4n_A)0Ze1nJJ_atw@X zK+mP?mH>nN;}2! zvC$)mslKRmA&ome0z2YVab@KiVHea)c6YsxaJ^mI{Bc|IU!b%|YK-IwXV?bZ*2Ry_LZX&}U{Uo}IP6TxwVc`}d=`hAi*|+ww zVWR{31UGpI)06w~NLjckx=t)w@bR^r^l!=O<|r+yAPLY1b; z(Qw7X<6KM%^#V4|z@<63HK

^?<$rCY2(QK?#gS=qg9dcO7?f06(XgCYrjgQk)6W_?WRXI;5_hTtwUBG65()Ws z!4G8jy8tHt81+|RGU@YY6z2vY!qR~1fISB4B!uhHHAFC}5Aj31m{Kv_+sM7RxiEy& zDVRp)3YDpxjr7P4^f%<}V)BR&7UF*LuH0ws#X=bc-BrkvcZl^`&RU)-b&D6#IJmI` z7q7_)+U-K7d<`<0nh}&ReTy2l_JtGQoe04Zkg#Z83Qypb%>vzsrfUKIBB+aqRT{*P9?7T>r+=gcq2s7yAexxghWD)y1mjuYk?eQ7v%`M zd4Q}Dz!)02uR}20>&H2Zsc-=XNZk8K^YPMT#xfNkF%_wWoe3<0?9>1}dI4^12_{(I z0Jkoq)%spI0h0nP)JdG|F%cY*bt8dO%UM7g>DaZo2yeI^AKV;fBVlScx^k}IdL}#6 zYVf)2D4&Q4J`CBYBFIW(CNd6o2z4Y~>Z3{3BV(wd#Q@Mkj5H0* z4QwC4>L!eDz?}}xq;f41A%s+r_HC8Qs27!SbAB*RgkXjcj>$BTFplwj99S9lMc4}Y znLearJ%nz2pNVk%DiI;N8upz`5qq?T-H*Vz6O#I!l+p&?I^jfobbo35oOL7CMroN$ zrZY(OJB3AE-ddglxUkLEjo0z4v+reV?HCU}0{yO_|3OdMrrTP4>fq(DdmY~We)!tg zMsqqBe;5!~psno6c`K$m&tfGFac4ULSC5~EsT1K{)sStW<* zMKVV@dC;Mjzcp4uLB9Ys6%vOPA&68;Jd!-VK8CCQK#EfcFg0*Ffd}{DePikQpBAwA zW%!4^p8Cv5x~X( z9@~d!4<$5Qiy({`h4@4``I{$pr1J1-IXbAak-rW72;_!HU(Y;R3=L`(!VQToLL=9y zHEeg`nukZu!vojgatFpiA{~eH`b}@ZZ~PBv3OIR24!Sz*UacEB_aHgsCt_97c^_Qd4*GS1cYF=O^I`Es2~ zB%zT_R~P}1^*#*N;N9<$bAEd9LCqI%Erre%IC)xzN(GR#Z55L#CUOLkFbXkILbGNw~BPS8u@M2XM8O9Ed_PplL3ZP$+op3ap%f zO(nos9V(v|OScG8`$bpVUN8YJrMwSup?nmTgtI+ zs+EUx`4T+$ZmD`PX*_fx7IZi-{+zf^F|!8ULk z(T}<~sM*EA4YB@SAz@j&0HW0ii&)-W%bA022lN`)j^q>ew&Zm3>o;I;0q1YPgO}h+ zB|y=1L~-W}aevx~>obXz&6RVgConkx)0f|=R&Y|gC$6kBlzYt*DGAT?f?WUSWyb%9 z>#0!y0M-65?erD&1}~yq$b&d&B5`AA$I#4T5zCzr zo+ro0P4-~_5 z{y&LjUN%?mdA{2dy(?&^ks!#<)QCWUe&V^@+?h!*c5 zZ6zxiLOetwgW@#UlW=(tKKd|Rc@iFZ1g>pEF%aS=41}#SshnCeo65a*hOwZ zrqh=m{~3aST`g5ZSFQ<&QcbLzvoR4A0bAR~*)a>*DUV))iwih)T&ij6N`#r^0uFUY z!ni97xKh9=D!Y&=Ne{}`)K%aq~QjVaz{xCf9JFpwGnBxNx+;CGYN4E=u zbrJfhJA|doM`HGa7gw;lCJNP5FuDQL9f?|kld}lBn?S6TYFii%Me$9LLXi0))|y>~q54^>otKdfz5}x@LO;7I+<0o_$hh4baQv)D2GkevFOy*v34M)X^TFzUE$idx-xFXH=t|TjX^;*6N-9bV9!b;=HtH)yL%CU z>DaDS3LZIqXZ$Q7o)Tuo&mSKOVPjI5uEW8;@EW~U5p=f_D!Zv+dI0mWV1NM-4e#PoOu1>ArlX8`og(E?7S<39vj9%wc2dH~2V1AXId^|JPGx{^8ar z0HDUC^Y5U|?!_c2lTuK5(Sy71fcqbZ^Vi{pXC>s)iR|cVCT9Rwb9i!Bh^1yBhcaT1 zh?3wXw-D+W)r znAHnV6fsYsMabI5h^3L=^$J1zt9>YE67{5=h!2o^Jy^hof$BhJ9=jkJROKZq(#XWH z(LS78e+$8H9VG~szm})~pXMe*`(CvB2Xxnd0^11pKROWdV{;WAyC4&{wS(MCxR@w; z*jKNMk2gsFTz?=W5mw@BA0q^nNLb~A=K# zCfDKZ_rYsk8B3s*0JQ6KLCZ-d57s(i4^3BUKQ~$q zq{r^k6LF`FVPyll1BoOiWAWidAw?-60urqRxAY1jc|tABJ|rw2VPZ; zC}lMl;Fx5BB`!QE=N8T<(2a4w_TteF_TgE_pI}z~_VVQO$=5A%0dWOdQvZ6&(FbUo zE`yFB`POmsu&4(fhv%OWUw$xyrU$nlhpnk#20sV1xR2RPKwlH9fn6;r)m~3r$(4s- z^A732neU5SvP7Z+6$Fbs=S~R=wH2Se8sl;klT>9by$r^PdG?8P|8x>a)}>r5Xt4;B zv2YJ2(#F+76luC2lUS|z{ALb&I|2&N-3~63EF&@Eu`Rg8zk#&*)DLqxYk37Bf8wPc zq2B-dq^Tg}gX>~yLoN!iH-<+ZltY)>4xBn80$S-x36{3n7LFy zE9CF`Js@T)y_b?Ti&(iVgTX*7)NobO*%zJ=%aX*5W$XDvO{$uq2O>JCfLUm zbXvgv4cT>RE`Og7;hty9^l=;chC1ft)2LWYEjzcmnNG(W-U(vKGiAL zpX^JUhHmz~c-K-4gbPn1fNCq@`>)L+7&BsC^F(6g%}wa^MIcEc*K2F}BvmCqs*?-S zPc_t2*uNSJEKQ_=k=+P_AKFHaeko@HJUa#8`0v6QOYBmI7LB~?6&Af@e%k?=Afh=o#K>i%@{HMqV|7CeH`Sfdv3ZOspudMU^=;nu6?~Y01 z4zDV~K1mQj^u(ipl1W-wE4i1Xj%YlWOk=+*U#kPL24y9cwrL9I?iQeS*xH?SVRtO& z4$o$C?Zc6+^;8HM7bI=nHsX_~2wq82DOL>`xLBjuHj!a;v2;B^n2DQ8d$ESFKBAD< zR$>`iEz!>2HMk>%=K32chCi}AdHl)N(*OcLZna>3iqgFR?|u!{N*tsVP(n8mx_4(s z9%NU;ik6bGeh-G-m_N|*;X46Sv$^E_8zkhiM$EZR*j zXe~4MJ67fq`5;77Zy>%rv|?eVBgq@g=R*BXOL0L}CGMy!<$XI{Q9P&Q=r$FVtWYsw z6`4aI|KT}<^MxEqTh(%6#~=d1rV+xa$VB;Uf%u__6++6*=_J8ONEsTjGF1h-g3%T* z5+K=DV#!Q^d%orm-gw#my+8ff_G5C5Tfd%J3IKpANxDCQ3vZxW{5*N~3T!50QpYoC zwmdx0$tHrltGU$Pg~JpwKqO{nQ_0~kCL*xB8=EZ}aR)^z1tvu|g27xYK(8mSRaUN< zb_J=sm}dw<2psESeid>PtIE1DnbSsaw+}0O;-V&F>0%DU57VCc+g#jx^TriTcl`7{ z?PrDy_+-oR5PN(%JNrKhZAHfk6+52Ca`D61-AP!OWfG1ZvVGkGid?vSrR8rH(<1`O z4kW*?wD|qtq_WMPR1=kw^LP7FQl2|dBgjh0 zALIc#`9AjC_fVhu0xJFHr}Ob1u4kYH__$TmsGneK`*&Gi`4u|7JJ`Mf=W^N2SsuB6 zCne)W>?L$gOuJ2_9DO>2Eerb-d5z6w$NE?)w6+p=c>-$#;T)8LP|1|e`9!*qS4Oe6 zpb)fwI7>+95`E+f^bJu?ok}#4#B62RdlTdCcY?n9CrO*!s`X4)09h^XW_$EpJ`G zs~O$+L3-^!!c{qWSHiihdsO3}<-+O(VrZvix1LxRHtyQ42)y4Hz?VlPUlg(Y%t`2{ z8X=RY#O3H9Y2eZcZctjxy7Q7CQk5`;x)dVlwo`DU{w=o6_v6C(r}fGGG3%L&0Y2$c z4yXSG)8r*weDXhWGC3rX>rT{LI6wL>X3fQClCS?%>vPNke8LLsf&D+Z zF?$}n?w?ZH3ROhETt&CwB^i@6!q^QA^t`Ze^L-f9(3yzvtp>j%RmB_#ig%@uPPAg) z3w3l%y|zcyJV`#{$>uwGX!q6B?&8z=SU!{WxoH9Z$O;nBz>@8bI6ZOrHQGH>sf zGwfohSXe&Sz31Uto&x-Xe*)kCdN_S*X_x$;UXA+zm{+m2_Zm|B0}Q$^t?1mtV)K{tJ}l3n;ml&dQs(?%zzw4U!;zgz9quzAtI1@C;+7{{MAr*Z&Ix>}l#J SC5oN^0000bNn=KgovXEY*+KP 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%0A5ROakV*}qlU(Z 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 z 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 From 7853b4c41d8f9456a48699f88cf3ee476f3768f9 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 17 Jun 2025 22:40:46 +0500 Subject: [PATCH 06/49] Revert "chore: clear solution" This reverts commit ebbf90476da983d7e1b7fec1acf4d837bf2fa63a. --- AspNetCore.JwtAuthentication.sln | 168 ++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 5 deletions(-) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index bbeb505..e1ce8a8 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -5,7 +5,60 @@ VisualStudioVersion = 17.0.31919.166 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Core", "JwtAuthentication.Core\JwtAuthentication.Core.csproj", "{5F9739DA-4676-4B13-BE6C-5F5194AFE812}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{FCB88633-BC91-4F64-8BA5-00C43608D012}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{330BB423-781B-4A8C-BBC9-2F95B5349B2A}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.BaseAuthentication", "Examples\Example.NetCore5.0.BaseAuthentication\Example.NetCore5.0.BaseAuthentication.csproj", "{36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.PermissionBasedAuthorization", "Examples\Example.NetCore5.0.PermissionBasedAuthorization\Example.NetCore5.0.PermissionBasedAuthorization.csproj", "{51E0C282-0942-4367-95EB-F248E80A5D6F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.WithCredentialsValidator", "Examples\Example.NetCore5.0.WithCredentialsValidator\Example.NetCore5.0.WithCredentialsValidator.csproj", "{E2BC2C97-161E-41E4-B224-DFC62AD56768}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.0.BaseAuthentication", "Examples\Example.NetCore3.0.BaseAuthentication\Example.NetCore3.0.BaseAuthentication.csproj", "{6AB1E6C4-563A-4447-8024-6C31C9A45141}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.1.BaseAuthentication", "Examples\Example.NetCore3.1.BaseAuthentication\Example.NetCore3.1.BaseAuthentication.csproj", "{43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.CookiesBasedAuthentication", "Examples\Example.NetCore5.0.CookiesBasedAuthentication\Example.NetCore5.0.CookiesBasedAuthentication.csproj", "{32E74378-AAF5-4CA6-8633-30997453E58A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore5.0.AuthenticationUsingIdentityUser\Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj", "{1DF1D001-0194-4CD8-82DD-40AF57FC1432}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore5.0.AuthenticationWithRefreshToken\Example.NetCore5.0.AuthenticationWithRefreshToken.csproj", "{12915347-991A-4EA0-983D-03121E1C527B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Examples\Tests\Tests.csproj", "{EF8EF2D5-9483-400E-B938-ADDB467BF300}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.BaseAuthentication", "Examples\Example.NetCore6.0.BaseAuthentication\Example.NetCore6.0.BaseAuthentication.csproj", "{DDA26737-950C-4B23-B66A-1733FB482A29}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore5.0", "NetCore5.0", "{7A925031-2656-4CEB-821A-D76739E0E5A2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore3.", "NetCore3.", "{614DB4C6-A4BE-4BBF-B385-C34985CA1FC3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore6.0", "NetCore6.0", "{4FF83CB3-A634-4D07-BEE0-B5391B86F071}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingIdentityUser\Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj", "{28707296-5273-471B-89FB-FA3D6C62CA67}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore6.0.AuthenticationWithRefreshToken\Example.NetCore6.0.AuthenticationWithRefreshToken.csproj", "{5AE1CC8C-80A2-46AF-A02E-BE129080F489}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.CookiesBasedAuthentication", "Examples\Example.NetCore6.0.CookiesBasedAuthentication\Example.NetCore6.0.CookiesBasedAuthentication.csproj", "{E3C800A0-012F-4440-BD78-813FE51F4830}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.PermissionBasedAuthorization", "Examples\Example.NetCore6.0.PermissionBasedAuthorization\Example.NetCore6.0.PermissionBasedAuthorization.csproj", "{421DEC55-2DF8-4DCB-B53D-ED59C15062A2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.WithCredentialsValidator", "Examples\Example.NetCore6.0.WithCredentialsValidator\Example.NetCore6.0.WithCredentialsValidator.csproj", "{2652FCF8-3604-435E-8963-92A4A365FA33}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj", "{C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore6.0.RefreshTokenWithConfidenceInterval\Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj", "{ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore5.0.RefreshTokenWithConfidenceInterval\Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -17,14 +70,119 @@ Global {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.Build.0 = Release|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.Build.0 = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.Build.0 = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.Build.0 = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.Build.0 = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.Build.0 = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.Build.0 = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.Build.0 = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.Build.0 = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.Build.0 = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.Build.0 = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.Build.0 = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.Build.0 = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.Build.0 = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.Build.0 = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.Build.0 = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.Build.0 = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.Build.0 = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.Build.0 = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.Build.0 = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.Build.0 = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {51E0C282-0942-4367-95EB-F248E80A5D6F} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {E2BC2C97-161E-41E4-B224-DFC62AD56768} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {6AB1E6C4-563A-4447-8024-6C31C9A45141} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} + {32E74378-AAF5-4CA6-8633-30997453E58A} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {1DF1D001-0194-4CD8-82DD-40AF57FC1432} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {12915347-991A-4EA0-983D-03121E1C527B} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {EF8EF2D5-9483-400E-B938-ADDB467BF300} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {DDA26737-950C-4B23-B66A-1733FB482A29} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {7A925031-2656-4CEB-821A-D76739E0E5A2} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {4FF83CB3-A634-4D07-BEE0-B5391B86F071} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {28707296-5273-471B-89FB-FA3D6C62CA67} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {5AE1CC8C-80A2-46AF-A02E-BE129080F489} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {E3C800A0-012F-4440-BD78-813FE51F4830} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {2652FCF8-3604-435E-8963-92A4A365FA33} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} EndGlobalSection From b6eba85293faa1407c6becbcef00415e7c864f7f Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 19 Jun 2025 09:42:28 +0500 Subject: [PATCH 07/49] chore(examples): #65: add example for net7 BaseAuthentication --- .../Controllers/ExampleController.cs | 22 ++++++++++ ...ample.NetCore7.0.BaseAuthentication.csproj | 14 +++++++ .../Program.cs | 27 ++++++++++++ .../Properties/launchSettings.json | 41 +++++++++++++++++++ .../appsettings.json | 19 +++++++++ 5 files changed, 123 insertions(+) create mode 100644 Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj create mode 100644 Examples/Example.NetCore7.0.BaseAuthentication/Program.cs create mode 100644 Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..a061833 --- /dev/null +++ b/Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.BaseAuthentication.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + [HttpGet] + [Authorize] + public IActionResult Get() + { + return Ok("You are authenticated!"); + } + + [HttpGet("public")] + public IActionResult GetPublic() + { + return Ok("This endpoint is public"); + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj b/Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj new file mode 100644 index 0000000..f273f26 --- /dev/null +++ b/Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + Example.NetCore7._0.BaseAuthentication + + + + + + + diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Program.cs b/Examples/Example.NetCore7.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..7dce155 --- /dev/null +++ b/Examples/Example.NetCore7.0.BaseAuthentication/Program.cs @@ -0,0 +1,27 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:31875", + "sslPort": 44329 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7081;http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json b/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..7bf73ea --- /dev/null +++ b/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json @@ -0,0 +1,19 @@ +{ + "AuthenticationOptions": { + "SecretKey": "your-256-bit-secret", + "AccessTokenLifetimeInMinutes": 1, + "RefreshTokenLifetimeInDays": 7, + "ValidateIssuerSigningKey": true, + "ValidateIssuer": false, + "ValidateAudience": false, + "ValidateLifetime": true + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file From dc9899f20195fc892dc2ce213f6fd4c3821ff50e Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 19 Jun 2025 09:43:01 +0500 Subject: [PATCH 08/49] chore: #65: add net7 BaseAuthentication to sln --- AspNetCore.JwtAuthentication.sln | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index e1ce8a8..4949857 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -60,6 +60,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshT EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore5.0.RefreshTokenWithConfidenceInterval\Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.BaseAuthentication", "Examples\Example.NetCore7.0.BaseAuthentication\Example.NetCore7.0.BaseAuthentication.csproj", "{69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -154,6 +156,10 @@ Global {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.Build.0 = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -182,6 +188,7 @@ Global {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} From b2de4e1953d3d9d24c589d31fbf2a219c3b56638 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 19 Jun 2025 09:43:30 +0500 Subject: [PATCH 09/49] test(net7): #65: add tests for basic auth --- Examples/Tests/NetCore7.0/BasicAuthTests.cs | 60 +++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Examples/Tests/NetCore7.0/BasicAuthTests.cs diff --git a/Examples/Tests/NetCore7.0/BasicAuthTests.cs b/Examples/Tests/NetCore7.0/BasicAuthTests.cs new file mode 100644 index 0000000..004c26a --- /dev/null +++ b/Examples/Tests/NetCore7.0/BasicAuthTests.cs @@ -0,0 +1,60 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class BasicAuthTests : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + } +} \ No newline at end of file From a3e76d25ebbb9efc1e0ac78ece2509fca169a37b Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 19 Jun 2025 09:43:57 +0500 Subject: [PATCH 10/49] chore(tests): #65: update test app to net7 --- AspNetCore.JwtAuthentication.sln | 5 ++++- .../appsettings.json | 19 +++---------------- Examples/Tests/Tests.csproj | 5 +++-- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index 4949857..5eb2967 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -62,6 +62,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshT EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.BaseAuthentication", "Examples\Example.NetCore7.0.BaseAuthentication\Example.NetCore7.0.BaseAuthentication.csproj", "{69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore7.0", "NetCore7.0", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -188,7 +190,8 @@ Global {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} - {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json b/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json index 7bf73ea..8e261c5 100644 --- a/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json +++ b/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json @@ -1,19 +1,6 @@ { "AuthenticationOptions": { - "SecretKey": "your-256-bit-secret", - "AccessTokenLifetimeInMinutes": 1, - "RefreshTokenLifetimeInDays": 7, - "ValidateIssuerSigningKey": true, - "ValidateIssuer": false, - "ValidateAudience": false, - "ValidateLifetime": true - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "AllowedHosts": "*" + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } } \ No newline at end of file diff --git a/Examples/Tests/Tests.csproj b/Examples/Tests/Tests.csproj index 7a49897..7d37550 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -1,14 +1,14 @@  - net6.0 + net7.0 false enable Tests - + @@ -34,6 +34,7 @@ + From 16f429c5f568f1a4fd7523bbdbe837de00336ecd Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Sun, 22 Jun 2025 19:25:32 +0500 Subject: [PATCH 11/49] chore: #65: add example projects for net7 --- AspNetCore.JwtAuthentication.sln | 182 ++++++++++++++++++ .../Controllers/ExampleController.cs | 32 +++ .../Data/AppDbContext.cs | 13 ++ ...henticationUsingGenericIdentityUser.csproj | 20 ++ .../Models/CustomUser.cs | 8 + .../ProgramGeneric.cs | 66 +++++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 +++ .../Data/AppDbContext.cs | 14 ++ ...7.0.AuthenticationUsingIdentityUser.csproj | 20 ++ .../Models/CustomUser.cs | 9 + .../Program.cs | 37 ++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 +++ .../Data/AppDbContext.cs | 14 ++ ...e7.0.AuthenticationWithRefreshToken.csproj | 19 ++ .../Models/CustomUser.cs | 9 + .../Program.cs | 77 ++++++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 32 +++ ...tCore7.0.CookiesBasedAuthentication.csproj | 14 ++ .../ProgramCookies.cs | 43 +++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 33 ++++ ...ore7.0.PermissionBasedAuthorization.csproj | 15 ++ .../Program.cs | 36 ++++ .../Properties/launchSettings.json | 31 +++ .../UserClaimsProvider.cs | 24 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 +++ .../Data/AppDbContext.cs | 13 ++ ...kenAuthAndRegistrationUsingIdentity.csproj | 19 ++ .../Models/CustomUser.cs | 8 + .../Program.cs | 65 +++++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 +++ .../Data/AppDbContext.cs | 13 ++ ....RefreshTokenWithConfidenceInterval.csproj | 19 ++ .../Models/CustomUser.cs | 8 + .../Program.cs | 65 +++++++ .../Properties/launchSettings.json | 31 +++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 +++ ...NetCore7.0.WithCredentialsValidator.csproj | 23 +++ .../Program.cs | 49 +++++ .../Properties/launchSettings.json | 31 +++ .../UserCredentialsValidator.cs | 15 ++ .../appsettings.json | 6 + 53 files changed, 1465 insertions(+) create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json create mode 100644 Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj create mode 100644 Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs create mode 100644 Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs create mode 100644 Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs create mode 100644 Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index 5eb2967..ec50e7d 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -64,104 +64,278 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.BaseAuth EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore7.0", "NetCore7.0", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore7.0.AuthenticationUsingGenericIdentityUser\Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj", "{E85F73B6-5C37-4745-AFB3-16DA11F23882}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore7.0.AuthenticationUsingIdentityUser\Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj", "{BC726B57-2164-4C73-9DF3-32DE785F04FB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore7.0.AuthenticationWithRefreshToken\Example.NetCore7.0.AuthenticationWithRefreshToken.csproj", "{54F6E533-537E-47D3-A829-6DB7CBD1D948}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.CookiesBasedAuthentication", "Examples\Example.NetCore7.0.CookiesBasedAuthentication\Example.NetCore7.0.CookiesBasedAuthentication.csproj", "{2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.PermissionBasedAuthorization", "Examples\Example.NetCore7.0.PermissionBasedAuthorization\Example.NetCore7.0.PermissionBasedAuthorization.csproj", "{E7250382-AA91-44BA-BAD2-6E888195D628}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{0B46B59D-395F-44C6-B68D-A6967DCEFA10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore7.0.RefreshTokenWithConfidenceInterval\Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj", "{EAF21201-CD79-444C-A27C-B53B016C042C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.WithCredentialsValidator", "Examples\Example.NetCore7.0.WithCredentialsValidator\Example.NetCore7.0.WithCredentialsValidator.csproj", "{6AE10A59-1374-4000-B8BB-047DAAE30779}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.Build.0 = Release|Any CPU + {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|x64.ActiveCfg = Release|Any CPU + {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|x64.Build.0 = Release|Any CPU + {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|x86.ActiveCfg = Release|Any CPU + {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|x86.Build.0 = Release|Any CPU {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.Build.0 = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|x64.ActiveCfg = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|x64.Build.0 = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|x86.ActiveCfg = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|x86.Build.0 = Release|Any CPU {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|x64.ActiveCfg = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|x64.Build.0 = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|x86.ActiveCfg = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|x86.Build.0 = Release|Any CPU {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.Build.0 = Debug|Any CPU {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.Build.0 = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|x64.ActiveCfg = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|x64.Build.0 = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|x86.ActiveCfg = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|x86.Build.0 = Release|Any CPU {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.Build.0 = Debug|Any CPU {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.ActiveCfg = Release|Any CPU {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.Build.0 = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|x64.ActiveCfg = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|x64.Build.0 = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|x86.ActiveCfg = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|x86.Build.0 = Release|Any CPU {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.Build.0 = Debug|Any CPU {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.Build.0 = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|x64.ActiveCfg = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|x64.Build.0 = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|x86.ActiveCfg = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|x86.Build.0 = Release|Any CPU {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.Build.0 = Debug|Any CPU {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.ActiveCfg = Release|Any CPU {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.Build.0 = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|x64.ActiveCfg = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|x64.Build.0 = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|x86.ActiveCfg = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|x86.Build.0 = Release|Any CPU {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.Build.0 = Debug|Any CPU {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.ActiveCfg = Release|Any CPU {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.Build.0 = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|x64.ActiveCfg = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|x64.Build.0 = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|x86.ActiveCfg = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|x86.Build.0 = Release|Any CPU {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.Build.0 = Debug|Any CPU {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.ActiveCfg = Release|Any CPU {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.Build.0 = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|x64.ActiveCfg = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|x64.Build.0 = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|x86.ActiveCfg = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|x86.Build.0 = Release|Any CPU {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.Build.0 = Debug|Any CPU {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.ActiveCfg = Release|Any CPU {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.Build.0 = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|x64.ActiveCfg = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|x64.Build.0 = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|x86.ActiveCfg = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|x86.Build.0 = Release|Any CPU {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.Build.0 = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|x64.ActiveCfg = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|x64.Build.0 = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|x86.ActiveCfg = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|x86.Build.0 = Release|Any CPU {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.Build.0 = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|x64.ActiveCfg = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|x64.Build.0 = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|x86.ActiveCfg = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|x86.Build.0 = Release|Any CPU {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.Build.0 = Debug|Any CPU {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.Build.0 = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|x64.ActiveCfg = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|x64.Build.0 = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|x86.ActiveCfg = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|x86.Build.0 = Release|Any CPU {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.Build.0 = Debug|Any CPU {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.ActiveCfg = Release|Any CPU {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.Build.0 = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|x64.ActiveCfg = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|x64.Build.0 = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|x86.ActiveCfg = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|x86.Build.0 = Release|Any CPU {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.Build.0 = Debug|Any CPU {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.Build.0 = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|x64.ActiveCfg = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|x64.Build.0 = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|x86.ActiveCfg = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|x86.Build.0 = Release|Any CPU {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.Build.0 = Debug|Any CPU {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.ActiveCfg = Release|Any CPU {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.Build.0 = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|x64.ActiveCfg = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|x64.Build.0 = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|x86.ActiveCfg = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|x86.Build.0 = Release|Any CPU {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.Build.0 = Debug|Any CPU {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.Build.0 = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|x64.ActiveCfg = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|x64.Build.0 = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|x86.ActiveCfg = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|x86.Build.0 = Release|Any CPU {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.Build.0 = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|x64.ActiveCfg = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|x64.Build.0 = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|x86.ActiveCfg = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|x86.Build.0 = Release|Any CPU {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.Build.0 = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|x64.ActiveCfg = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|x64.Build.0 = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|x86.ActiveCfg = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|x86.Build.0 = Release|Any CPU {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.Build.0 = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|x64.ActiveCfg = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|x64.Build.0 = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|x86.ActiveCfg = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|x86.Build.0 = Release|Any CPU {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.Build.0 = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|x64.ActiveCfg = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|x64.Build.0 = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|x86.ActiveCfg = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|x86.Build.0 = Release|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.Build.0 = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|x64.ActiveCfg = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|x64.Build.0 = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|x86.ActiveCfg = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|x86.Build.0 = Release|Any CPU {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Debug|Any CPU.Build.0 = Debug|Any CPU {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|Any CPU.ActiveCfg = Release|Any CPU {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|Any CPU.Build.0 = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|x64.ActiveCfg = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|x64.Build.0 = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|x86.ActiveCfg = Release|Any CPU + {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}.Release|x86.Build.0 = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|Any CPU.Build.0 = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|x64.ActiveCfg = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|x64.Build.0 = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|x86.ActiveCfg = Release|Any CPU + {E85F73B6-5C37-4745-AFB3-16DA11F23882}.Release|x86.Build.0 = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|Any CPU.Build.0 = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|x64.ActiveCfg = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|x64.Build.0 = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|x86.ActiveCfg = Release|Any CPU + {BC726B57-2164-4C73-9DF3-32DE785F04FB}.Release|x86.Build.0 = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|Any CPU.Build.0 = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|x64.ActiveCfg = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|x64.Build.0 = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|x86.ActiveCfg = Release|Any CPU + {54F6E533-537E-47D3-A829-6DB7CBD1D948}.Release|x86.Build.0 = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|Any CPU.Build.0 = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|x64.ActiveCfg = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|x64.Build.0 = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|x86.ActiveCfg = Release|Any CPU + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}.Release|x86.Build.0 = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|Any CPU.Build.0 = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|x64.ActiveCfg = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|x64.Build.0 = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|x86.ActiveCfg = Release|Any CPU + {E7250382-AA91-44BA-BAD2-6E888195D628}.Release|x86.Build.0 = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|Any CPU.Build.0 = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|x64.ActiveCfg = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|x64.Build.0 = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|x86.ActiveCfg = Release|Any CPU + {0B46B59D-395F-44C6-B68D-A6967DCEFA10}.Release|x86.Build.0 = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|Any CPU.Build.0 = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|x64.ActiveCfg = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|x64.Build.0 = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|x86.ActiveCfg = Release|Any CPU + {EAF21201-CD79-444C-A27C-B53B016C042C}.Release|x86.Build.0 = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|Any CPU.Build.0 = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x64.ActiveCfg = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x64.Build.0 = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x86.ActiveCfg = Release|Any CPU + {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -192,6 +366,14 @@ Global {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} {69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {E85F73B6-5C37-4745-AFB3-16DA11F23882} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {BC726B57-2164-4C73-9DF3-32DE785F04FB} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {54F6E533-537E-47D3-A829-6DB7CBD1D948} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {E7250382-AA91-44BA-BAD2-6E888195D628} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {0B46B59D-395F-44C6-B68D-A6967DCEFA10} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {EAF21201-CD79-444C-A27C-B53B016C042C} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {6AE10A59-1374-4000-B8BB-047DAAE30779} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..4e4b6bc --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..d76678d --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } + diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..0011ed8 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,20 @@ + + + + net7.0 + enable + disable + Example.NetCore7._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..f6f7af1 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..c014819 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,66 @@ +using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser + { + UserName = x.Login, + NormalizedUserName = x.Login, + } + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class ProgramGeneric { } diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..653e423 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:35556", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5160", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..5e02f53 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..c394805 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore7._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..a2620e0 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,20 @@ + + + + net7.0 + enable + enable + Example.NetCore7._0.AuthenticationUsingIdentityUser + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..56137c1 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..22e725b --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,37 @@ +using Example.NetCore7._0.AuthenticationUsingIdentityUser.Data; +using Example.NetCore7._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddBaseLogin(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..78fb330 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:23668", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5105", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..d199d33 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..094939e --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore7._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..8f6bca1 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + Example.NetCore7._0.AuthenticationWithRefreshToken + + + + + + + + + + + + diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..2b272fe --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..3a07b30 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,77 @@ +using Example.NetCore7._0.AuthenticationWithRefreshToken.Data; +using Example.NetCore7._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Logout.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + + + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + + + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware(); + +app + .OnLogoutExecuted(OnLogoutExecuted) + .OnLogoutExecuting(OnLogoutExecuting) + .UseLogoutMiddleware(); + +app + .OnRefreshExecuting(OnRefreshExecuting) + .UseRefreshMiddleware(); + +app.UseJwtAuthentication(); + +app.UseAuthorization(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.MapControllers(); + +app.Run(); + +Task OnLogoutExecuting(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnLogoutExecuted(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnRefreshExecuting(RefreshModel data) +{ + return Task.CompletedTask; +} + + diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..33e5468 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:12783", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5054", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..913261f --- /dev/null +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..7f8b85f --- /dev/null +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + disable + Example.NetCore7._0.CookiesBasedAuthentication + + + + + + + diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..8130bbc --- /dev/null +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseCookieLoginMiddleware(new CookieAuthOptions + { + Key = "ExampleCookieName", + } + ); + +app.UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); + +public partial class ProgramCookies { } diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..27e1352 --- /dev/null +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59033", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.CookiesBasedAuthentication": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5269", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..4be0e3d --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -0,0 +1,33 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; + +namespace Example.NetCore7._0.PermissionBasedAuthorization.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [RequiresPermission(UserClaimsProvider.FirstExampleClaimName)] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..982c488 --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + Example.NetCore7._0.PermissionBasedAuthorization + + + + + + + + diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..22eb04f --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,36 @@ +using Example.NetCore7._0.PermissionBasedAuthorization; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseAuthorization(); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..1cbc210 --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:2600", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.PermissionBasedAuthorization": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5007", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..ccf6ca1 --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore7._0.PermissionBasedAuthorization +{ + public class UserClaimsProvider : IUserClaimsProvider + { + public const string ExampleClaimType = "ExamplePermission"; + + public const string FirstExampleClaimName = "CanUseExampleFirst"; + + public const string SecondExampleClaimName = "CanUseExampleSecond"; + + public Task> GetUserClaimsAsync(string login) + { + return Task.FromResult(new List + { + new Claim(ExampleClaimType, FirstExampleClaimName), + new Claim(ExampleClaimType, SecondExampleClaimName), + } + ); + } + } +} diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..f130c65 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..4d8c9ab --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..ed33708 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + disable + disable + Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity + + + + + + + + + + + + diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..e20e92d --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..755e0ff --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,65 @@ +using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class Program { } diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..275dc04 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..52fb932 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..d14434c --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..52146ec --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + disable + disable + Example.NetCore7._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..b24a6ae --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..a24f266 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,65 @@ +using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Data; +using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); +const int refreshConfidenceIntervalInMilliseconds = 300_000; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(refreshAuthenticationOptions) + .AddRefreshConfidenceInterval(refreshConfidenceIntervalInMilliseconds) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public abstract class ProgramWithConfidenceInterval { } diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..cf928d8 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..5bbbe23 --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore7._0.WithCredentialsValidator.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj b/Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..1793b37 --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj @@ -0,0 +1,23 @@ + + + + net7.0 + enable + enable + Example.NetCore7._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..d337d33 --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,49 @@ +using Example.NetCore7._0.WithCredentialsValidator; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .AddUserCredentialValidator(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app + .OnLoginExecuting(OnLoginExecuting) + .OnLoginExecuted(OnLoginExecuted) + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +Task OnLoginExecuting(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + +Task OnLoginExecuted(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..2dd163f --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20559", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.WithCredentialsValidator": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5090", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..74cf638 --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,15 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore7._0.WithCredentialsValidator +{ + public class UserCredentialsValidator : IUserCredentialsValidator + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public Task ValidateUserCredentials(string login, string password) + { + return Task.FromResult(login == Login && password == Password); + } + } +} diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json b/Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file From ea93fe24b79cc37b7e7a1083320a95355a2f8170 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Sun, 22 Jun 2025 19:31:10 +0500 Subject: [PATCH 12/49] chore(tests): #65: add tests for net7 projects --- .../NetCore7.0/BasicAuthTestWithGeneric.cs | 112 ++++++++++++++++++ Examples/Tests/NetCore7.0/CookieTests.cs | 61 ++++++++++ .../Tests/NetCore7.0/LoginCallbackTests.cs | 79 ++++++++++++ Examples/Tests/NetCore7.0/LogoutTest.cs | 56 +++++++++ Examples/Tests/NetCore7.0/RefreshTests.cs | 87 ++++++++++++++ .../RefreshTestsWithConfidenceInterval.cs | 39 ++++++ .../Tests/NetCore7.0/RegistrationTests.cs | 67 +++++++++++ 7 files changed, 501 insertions(+) create mode 100644 Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs create mode 100644 Examples/Tests/NetCore7.0/CookieTests.cs create mode 100644 Examples/Tests/NetCore7.0/LoginCallbackTests.cs create mode 100644 Examples/Tests/NetCore7.0/LogoutTest.cs create mode 100644 Examples/Tests/NetCore7.0/RefreshTests.cs create mode 100644 Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs create mode 100644 Examples/Tests/NetCore7.0/RegistrationTests.cs diff --git a/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..77f364f --- /dev/null +++ b/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs @@ -0,0 +1,112 @@ +using System.Net; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class BasicAuthTestWithGeneric : + IClassFixture> + { + protected readonly WebApplicationFactory _factory; + protected readonly JsonSerializerOptions _jsonSerializerSettings; + + protected const string LoginUrl = "/auth/login"; + protected const string AuthorizedEndpointUrl = "/example"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTestWithGeneric(WebApplicationFactory factory) + { + _factory = factory; + + _jsonSerializerSettings = new JsonSerializerOptions + { + IgnoreNullValues = true, + AllowTrailingCommas = true, + WriteIndented = true, + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new JsonStringEnumConverter(), + }, + }; + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + + internal async Task<(HttpResponseMessage response, AuthResponseModel authModel)> LoginAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new LoginRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(LoginUrl, body); + + var authModel = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + + return (response, authModel); + } + + internal async Task CallAuthorizedEndpointAsync(string accessToken) + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + var response = await client.GetAsync(AuthorizedEndpointUrl); + return response; + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/CookieTests.cs b/Examples/Tests/NetCore7.0/CookieTests.cs new file mode 100644 index 0000000..b0fbcc5 --- /dev/null +++ b/Examples/Tests/NetCore7.0/CookieTests.cs @@ -0,0 +1,61 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class CookieTests + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public CookieTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_SetsValidCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, Password); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie") + .Value; + + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", cookies); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_DoesNotSetCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, "123"); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie"); + + Assert.Null(cookies.Value); + } + + [Fact] + public async Task UsingInvalidCookie_Returns401() + { + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", new[] { "invalid-cookie" }); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/LoginCallbackTests.cs b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs new file mode 100644 index 0000000..7b6ba6b --- /dev/null +++ b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs @@ -0,0 +1,79 @@ +using System.Text; +using Microsoft.AspNetCore.Http; +using Moq; +using Newtonsoft.Json; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract.Implementation; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class LoginCallbackTests + { + private readonly DefaultHttpContext _httpContext; + private readonly Mock> _onLoginExecutingMock; + private readonly Mock> _onLoginExecutedMock; + private readonly LoginService _loginService; + + public LoginCallbackTests() + { + _httpContext = new DefaultHttpContext(); + _httpContext.Request.Method = HttpMethods.Post; + _httpContext.Request.Path = new PathString("/login"); + + var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel + { + Login = "Admin", + Password = "Admin", + } + ) + ); + + _httpContext.Request.Body = new MemoryStream(requestData); + + _onLoginExecutingMock = new Mock>(); + + _onLoginExecutingMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _onLoginExecutedMock = new Mock>(); + + _onLoginExecutedMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _loginService = new LoginService(new TokenManager(new AuthenticationOptions + { + PrivateSigningKey = + "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", + }, + new DefaultUserClaimsProvider() + ), + new FakeUserCredentialValidator() + ); + } + + [Fact] + public async Task LoginCallbackInvokeWithDefaultLogin() + { + RequestDelegate next = d => Task.CompletedTask; + + var loginMiddleware = new LoginMiddleware(next, + new LoginEndpointOptions + { + LoginEndpointRoute = "/login", + }, + _onLoginExecutingMock.Object, + _onLoginExecutedMock.Object + ); + + await loginMiddleware.InvokeAsync(_httpContext, _loginService); + + _onLoginExecutingMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + _onLoginExecutedMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/LogoutTest.cs b/Examples/Tests/NetCore7.0/LogoutTest.cs new file mode 100644 index 0000000..5e6ee5f --- /dev/null +++ b/Examples/Tests/NetCore7.0/LogoutTest.cs @@ -0,0 +1,56 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class LogoutTest + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public LogoutTest(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LogoutWithValidToken_Return200() + { + var loginResult = await LoginAsync(Login, Password); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + + [Fact] + public async Task LogoutWithInvalidToken_Return400() + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.NewGuid(), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.InternalServerError, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/RefreshTests.cs b/Examples/Tests/NetCore7.0/RefreshTests.cs new file mode 100644 index 0000000..f44105f --- /dev/null +++ b/Examples/Tests/NetCore7.0/RefreshTests.cs @@ -0,0 +1,87 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class RefreshTests + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + public RefreshTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RefreshWithValidToken_ReturnsTokens() + { + var loginResult = await LoginAsync(Login, Password); + + var (_, result) = await CallRefresh(loginResult.authModel); + + Assert.False(string.IsNullOrWhiteSpace(result.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(result.RefreshToken.Value)); + } + + [Fact] + public async Task RefreshWithInvalidToken_Returns401() + { + var invalidAuthResponseModel = new AuthResponseModel + { + RefreshToken = new TokenModel + { + Value = Guid.NewGuid().ToString(), + }, + AccessToken = new TokenModel + { + Value = string.Empty, + }, + }; + + var (response, _) = await CallRefresh(invalidAuthResponseModel, Guid.NewGuid().ToString()); + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_Returns401() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + await CallRefresh(authModel, FingerPrint); + var (response, _) = await CallRefresh(authModel, FingerPrint); + + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task LogoutWithValidToken_DiscardsRefresh() + { + var loginResult = await LoginAsync(Login, Password); + + var refreshResult = await CallRefresh(loginResult.authModel); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs new file mode 100644 index 0000000..ff141bc --- /dev/null +++ b/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class RefreshTestsWithConfidenceInterval + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + private readonly AuthResponseModelEqualityComparer _authResponseModelEqualityComparer; + + public RefreshTestsWithConfidenceInterval(WebApplicationFactory factory) + : base(factory) + { + _authResponseModelEqualityComparer = new AuthResponseModelEqualityComparer(); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + var (_, authResponseModel1) = await CallRefresh(authModel, FingerPrint); + var (_, authResponseModel2) = await CallRefresh(authModel, FingerPrint); + var (response, authResponseModel3) = await CallRefresh(authModel, FingerPrint); + + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel1, authResponseModel2)); + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel2, authResponseModel3)); + + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.RefreshToken.Value)); + + Assert.True(response.IsSuccessStatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore7.0/RegistrationTests.cs b/Examples/Tests/NetCore7.0/RegistrationTests.cs new file mode 100644 index 0000000..cdf4951 --- /dev/null +++ b/Examples/Tests/NetCore7.0/RegistrationTests.cs @@ -0,0 +1,67 @@ +using System.Net; +using System.Net.Http.Json; +using System.Text.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore7._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test"; + private const string Password = "Test1234."; + + public RegistrationTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RegisterWithInvalidCreds_Returns400() + { + var registerResult = await RegisterAsync(Login, "1"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + [Fact] + public async Task RegisterWithValidCreds_CreatesNewUser() + { + var registerResult = await RegisterAsync(Login, Password); + + var callAuthorizedEndpointResult = await CallAuthorizedEndpointAsync(registerResult.authModel.AccessToken.Value); + Assert.Equal(HttpStatusCode.OK, callAuthorizedEndpointResult.StatusCode); + + var loginResult = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(loginResult.authModel.AccessToken.Value)); + } + + [Fact] + public async Task RegisterWithCredsOfExistingUser_Returns400() + { + var registerResult = await RegisterAsync("Admin", "Admin"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + private async Task<(HttpResponseMessage response, AuthResponseModel authModel)> RegisterAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RegistrationRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(RegisterUrl, body); + var result = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + return (response, result); + } + } +} \ No newline at end of file From b4e4a03ae1c0b88523fb1afa7cd430856b771772 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Sun, 22 Jun 2025 20:27:06 +0500 Subject: [PATCH 13/49] chore: #65: add example projects for net8 --- AspNetCore.JwtAuthentication.sln | 102 ++++++++++++++++++ .../Controllers/ExampleController.cs | 33 ++++++ .../Data/AppDbContext.cs | 14 +++ ...henticationUsingGenericIdentityUser.csproj | 21 ++++ .../Models/CustomUser.cs | 9 ++ .../ProgramGeneric.cs | 67 ++++++++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++ .../Data/AppDbContext.cs | 15 +++ ...8.0.AuthenticationUsingIdentityUser.csproj | 21 ++++ .../Models/CustomUser.cs | 10 ++ .../Program.cs | 38 +++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++ .../Data/AppDbContext.cs | 15 +++ ...e8.0.AuthenticationWithRefreshToken.csproj | 20 ++++ .../Models/CustomUser.cs | 10 ++ .../Program.cs | 78 ++++++++++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 22 ++++ ...ample.NetCore8.0.BaseAuthentication.csproj | 15 +++ .../Program.cs | 27 +++++ .../Properties/launchSettings.json | 41 +++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 33 ++++++ ...tCore8.0.CookiesBasedAuthentication.csproj | 15 +++ .../ProgramCookies.cs | 44 ++++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 34 ++++++ ...ore8.0.PermissionBasedAuthorization.csproj | 16 +++ .../Program.cs | 37 +++++++ .../Properties/launchSettings.json | 31 ++++++ .../UserClaimsProvider.cs | 25 +++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++ .../Data/AppDbContext.cs | 14 +++ ...kenAuthAndRegistrationUsingIdentity.csproj | 20 ++++ .../Models/CustomUser.cs | 9 ++ .../Program.cs | 66 ++++++++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++ .../Data/AppDbContext.cs | 14 +++ ....RefreshTokenWithConfidenceInterval.csproj | 20 ++++ .../Models/CustomUser.cs | 9 ++ .../Program.cs | 66 ++++++++++++ .../Properties/launchSettings.json | 31 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++ ...NetCore8.0.WithCredentialsValidator.csproj | 24 +++++ .../Program.cs | 50 +++++++++ .../Properties/launchSettings.json | 31 ++++++ .../UserCredentialsValidator.cs | 16 +++ .../appsettings.json | 6 ++ 58 files changed, 1532 insertions(+) create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json create mode 100644 Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj create mode 100644 Examples/Example.NetCore8.0.BaseAuthentication/Program.cs create mode 100644 Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json create mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj create mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs create mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs create mode 100644 Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs create mode 100644 Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index ec50e7d..bbd85d0 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -80,6 +80,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.RefreshT EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.WithCredentialsValidator", "Examples\Example.NetCore7.0.WithCredentialsValidator\Example.NetCore7.0.WithCredentialsValidator.csproj", "{6AE10A59-1374-4000-B8BB-047DAAE30779}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore8.0.AuthenticationUsingGenericIdentityUser\Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj", "{A4EC68DA-C87B-4A66-9EE4-0056DC657D56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore8.0.AuthenticationUsingIdentityUser\Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj", "{B41EE46C-6E57-4D72-8E5A-86E019C5E565}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore8.0.AuthenticationWithRefreshToken\Example.NetCore8.0.AuthenticationWithRefreshToken.csproj", "{A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.BaseAuthentication", "Examples\Example.NetCore8.0.BaseAuthentication\Example.NetCore8.0.BaseAuthentication.csproj", "{F58F3A0E-0763-4236-B903-377EE58F79AC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.CookiesBasedAuthentication", "Examples\Example.NetCore8.0.CookiesBasedAuthentication\Example.NetCore8.0.CookiesBasedAuthentication.csproj", "{6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.PermissionBasedAuthorization", "Examples\Example.NetCore8.0.PermissionBasedAuthorization\Example.NetCore8.0.PermissionBasedAuthorization.csproj", "{4C320ECC-388B-41CF-B391-20F6B1A31FA3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore8.0.RefreshTokenWithConfidenceInterval\Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj", "{CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.WithCredentialsValidator", "Examples\Example.NetCore8.0.WithCredentialsValidator\Example.NetCore8.0.WithCredentialsValidator.csproj", "{48786B11-B83A-4134-85C6-4E9F959F9C06}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore8.0", "NetCore8.0", "{3DC4FB03-312C-4EFB-838C-F95431860DFC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -336,6 +356,78 @@ Global {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x64.Build.0 = Release|Any CPU {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x86.ActiveCfg = Release|Any CPU {6AE10A59-1374-4000-B8BB-047DAAE30779}.Release|x86.Build.0 = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|Any CPU.Build.0 = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|x64.ActiveCfg = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|x64.Build.0 = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|x86.ActiveCfg = Release|Any CPU + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56}.Release|x86.Build.0 = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|Any CPU.Build.0 = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|x64.ActiveCfg = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|x64.Build.0 = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|x86.ActiveCfg = Release|Any CPU + {B41EE46C-6E57-4D72-8E5A-86E019C5E565}.Release|x86.Build.0 = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|Any CPU.Build.0 = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|x64.ActiveCfg = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|x64.Build.0 = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|x86.ActiveCfg = Release|Any CPU + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}.Release|x86.Build.0 = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|Any CPU.Build.0 = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|x64.ActiveCfg = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|x64.Build.0 = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|x86.ActiveCfg = Release|Any CPU + {F58F3A0E-0763-4236-B903-377EE58F79AC}.Release|x86.Build.0 = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|Any CPU.Build.0 = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|x64.ActiveCfg = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|x64.Build.0 = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|x86.ActiveCfg = Release|Any CPU + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}.Release|x86.Build.0 = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|Any CPU.Build.0 = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|x64.ActiveCfg = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|x64.Build.0 = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|x86.ActiveCfg = Release|Any CPU + {4C320ECC-388B-41CF-B391-20F6B1A31FA3}.Release|x86.Build.0 = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|Any CPU.Build.0 = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|x64.ActiveCfg = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|x64.Build.0 = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|x86.ActiveCfg = Release|Any CPU + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}.Release|x86.Build.0 = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|Any CPU.Build.0 = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|x64.ActiveCfg = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|x64.Build.0 = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|x86.ActiveCfg = Release|Any CPU + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}.Release|x86.Build.0 = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|Any CPU.Build.0 = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x64.ActiveCfg = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x64.Build.0 = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x86.ActiveCfg = Release|Any CPU + {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -374,6 +466,16 @@ Global {0B46B59D-395F-44C6-B68D-A6967DCEFA10} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {EAF21201-CD79-444C-A27C-B53B016C042C} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {6AE10A59-1374-4000-B8BB-047DAAE30779} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {A4EC68DA-C87B-4A66-9EE4-0056DC657D56} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {B41EE46C-6E57-4D72-8E5A-86E019C5E565} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {A97DF002-5BD5-45C5-87F6-FF5BF5AA205E} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {F58F3A0E-0763-4236-B903-377EE58F79AC} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {4C320ECC-388B-41CF-B391-20F6B1A31FA3} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {48786B11-B83A-4134-85C6-4E9F959F9C06} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} + {3DC4FB03-312C-4EFB-838C-F95431860DFC} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..b9bd3e3 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..060d08e --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } + + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..1b7169a --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + disable + Example.NetCore8._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..6d235d6 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..63e378a --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,67 @@ +using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser + { + UserName = x.Login, + NormalizedUserName = x.Login, + } + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class ProgramGeneric { } + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..653e423 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:35556", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5160", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..76fec6c --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..fe1c0ef --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,15 @@ +using Example.NetCore8._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..3979f5e --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + Example.NetCore8._0.AuthenticationUsingIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..8472131 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..7c8fb8f --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,38 @@ +using Example.NetCore8._0.AuthenticationUsingIdentityUser.Data; +using Example.NetCore8._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddBaseLogin(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..78fb330 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:23668", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5105", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..c7cdfbe --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..4dac0ae --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,15 @@ +using Example.NetCore8._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..9d8fab3 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + Example.NetCore8._0.AuthenticationWithRefreshToken + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..c57391b --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..7016b81 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,78 @@ +using Example.NetCore8._0.AuthenticationWithRefreshToken.Data; +using Example.NetCore8._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Logout.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + + + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + + + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware(); + +app + .OnLogoutExecuted(OnLogoutExecuted) + .OnLogoutExecuting(OnLogoutExecuting) + .UseLogoutMiddleware(); + +app + .OnRefreshExecuting(OnRefreshExecuting) + .UseRefreshMiddleware(); + +app.UseJwtAuthentication(); + +app.UseAuthorization(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.MapControllers(); + +app.Run(); + +Task OnLogoutExecuting(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnLogoutExecuted(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnRefreshExecuting(RefreshModel data) +{ + return Task.CompletedTask; +} + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..33e5468 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:12783", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5054", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..a4362c6 --- /dev/null +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.BaseAuthentication.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + [HttpGet] + [Authorize] + public IActionResult Get() + { + return Ok("You are authenticated!"); + } + + [HttpGet("public")] + public IActionResult GetPublic() + { + return Ok("This endpoint is public"); + } +} diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj b/Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj new file mode 100644 index 0000000..3358e0e --- /dev/null +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + Example.NetCore8._0.BaseAuthentication + + + + + + + + diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs b/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..9d80d68 --- /dev/null +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs @@ -0,0 +1,27 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:31875", + "sslPort": 44329 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7081;http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json b/Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..dfd494b --- /dev/null +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..d6b9750 --- /dev/null +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + disable + Example.NetCore8._0.CookiesBasedAuthentication + + + + + + + + diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..84d9c9c --- /dev/null +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseCookieLoginMiddleware(new CookieAuthOptions + { + Key = "ExampleCookieName", + } + ); + +app.UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); + +public partial class ProgramCookies { } + diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..27e1352 --- /dev/null +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59033", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.CookiesBasedAuthentication": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5269", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..b153aaf --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; + +namespace Example.NetCore8._0.PermissionBasedAuthorization.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [RequiresPermission(UserClaimsProvider.FirstExampleClaimName)] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..1b8a6db --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + Example.NetCore8._0.PermissionBasedAuthorization + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..e50737a --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,37 @@ +using Example.NetCore8._0.PermissionBasedAuthorization; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseAuthorization(); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + + diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..1cbc210 --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:2600", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.PermissionBasedAuthorization": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5007", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..26406ac --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,25 @@ +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore8._0.PermissionBasedAuthorization +{ + public class UserClaimsProvider : IUserClaimsProvider + { + public const string ExampleClaimType = "ExamplePermission"; + + public const string FirstExampleClaimName = "CanUseExampleFirst"; + + public const string SecondExampleClaimName = "CanUseExampleSecond"; + + public Task> GetUserClaimsAsync(string login) + { + return Task.FromResult(new List + { + new Claim(ExampleClaimType, FirstExampleClaimName), + new Claim(ExampleClaimType, SecondExampleClaimName), + } + ); + } + } +} + diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..3746767 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..e43349a --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..1d1d495 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + disable + disable + Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..3a67613 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..1346c8c --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,66 @@ +using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class Program { } + diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..275dc04 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..c648208 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..4b03b7a --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..295ad75 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + disable + disable + Example.NetCore8._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..6f8431b --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..66c24f5 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,66 @@ +using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Data; +using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); +const int refreshConfidenceIntervalInMilliseconds = 300_000; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(refreshAuthenticationOptions) + .AddRefreshConfidenceInterval(refreshConfidenceIntervalInMilliseconds) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public abstract class ProgramWithConfidenceInterval { } + diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..cf928d8 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..9b1a105 --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore8._0.WithCredentialsValidator.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj b/Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..8afbfc8 --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + Example.NetCore8._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + + diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..0618b07 --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,50 @@ +using Example.NetCore8._0.WithCredentialsValidator; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .AddUserCredentialValidator(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app + .OnLoginExecuting(OnLoginExecuting) + .OnLoginExecuted(OnLoginExecuted) + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +Task OnLoginExecuting(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + +Task OnLoginExecuted(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + + diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..2dd163f --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20559", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.WithCredentialsValidator": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5090", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..c2e6fd6 --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,16 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore8._0.WithCredentialsValidator +{ + public class UserCredentialsValidator : IUserCredentialsValidator + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public Task ValidateUserCredentials(string login, string password) + { + return Task.FromResult(login == Login && password == Password); + } + } +} + diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json b/Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file From 010176e37eee2602d27533b075b0ba0852e16e6d Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Sun, 22 Jun 2025 20:30:25 +0500 Subject: [PATCH 14/49] chore(tests): #65: add tests for net8 projects --- .../NetCore8.0/BasicAuthTestWithGeneric.cs | 112 ++++++++++++++++++ Examples/Tests/NetCore8.0/BasicAuthTests.cs | 60 ++++++++++ Examples/Tests/NetCore8.0/CookieTests.cs | 61 ++++++++++ .../Tests/NetCore8.0/LoginCallbackTests.cs | 79 ++++++++++++ Examples/Tests/NetCore8.0/LogoutTest.cs | 56 +++++++++ Examples/Tests/NetCore8.0/RefreshTests.cs | 87 ++++++++++++++ .../RefreshTestsWithConfidenceInterval.cs | 39 ++++++ .../Tests/NetCore8.0/RegistrationTests.cs | 67 +++++++++++ Examples/Tests/Tests.csproj | 2 +- 9 files changed, 562 insertions(+), 1 deletion(-) create mode 100644 Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs create mode 100644 Examples/Tests/NetCore8.0/BasicAuthTests.cs create mode 100644 Examples/Tests/NetCore8.0/CookieTests.cs create mode 100644 Examples/Tests/NetCore8.0/LoginCallbackTests.cs create mode 100644 Examples/Tests/NetCore8.0/LogoutTest.cs create mode 100644 Examples/Tests/NetCore8.0/RefreshTests.cs create mode 100644 Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs create mode 100644 Examples/Tests/NetCore8.0/RegistrationTests.cs diff --git a/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..ef36a97 --- /dev/null +++ b/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs @@ -0,0 +1,112 @@ +using System.Net; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class BasicAuthTestWithGeneric : + IClassFixture> + { + protected readonly WebApplicationFactory _factory; + protected readonly JsonSerializerOptions _jsonSerializerSettings; + + protected const string LoginUrl = "/auth/login"; + protected const string AuthorizedEndpointUrl = "/example"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTestWithGeneric(WebApplicationFactory factory) + { + _factory = factory; + + _jsonSerializerSettings = new JsonSerializerOptions + { + IgnoreNullValues = true, + AllowTrailingCommas = true, + WriteIndented = true, + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new JsonStringEnumConverter(), + }, + }; + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + + internal async Task<(HttpResponseMessage response, AuthResponseModel authModel)> LoginAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new LoginRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(LoginUrl, body); + + var authModel = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + + return (response, authModel); + } + + internal async Task CallAuthorizedEndpointAsync(string accessToken) + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + var response = await client.GetAsync(AuthorizedEndpointUrl); + return response; + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/BasicAuthTests.cs b/Examples/Tests/NetCore8.0/BasicAuthTests.cs new file mode 100644 index 0000000..5acbc81 --- /dev/null +++ b/Examples/Tests/NetCore8.0/BasicAuthTests.cs @@ -0,0 +1,60 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class BasicAuthTests : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/CookieTests.cs b/Examples/Tests/NetCore8.0/CookieTests.cs new file mode 100644 index 0000000..cbcae51 --- /dev/null +++ b/Examples/Tests/NetCore8.0/CookieTests.cs @@ -0,0 +1,61 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class CookieTests + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public CookieTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_SetsValidCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, Password); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie") + .Value; + + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", cookies); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_DoesNotSetCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, "123"); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie"); + + Assert.Null(cookies.Value); + } + + [Fact] + public async Task UsingInvalidCookie_Returns401() + { + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", new[] { "invalid-cookie" }); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/LoginCallbackTests.cs b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs new file mode 100644 index 0000000..f274468 --- /dev/null +++ b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs @@ -0,0 +1,79 @@ +using System.Text; +using Microsoft.AspNetCore.Http; +using Moq; +using Newtonsoft.Json; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract.Implementation; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class LoginCallbackTests + { + private readonly DefaultHttpContext _httpContext; + private readonly Mock> _onLoginExecutingMock; + private readonly Mock> _onLoginExecutedMock; + private readonly LoginService _loginService; + + public LoginCallbackTests() + { + _httpContext = new DefaultHttpContext(); + _httpContext.Request.Method = HttpMethods.Post; + _httpContext.Request.Path = new PathString("/login"); + + var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel + { + Login = "Admin", + Password = "Admin", + } + ) + ); + + _httpContext.Request.Body = new MemoryStream(requestData); + + _onLoginExecutingMock = new Mock>(); + + _onLoginExecutingMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _onLoginExecutedMock = new Mock>(); + + _onLoginExecutedMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _loginService = new LoginService(new TokenManager(new AuthenticationOptions + { + PrivateSigningKey = + "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", + }, + new DefaultUserClaimsProvider() + ), + new FakeUserCredentialValidator() + ); + } + + [Fact] + public async Task LoginCallbackInvokeWithDefaultLogin() + { + RequestDelegate next = d => Task.CompletedTask; + + var loginMiddleware = new LoginMiddleware(next, + new LoginEndpointOptions + { + LoginEndpointRoute = "/login", + }, + _onLoginExecutingMock.Object, + _onLoginExecutedMock.Object + ); + + await loginMiddleware.InvokeAsync(_httpContext, _loginService); + + _onLoginExecutingMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + _onLoginExecutedMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/LogoutTest.cs b/Examples/Tests/NetCore8.0/LogoutTest.cs new file mode 100644 index 0000000..5d54f7f --- /dev/null +++ b/Examples/Tests/NetCore8.0/LogoutTest.cs @@ -0,0 +1,56 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class LogoutTest + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public LogoutTest(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LogoutWithValidToken_Return200() + { + var loginResult = await LoginAsync(Login, Password); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + + [Fact] + public async Task LogoutWithInvalidToken_Return400() + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.NewGuid(), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.InternalServerError, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/RefreshTests.cs b/Examples/Tests/NetCore8.0/RefreshTests.cs new file mode 100644 index 0000000..2aac2b3 --- /dev/null +++ b/Examples/Tests/NetCore8.0/RefreshTests.cs @@ -0,0 +1,87 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class RefreshTests + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + public RefreshTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RefreshWithValidToken_ReturnsTokens() + { + var loginResult = await LoginAsync(Login, Password); + + var (_, result) = await CallRefresh(loginResult.authModel); + + Assert.False(string.IsNullOrWhiteSpace(result.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(result.RefreshToken.Value)); + } + + [Fact] + public async Task RefreshWithInvalidToken_Returns401() + { + var invalidAuthResponseModel = new AuthResponseModel + { + RefreshToken = new TokenModel + { + Value = Guid.NewGuid().ToString(), + }, + AccessToken = new TokenModel + { + Value = string.Empty, + }, + }; + + var (response, _) = await CallRefresh(invalidAuthResponseModel, Guid.NewGuid().ToString()); + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_Returns401() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + await CallRefresh(authModel, FingerPrint); + var (response, _) = await CallRefresh(authModel, FingerPrint); + + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task LogoutWithValidToken_DiscardsRefresh() + { + var loginResult = await LoginAsync(Login, Password); + + var refreshResult = await CallRefresh(loginResult.authModel); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs new file mode 100644 index 0000000..6a05666 --- /dev/null +++ b/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class RefreshTestsWithConfidenceInterval + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + private readonly AuthResponseModelEqualityComparer _authResponseModelEqualityComparer; + + public RefreshTestsWithConfidenceInterval(WebApplicationFactory factory) + : base(factory) + { + _authResponseModelEqualityComparer = new AuthResponseModelEqualityComparer(); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + var (_, authResponseModel1) = await CallRefresh(authModel, FingerPrint); + var (_, authResponseModel2) = await CallRefresh(authModel, FingerPrint); + var (response, authResponseModel3) = await CallRefresh(authModel, FingerPrint); + + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel1, authResponseModel2)); + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel2, authResponseModel3)); + + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.RefreshToken.Value)); + + Assert.True(response.IsSuccessStatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore8.0/RegistrationTests.cs b/Examples/Tests/NetCore8.0/RegistrationTests.cs new file mode 100644 index 0000000..04b8142 --- /dev/null +++ b/Examples/Tests/NetCore8.0/RegistrationTests.cs @@ -0,0 +1,67 @@ +using System.Net; +using System.Net.Http.Json; +using System.Text.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore8._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test"; + private const string Password = "Test1234."; + + public RegistrationTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RegisterWithInvalidCreds_Returns400() + { + var registerResult = await RegisterAsync(Login, "1"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + [Fact] + public async Task RegisterWithValidCreds_CreatesNewUser() + { + var registerResult = await RegisterAsync(Login, Password); + + var callAuthorizedEndpointResult = await CallAuthorizedEndpointAsync(registerResult.authModel.AccessToken.Value); + Assert.Equal(HttpStatusCode.OK, callAuthorizedEndpointResult.StatusCode); + + var loginResult = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(loginResult.authModel.AccessToken.Value)); + } + + [Fact] + public async Task RegisterWithCredsOfExistingUser_Returns400() + { + var registerResult = await RegisterAsync("Admin", "Admin"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + private async Task<(HttpResponseMessage response, AuthResponseModel authModel)> RegisterAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RegistrationRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(RegisterUrl, body); + var result = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + return (response, result); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/Tests.csproj b/Examples/Tests/Tests.csproj index 7d37550..5ac0428 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -1,7 +1,7 @@  - net7.0 + net8.0 false enable Tests From db672587bad8dc9ab5aca9b79cda172932199c49 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 24 Jun 2025 09:29:20 +0500 Subject: [PATCH 15/49] chore: #65: add example projects for net9 --- .../Controllers/ExampleController.cs | 33 ++++++++ .../Data/AppDbContext.cs | 14 ++++ ...henticationUsingGenericIdentityUser.csproj | 21 +++++ .../Models/CustomUser.cs | 9 +++ .../ProgramGeneric.cs | 67 ++++++++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++++ .../Data/AppDbContext.cs | 15 ++++ ...9.0.AuthenticationUsingIdentityUser.csproj | 21 +++++ .../Models/CustomUser.cs | 10 +++ .../Program.cs | 38 +++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++++ .../Data/AppDbContext.cs | 15 ++++ ...e9.0.AuthenticationWithRefreshToken.csproj | 20 +++++ .../Models/CustomUser.cs | 10 +++ .../Program.cs | 78 +++++++++++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 22 ++++++ ...ample.NetCore9.0.BaseAuthentication.csproj | 15 ++++ .../Program.cs | 27 +++++++ .../Properties/launchSettings.json | 41 ++++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 33 ++++++++ ...tCore9.0.CookiesBasedAuthentication.csproj | 15 ++++ .../ProgramCookies.cs | 44 +++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 34 ++++++++ ...ore9.0.PermissionBasedAuthorization.csproj | 16 ++++ .../Program.cs | 37 +++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../UserClaimsProvider.cs | 25 ++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++++ .../Data/AppDbContext.cs | 14 ++++ ...kenAuthAndRegistrationUsingIdentity.csproj | 20 +++++ .../Models/CustomUser.cs | 9 +++ .../Program.cs | 66 ++++++++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++++ .../Data/AppDbContext.cs | 14 ++++ ....RefreshTokenWithConfidenceInterval.csproj | 20 +++++ .../Models/CustomUser.cs | 9 +++ .../Program.cs | 66 ++++++++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../appsettings.json | 6 ++ .../Controllers/ExampleController.cs | 32 ++++++++ ...NetCore9.0.WithCredentialsValidator.csproj | 24 ++++++ .../Program.cs | 50 ++++++++++++ .../Properties/launchSettings.json | 31 ++++++++ .../UserCredentialsValidator.cs | 16 ++++ .../appsettings.json | 6 ++ 57 files changed, 1430 insertions(+) create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json create mode 100644 Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj create mode 100644 Examples/Example.NetCore9.0.BaseAuthentication/Program.cs create mode 100644 Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json create mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj create mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs create mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs create mode 100644 Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs create mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..de00ccd --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..f6085a0 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } + + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..d761248 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net9.0 + enable + disable + Example.NetCore9._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..33390b4 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..11b8b68 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,67 @@ +using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser + { + UserName = x.Login, + NormalizedUserName = x.Login, + } + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class ProgramGeneric { } + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..653e423 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:35556", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5160", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..fd471db --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..5a276f2 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,15 @@ +using Example.NetCore9._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..5dab5ef --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net9.0 + enable + enable + Example.NetCore9._0.AuthenticationUsingIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..72e9bfe --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..6e65126 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,38 @@ +using Example.NetCore9._0.AuthenticationUsingIdentityUser.Data; +using Example.NetCore9._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddBaseLogin(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); + diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..78fb330 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:23668", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5105", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..873ec1d --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..00437d8 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,15 @@ +using Example.NetCore9._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..ded0509 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + enable + enable + Example.NetCore9._0.AuthenticationWithRefreshToken + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..1139aba --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} + diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..a91e5a8 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,78 @@ +using Example.NetCore9._0.AuthenticationWithRefreshToken.Data; +using Example.NetCore9._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Logout.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + + + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + + + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware(); + +app + .OnLogoutExecuted(OnLogoutExecuted) + .OnLogoutExecuting(OnLogoutExecuting) + .UseLogoutMiddleware(); + +app + .OnRefreshExecuting(OnRefreshExecuting) + .UseRefreshMiddleware(); + +app.UseJwtAuthentication(); + +app.UseAuthorization(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.MapControllers(); + +app.Run(); + +Task OnLogoutExecuting(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnLogoutExecuted(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnRefreshExecuting(RefreshModel data) +{ + return Task.CompletedTask; +} + + + diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..33e5468 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:12783", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5054", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..f6c4404 --- /dev/null +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.BaseAuthentication.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + [HttpGet] + [Authorize] + public IActionResult Get() + { + return Ok("You are authenticated!"); + } + + [HttpGet("public")] + public IActionResult GetPublic() + { + return Ok("This endpoint is public"); + } +} diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj b/Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj new file mode 100644 index 0000000..cbfb2a1 --- /dev/null +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + enable + enable + Example.NetCore9._0.BaseAuthentication + + + + + + + + diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs b/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..9d80d68 --- /dev/null +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs @@ -0,0 +1,27 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.Run(); diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:31875", + "sslPort": 44329 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7081;http://localhost:5291", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json b/Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..6a062ae --- /dev/null +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..35c2047 --- /dev/null +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + enable + disable + Example.NetCore9._0.CookiesBasedAuthentication + + + + + + + + diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..84d9c9c --- /dev/null +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseCookieLoginMiddleware(new CookieAuthOptions + { + Key = "ExampleCookieName", + } + ); + +app.UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); + +public partial class ProgramCookies { } + diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..27e1352 --- /dev/null +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59033", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.CookiesBasedAuthentication": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5269", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..22ed80f --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; + +namespace Example.NetCore9._0.PermissionBasedAuthorization.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [RequiresPermission(UserClaimsProvider.FirstExampleClaimName)] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..88aa731 --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,16 @@ + + + + net9.0 + enable + enable + Example.NetCore9._0.PermissionBasedAuthorization + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..f237f7c --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,37 @@ +using Example.NetCore9._0.PermissionBasedAuthorization; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseAuthorization(); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + + diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..1cbc210 --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:2600", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.PermissionBasedAuthorization": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5007", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..d8254d2 --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,25 @@ +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore9._0.PermissionBasedAuthorization +{ + public class UserClaimsProvider : IUserClaimsProvider + { + public const string ExampleClaimType = "ExamplePermission"; + + public const string FirstExampleClaimName = "CanUseExampleFirst"; + + public const string SecondExampleClaimName = "CanUseExampleSecond"; + + public Task> GetUserClaimsAsync(string login) + { + return Task.FromResult(new List + { + new Claim(ExampleClaimType, FirstExampleClaimName), + new Claim(ExampleClaimType, SecondExampleClaimName), + } + ); + } + } +} + diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..925b926 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..48c9f8a --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..97d82a4 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + disable + disable + Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..8d08135 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..3a82159 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,66 @@ +using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public partial class Program { } + diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..275dc04 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..b1693d9 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..3731156 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..945791c --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + disable + disable + Example.NetCore9._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + + diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..3b02567 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} + diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..8ec3a3f --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,66 @@ +using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Data; +using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); +const int refreshConfidenceIntervalInMilliseconds = 300_000; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(refreshAuthenticationOptions) + .AddRefreshConfidenceInterval(refreshConfidenceIntervalInMilliseconds) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +public abstract class ProgramWithConfidenceInterval { } + diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..cf928d8 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..335028f --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.NetCore9._0.WithCredentialsValidator.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} + diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj b/Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..b04d0be --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj @@ -0,0 +1,24 @@ + + + + net9.0 + enable + enable + Example.NetCore9._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + + diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..60d8c8a --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,50 @@ +using Example.NetCore9._0.WithCredentialsValidator; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .AddUserCredentialValidator(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app + .OnLoginExecuting(OnLoginExecuting) + .OnLoginExecuted(OnLoginExecuted) + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +Task OnLoginExecuting(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + +Task OnLoginExecuted(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + + diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..2dd163f --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20559", + "sslPort": 0 + } + }, + "profiles": { + "Example.NetCore6._0.WithCredentialsValidator": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5090", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..88fff39 --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,16 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.NetCore9._0.WithCredentialsValidator +{ + public class UserCredentialsValidator : IUserCredentialsValidator + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public Task ValidateUserCredentials(string login, string password) + { + return Task.FromResult(login == Login && password == Password); + } + } +} + diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json b/Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file From 5f2f435c796087460bfd3a10d6afaa87e77892dc Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 24 Jun 2025 09:29:57 +0500 Subject: [PATCH 16/49] chore: #65: update tests csproj to net9 --- Examples/Tests/Tests.csproj | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Examples/Tests/Tests.csproj b/Examples/Tests/Tests.csproj index 5ac0428..82d7d2b 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -1,13 +1,13 @@  - net8.0 - false - enable - Tests + net9.0 + false + enable + Tests - + @@ -23,7 +23,7 @@ - + @@ -37,13 +37,13 @@ - - - + + + - - - PreserveNewest - - + + + PreserveNewest + + From 737264cbd4785099db89fa6600d9cc2072fabbfc Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 24 Jun 2025 10:05:18 +0500 Subject: [PATCH 17/49] chore: #65: update AspNetCore.Mvc.Testing package to 9 version --- Examples/Tests/Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Tests/Tests.csproj b/Examples/Tests/Tests.csproj index 82d7d2b..79df921 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -8,7 +8,7 @@ - + From af3ebe7c2468eda5ba584427f103513c780f67d5 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 24 Jun 2025 10:08:43 +0500 Subject: [PATCH 18/49] chore(tests): #65: add tests for net9 projects --- .../NetCore9.0/BasicAuthTestWithGeneric.cs | 112 ++++++++++++++++++ Examples/Tests/NetCore9.0/BasicAuthTests.cs | 60 ++++++++++ Examples/Tests/NetCore9.0/CookieTests.cs | 61 ++++++++++ .../Tests/NetCore9.0/LoginCallbackTests.cs | 79 ++++++++++++ Examples/Tests/NetCore9.0/LogoutTest.cs | 56 +++++++++ Examples/Tests/NetCore9.0/RefreshTests.cs | 87 ++++++++++++++ .../RefreshTestsWithConfidenceInterval.cs | 39 ++++++ .../Tests/NetCore9.0/RegistrationTests.cs | 67 +++++++++++ 8 files changed, 561 insertions(+) create mode 100644 Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs create mode 100644 Examples/Tests/NetCore9.0/BasicAuthTests.cs create mode 100644 Examples/Tests/NetCore9.0/CookieTests.cs create mode 100644 Examples/Tests/NetCore9.0/LoginCallbackTests.cs create mode 100644 Examples/Tests/NetCore9.0/LogoutTest.cs create mode 100644 Examples/Tests/NetCore9.0/RefreshTests.cs create mode 100644 Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs create mode 100644 Examples/Tests/NetCore9.0/RegistrationTests.cs diff --git a/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..44459e1 --- /dev/null +++ b/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs @@ -0,0 +1,112 @@ +using System.Net; +using System.Net.Http.Headers; +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class BasicAuthTestWithGeneric : + IClassFixture> + { + protected readonly WebApplicationFactory _factory; + protected readonly JsonSerializerOptions _jsonSerializerSettings; + + protected const string LoginUrl = "/auth/login"; + protected const string AuthorizedEndpointUrl = "/example"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTestWithGeneric(WebApplicationFactory factory) + { + _factory = factory; + + _jsonSerializerSettings = new JsonSerializerOptions + { + IgnoreNullValues = true, + AllowTrailingCommas = true, + WriteIndented = true, + PropertyNameCaseInsensitive = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + Converters = + { + new JsonStringEnumConverter(), + }, + }; + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + + internal async Task<(HttpResponseMessage response, AuthResponseModel authModel)> LoginAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new LoginRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(LoginUrl, body); + + var authModel = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + + return (response, authModel); + } + + internal async Task CallAuthorizedEndpointAsync(string accessToken) + { + var client = _factory.CreateClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + var response = await client.GetAsync(AuthorizedEndpointUrl); + return response; + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/BasicAuthTests.cs b/Examples/Tests/NetCore9.0/BasicAuthTests.cs new file mode 100644 index 0000000..00dda3c --- /dev/null +++ b/Examples/Tests/NetCore9.0/BasicAuthTests.cs @@ -0,0 +1,60 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class BasicAuthTests : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public BasicAuthTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(authModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authModel.RefreshToken.Value)); + } + + [Fact] + public async Task CallAuthorizedEndpointWithInvalidToken_Returns401() + { + var response = await CallAuthorizedEndpointAsync("invalid"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task CallAuthorizedEndpointWithValidToken_Returns200() + { + var (_, authModel) = await LoginAsync(Login, Password); + var response = await CallAuthorizedEndpointAsync(authModel.AccessToken.Value); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_Returns401() + { + var (response, _) = await LoginAsync(Login, "123"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Fact] + public async Task TwoSuccessfulLoginsInARow_ReturnsTokens() + { + var (_, firstAuthModel) = await LoginAsync(Login, Password); + var (_, secondAuthModel) = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(firstAuthModel.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(secondAuthModel.AccessToken.Value)); + Assert.NotEqual(firstAuthModel.RefreshToken.Value, secondAuthModel.RefreshToken.Value); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/CookieTests.cs b/Examples/Tests/NetCore9.0/CookieTests.cs new file mode 100644 index 0000000..58e2a62 --- /dev/null +++ b/Examples/Tests/NetCore9.0/CookieTests.cs @@ -0,0 +1,61 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class CookieTests + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + + public CookieTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LoginWithValidCreds_SetsValidCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, Password); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie") + .Value; + + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", cookies); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task LoginWithInvalidCreds_DoesNotSetCookieInResponse() + { + var (loginResponse, _) = await LoginAsync(Login, "123"); + + var cookies = loginResponse + .Headers + .SingleOrDefault(header => header.Key == "Set-Cookie"); + + Assert.Null(cookies.Value); + } + + [Fact] + public async Task UsingInvalidCookie_Returns401() + { + var client = _factory.CreateClient(); + + var message = new HttpRequestMessage(HttpMethod.Get, AuthorizedEndpointUrl); + message.Headers.Add("Cookie", new[] { "invalid-cookie" }); + + var response = await client.SendAsync(message); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/LoginCallbackTests.cs b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs new file mode 100644 index 0000000..3ae9541 --- /dev/null +++ b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs @@ -0,0 +1,79 @@ +using System.Text; +using Microsoft.AspNetCore.Http; +using Moq; +using Newtonsoft.Json; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract.Implementation; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class LoginCallbackTests + { + private readonly DefaultHttpContext _httpContext; + private readonly Mock> _onLoginExecutingMock; + private readonly Mock> _onLoginExecutedMock; + private readonly LoginService _loginService; + + public LoginCallbackTests() + { + _httpContext = new DefaultHttpContext(); + _httpContext.Request.Method = HttpMethods.Post; + _httpContext.Request.Path = new PathString("/login"); + + var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel + { + Login = "Admin", + Password = "Admin", + } + ) + ); + + _httpContext.Request.Body = new MemoryStream(requestData); + + _onLoginExecutingMock = new Mock>(); + + _onLoginExecutingMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _onLoginExecutedMock = new Mock>(); + + _onLoginExecutedMock.Setup(p => p(It.IsAny())) + .Returns(Task.CompletedTask); + + _loginService = new LoginService(new TokenManager(new AuthenticationOptions + { + PrivateSigningKey = + "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", + }, + new DefaultUserClaimsProvider() + ), + new FakeUserCredentialValidator() + ); + } + + [Fact] + public async Task LoginCallbackInvokeWithDefaultLogin() + { + RequestDelegate next = d => Task.CompletedTask; + + var loginMiddleware = new LoginMiddleware(next, + new LoginEndpointOptions + { + LoginEndpointRoute = "/login", + }, + _onLoginExecutingMock.Object, + _onLoginExecutedMock.Object + ); + + await loginMiddleware.InvokeAsync(_httpContext, _loginService); + + _onLoginExecutingMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + _onLoginExecutedMock.Verify(x => x.Invoke(It.IsAny()), Times.Once); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/LogoutTest.cs b/Examples/Tests/NetCore9.0/LogoutTest.cs new file mode 100644 index 0000000..9287be5 --- /dev/null +++ b/Examples/Tests/NetCore9.0/LogoutTest.cs @@ -0,0 +1,56 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class LogoutTest + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + + public LogoutTest(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task LogoutWithValidToken_Return200() + { + var loginResult = await LoginAsync(Login, Password); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + + [Fact] + public async Task LogoutWithInvalidToken_Return400() + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.NewGuid(), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.InternalServerError, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/RefreshTests.cs b/Examples/Tests/NetCore9.0/RefreshTests.cs new file mode 100644 index 0000000..dbacc22 --- /dev/null +++ b/Examples/Tests/NetCore9.0/RefreshTests.cs @@ -0,0 +1,87 @@ +using System.Net; +using System.Net.Http.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class RefreshTests + : AuthTestsBase + { + private const string LogoutUrl = "/auth/logout"; + + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + public RefreshTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RefreshWithValidToken_ReturnsTokens() + { + var loginResult = await LoginAsync(Login, Password); + + var (_, result) = await CallRefresh(loginResult.authModel); + + Assert.False(string.IsNullOrWhiteSpace(result.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(result.RefreshToken.Value)); + } + + [Fact] + public async Task RefreshWithInvalidToken_Returns401() + { + var invalidAuthResponseModel = new AuthResponseModel + { + RefreshToken = new TokenModel + { + Value = Guid.NewGuid().ToString(), + }, + AccessToken = new TokenModel + { + Value = string.Empty, + }, + }; + + var (response, _) = await CallRefresh(invalidAuthResponseModel, Guid.NewGuid().ToString()); + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_Returns401() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + await CallRefresh(authModel, FingerPrint); + var (response, _) = await CallRefresh(authModel, FingerPrint); + + Assert.Equal(HttpStatusCode.Conflict, response.StatusCode); + } + + [Fact] + public async Task LogoutWithValidToken_DiscardsRefresh() + { + var loginResult = await LoginAsync(Login, Password); + + var refreshResult = await CallRefresh(loginResult.authModel); + + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RefreshTokenRequestModel + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } + ); + + var logoutResult = await client.PostAsync(LogoutUrl, body); + + Assert.Equal(HttpStatusCode.OK, logoutResult.StatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs new file mode 100644 index 0000000..7b6a4aa --- /dev/null +++ b/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class RefreshTestsWithConfidenceInterval + : AuthTestsBase + { + private const string Login = "Admin"; + private const string Password = "Admin"; + private const string FingerPrint = "fingerprint"; + + private readonly AuthResponseModelEqualityComparer _authResponseModelEqualityComparer; + + public RefreshTestsWithConfidenceInterval(WebApplicationFactory factory) + : base(factory) + { + _authResponseModelEqualityComparer = new AuthResponseModelEqualityComparer(); + } + + [Fact] + public async Task RefreshWithTheSameValidTokenMultipleTimes_ReturnsTokens() + { + var (_, authModel) = await LoginAsync(Login, Password, FingerPrint); + + var (_, authResponseModel1) = await CallRefresh(authModel, FingerPrint); + var (_, authResponseModel2) = await CallRefresh(authModel, FingerPrint); + var (response, authResponseModel3) = await CallRefresh(authModel, FingerPrint); + + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel1, authResponseModel2)); + Assert.False(_authResponseModelEqualityComparer.Equals(authResponseModel2, authResponseModel3)); + + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.AccessToken.Value)); + Assert.False(string.IsNullOrWhiteSpace(authResponseModel3.RefreshToken.Value)); + + Assert.True(response.IsSuccessStatusCode); + } + } +} \ No newline at end of file diff --git a/Examples/Tests/NetCore9.0/RegistrationTests.cs b/Examples/Tests/NetCore9.0/RegistrationTests.cs new file mode 100644 index 0000000..df6961d --- /dev/null +++ b/Examples/Tests/NetCore9.0/RegistrationTests.cs @@ -0,0 +1,67 @@ +using System.Net; +using System.Net.Http.Json; +using System.Text.Json; +using Microsoft.AspNetCore.Mvc.Testing; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using Xunit; + +namespace Tests.NetCore9._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test"; + private const string Password = "Test1234."; + + public RegistrationTests(WebApplicationFactory factory) + : base(factory) + { + } + + [Fact] + public async Task RegisterWithInvalidCreds_Returns400() + { + var registerResult = await RegisterAsync(Login, "1"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + [Fact] + public async Task RegisterWithValidCreds_CreatesNewUser() + { + var registerResult = await RegisterAsync(Login, Password); + + var callAuthorizedEndpointResult = await CallAuthorizedEndpointAsync(registerResult.authModel.AccessToken.Value); + Assert.Equal(HttpStatusCode.OK, callAuthorizedEndpointResult.StatusCode); + + var loginResult = await LoginAsync(Login, Password); + + Assert.False(string.IsNullOrWhiteSpace(loginResult.authModel.AccessToken.Value)); + } + + [Fact] + public async Task RegisterWithCredsOfExistingUser_Returns400() + { + var registerResult = await RegisterAsync("Admin", "Admin"); + Assert.Equal(HttpStatusCode.Conflict, registerResult.response.StatusCode); + } + + private async Task<(HttpResponseMessage response, AuthResponseModel authModel)> RegisterAsync(string login, string password) + { + var client = _factory.CreateClient(); + + var body = JsonContent.Create(new RegistrationRequestModel + { + Login = login, + Password = password, + } + ); + + var response = await client.PostAsync(RegisterUrl, body); + var result = JsonSerializer.Deserialize(response.Content.ReadAsStringAsync().Result, _jsonSerializerSettings); + return (response, result); + } + } +} \ No newline at end of file From 3d69c0c88767328d2606495f66c79dfbdb71658a Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 10:09:18 +0500 Subject: [PATCH 19/49] chore(tests): #65: change db names and user credits to fix flacky register with valid tests --- .../Startup.cs | 2 +- .../Program.cs | 2 +- .../Program.cs | 2 +- .../Program.cs | 2 +- .../Program.cs | 2 +- Examples/Tests/NetCore5.0/RegistrationTests.cs | 2 +- Examples/Tests/NetCore6.0/RegistrationTests.cs | 2 +- Examples/Tests/NetCore7.0/RegistrationTests.cs | 2 +- Examples/Tests/NetCore8.0/RegistrationTests.cs | 2 +- Examples/Tests/NetCore9.0/RegistrationTests.cs | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs index 22eb234..9756420 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs +++ b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs @@ -29,7 +29,7 @@ public void ConfigureServices(IServiceCollection services) var a = opt.AccessTokenExpireInMinutes; services.AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net5") ); services diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 0dc5e62..bf3587a 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -23,7 +23,7 @@ builder.Services .AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net6") ); builder.Services diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 755e0ff..75c88f2 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -23,7 +23,7 @@ builder.Services .AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net7") ); builder.Services diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 1346c8c..998fac5 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -23,7 +23,7 @@ builder.Services .AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net8") ); builder.Services diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 3a82159..ff03a6e 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -23,7 +23,7 @@ builder.Services .AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net9") ); builder.Services diff --git a/Examples/Tests/NetCore5.0/RegistrationTests.cs b/Examples/Tests/NetCore5.0/RegistrationTests.cs index f50993d..7bbe1d4 100644 --- a/Examples/Tests/NetCore5.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore5.0/RegistrationTests.cs @@ -15,7 +15,7 @@ public class RegistrationTests { private const string RegisterUrl = "/auth/register"; - private const string Login = "test"; + private const string Login = "test_net5"; private const string Password = "Test1234."; public RegistrationTests(WebApplicationFactory factory) diff --git a/Examples/Tests/NetCore6.0/RegistrationTests.cs b/Examples/Tests/NetCore6.0/RegistrationTests.cs index 4794ea7..8407d1a 100644 --- a/Examples/Tests/NetCore6.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore6.0/RegistrationTests.cs @@ -14,7 +14,7 @@ public class RegistrationTests { private const string RegisterUrl = "/auth/register"; - private const string Login = "test"; + private const string Login = "test_net6"; private const string Password = "Test1234."; public RegistrationTests(WebApplicationFactory factory) diff --git a/Examples/Tests/NetCore7.0/RegistrationTests.cs b/Examples/Tests/NetCore7.0/RegistrationTests.cs index cdf4951..000596b 100644 --- a/Examples/Tests/NetCore7.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore7.0/RegistrationTests.cs @@ -13,7 +13,7 @@ public class RegistrationTests { private const string RegisterUrl = "/auth/register"; - private const string Login = "test"; + private const string Login = "test_net7"; private const string Password = "Test1234."; public RegistrationTests(WebApplicationFactory factory) diff --git a/Examples/Tests/NetCore8.0/RegistrationTests.cs b/Examples/Tests/NetCore8.0/RegistrationTests.cs index 04b8142..f94ac46 100644 --- a/Examples/Tests/NetCore8.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore8.0/RegistrationTests.cs @@ -13,7 +13,7 @@ public class RegistrationTests { private const string RegisterUrl = "/auth/register"; - private const string Login = "test"; + private const string Login = "test_net8"; private const string Password = "Test1234."; public RegistrationTests(WebApplicationFactory factory) diff --git a/Examples/Tests/NetCore9.0/RegistrationTests.cs b/Examples/Tests/NetCore9.0/RegistrationTests.cs index df6961d..36245e6 100644 --- a/Examples/Tests/NetCore9.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore9.0/RegistrationTests.cs @@ -13,7 +13,7 @@ public class RegistrationTests { private const string RegisterUrl = "/auth/register"; - private const string Login = "test"; + private const string Login = "test_net9"; private const string Password = "Test1234."; public RegistrationTests(WebApplicationFactory factory) From baf751cab081b5bbc2f4f97237facafa9d9ce9bc Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 10:13:23 +0500 Subject: [PATCH 20/49] chore: #65: update .sln file --- AspNetCore.JwtAuthentication.sln | 102 +++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index bbd85d0..ee68024 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -100,6 +100,26 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.WithCred EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore8.0", "NetCore8.0", "{3DC4FB03-312C-4EFB-838C-F95431860DFC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore9.0.AuthenticationUsingGenericIdentityUser\Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj", "{534CD87F-4858-47CC-BE27-8C60EAF98D75}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore9.0.AuthenticationUsingIdentityUser\Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj", "{93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore9.0.AuthenticationWithRefreshToken\Example.NetCore9.0.AuthenticationWithRefreshToken.csproj", "{5B59AF22-4146-4881-884B-1123D39361CD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.BaseAuthentication", "Examples\Example.NetCore9.0.BaseAuthentication\Example.NetCore9.0.BaseAuthentication.csproj", "{E98221D9-DCAA-461E-BE07-13E612E914C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.CookiesBasedAuthentication", "Examples\Example.NetCore9.0.CookiesBasedAuthentication\Example.NetCore9.0.CookiesBasedAuthentication.csproj", "{39F7B3D2-15F5-46C3-87CC-9E2916591930}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.PermissionBasedAuthorization", "Examples\Example.NetCore9.0.PermissionBasedAuthorization\Example.NetCore9.0.PermissionBasedAuthorization.csproj", "{FACED86D-3326-4B98-98DA-87FC6A789560}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8B6E2110-1BD0-419C-B614-2CB2FC2683D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore9.0.RefreshTokenWithConfidenceInterval\Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj", "{63A683E6-AD18-4FC2-87C2-E4043E1C696C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.WithCredentialsValidator", "Examples\Example.NetCore9.0.WithCredentialsValidator\Example.NetCore9.0.WithCredentialsValidator.csproj", "{A8E18C36-BF99-42A7-9055-47E4C3449214}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore9.0", "NetCore9.0", "{1190019C-C08E-4729-8C0D-BB651642C479}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -428,6 +448,78 @@ Global {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x64.Build.0 = Release|Any CPU {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x86.ActiveCfg = Release|Any CPU {48786B11-B83A-4134-85C6-4E9F959F9C06}.Release|x86.Build.0 = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|Any CPU.Build.0 = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|x64.ActiveCfg = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|x64.Build.0 = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|x86.ActiveCfg = Release|Any CPU + {534CD87F-4858-47CC-BE27-8C60EAF98D75}.Release|x86.Build.0 = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|Any CPU.Build.0 = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|x64.ActiveCfg = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|x64.Build.0 = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|x86.ActiveCfg = Release|Any CPU + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}.Release|x86.Build.0 = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|Any CPU.Build.0 = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|x64.ActiveCfg = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|x64.Build.0 = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|x86.ActiveCfg = Release|Any CPU + {5B59AF22-4146-4881-884B-1123D39361CD}.Release|x86.Build.0 = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|Any CPU.Build.0 = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|x64.ActiveCfg = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|x64.Build.0 = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|x86.ActiveCfg = Release|Any CPU + {E98221D9-DCAA-461E-BE07-13E612E914C0}.Release|x86.Build.0 = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|Any CPU.Build.0 = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|x64.ActiveCfg = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|x64.Build.0 = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|x86.ActiveCfg = Release|Any CPU + {39F7B3D2-15F5-46C3-87CC-9E2916591930}.Release|x86.Build.0 = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|Any CPU.Build.0 = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|x64.ActiveCfg = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|x64.Build.0 = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|x86.ActiveCfg = Release|Any CPU + {FACED86D-3326-4B98-98DA-87FC6A789560}.Release|x86.Build.0 = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|Any CPU.Build.0 = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|x64.ActiveCfg = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|x64.Build.0 = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|x86.ActiveCfg = Release|Any CPU + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0}.Release|x86.Build.0 = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|Any CPU.Build.0 = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|x64.ActiveCfg = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|x64.Build.0 = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|x86.ActiveCfg = Release|Any CPU + {63A683E6-AD18-4FC2-87C2-E4043E1C696C}.Release|x86.Build.0 = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|Any CPU.Build.0 = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|x64.ActiveCfg = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|x64.Build.0 = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|x86.ActiveCfg = Release|Any CPU + {A8E18C36-BF99-42A7-9055-47E4C3449214}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -476,6 +568,16 @@ Global {CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} {48786B11-B83A-4134-85C6-4E9F959F9C06} = {3DC4FB03-312C-4EFB-838C-F95431860DFC} {3DC4FB03-312C-4EFB-838C-F95431860DFC} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {534CD87F-4858-47CC-BE27-8C60EAF98D75} = {1190019C-C08E-4729-8C0D-BB651642C479} + {93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9} = {1190019C-C08E-4729-8C0D-BB651642C479} + {5B59AF22-4146-4881-884B-1123D39361CD} = {1190019C-C08E-4729-8C0D-BB651642C479} + {E98221D9-DCAA-461E-BE07-13E612E914C0} = {1190019C-C08E-4729-8C0D-BB651642C479} + {39F7B3D2-15F5-46C3-87CC-9E2916591930} = {1190019C-C08E-4729-8C0D-BB651642C479} + {FACED86D-3326-4B98-98DA-87FC6A789560} = {1190019C-C08E-4729-8C0D-BB651642C479} + {8B6E2110-1BD0-419C-B614-2CB2FC2683D0} = {1190019C-C08E-4729-8C0D-BB651642C479} + {63A683E6-AD18-4FC2-87C2-E4043E1C696C} = {1190019C-C08E-4729-8C0D-BB651642C479} + {A8E18C36-BF99-42A7-9055-47E4C3449214} = {1190019C-C08E-4729-8C0D-BB651642C479} + {1190019C-C08E-4729-8C0D-BB651642C479} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} From cf778110a7dfc006e7d6589b44e9455f7e34a157 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 10:19:23 +0500 Subject: [PATCH 21/49] chore(Core): #65: update .NET target versions --- .../JwtAuthentication.Core.csproj | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 4e2c054..9857345 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -1,7 +1,7 @@  - netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 + netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core 0.3.4 Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev @@ -34,8 +34,6 @@ - @@ -45,6 +43,21 @@ + + + + + + + + + + + + + + + From da65e636215b8ff1401b5071d1909c3f54cba1f3 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 10:56:50 +0500 Subject: [PATCH 22/49] chore(Identity): #65: update .NET target versions --- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index a3eab6b..4a46af7 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -1,7 +1,7 @@  - netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 + netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity 0.1.1 Koval Maxim, Nikita Medvedev From 797ee186fad61f4e24059df93b6b479050cd28b8 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 11:34:24 +0500 Subject: [PATCH 23/49] chore(readme): #65: update .NET versions info --- JwtAuthentication.Core/README.md | 42 +++++++-------- JwtAuthentication.Core/Usage for old .NET.md | 38 ++++++------- JwtAuthentication.Identity/README.md | 54 +++++++++---------- .../Usage for old .NET.md | 48 ++++++++--------- README.md | 2 +- 5 files changed, 92 insertions(+), 92 deletions(-) diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index aa4fce1..608ccdd 100644 --- a/JwtAuthentication.Core/README.md +++ b/JwtAuthentication.Core/README.md @@ -1,9 +1,9 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) -The library can be used for all projects based on .NET Core 3.0 - .NET Core 6.0. +The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. -Readme for usage on [.NET Core 3.0 - .NET Core 5.0](Usage%20for%20old%20.NET.md). +Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. This library contains middleware and authentication extensions. @@ -48,7 +48,7 @@ In this case, the default options will be used. Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; @@ -75,7 +75,7 @@ app This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; @@ -123,7 +123,7 @@ To use package you need to pass AuthenticationOptions to the AddJwtAuthenticatio | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; ... @@ -138,7 +138,7 @@ builder ... ``` -Minimum appsettings.json configuration: +Minimum `appsettings.json` configuration: ```json { "AuthenticationOptions": { @@ -148,7 +148,7 @@ Minimum appsettings.json configuration: } ``` -For generate pair RSA keys, use https://mkjwk.org/. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. ## Routing @@ -156,7 +156,7 @@ Here we can generate key pair in RSA521 algorithm and 2048 key size. In package The default route to the login endpoint is `/auth/login`. You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: -```csharp +```cs ... var app = builder.Build(); @@ -168,7 +168,7 @@ app ``` **OR** like this if you are using cookie middleware: -```csharp +```cs ... var app = builder.Build(); @@ -206,7 +206,7 @@ As a successful result it will return **Access Token Model** json: By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -223,8 +223,8 @@ public class UserCredentialsValidator : IUserCredentialsValidator } ``` -Program.cs -```csharp +`Program.cs` +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; ... @@ -242,7 +242,7 @@ builder.services To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: For methods: -```csharp +```cs [Authorize] [HttpGet] public IEnumerable Get() @@ -252,7 +252,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs [Authorize] [ApiController] [Route("[controller]")] @@ -267,7 +267,7 @@ public class ExampleController : ControllerBase This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: 1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -290,9 +290,9 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the Startup.cs. +2. Connect this provider in the `Startup.cs`. You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; var builder = WebApplication.CreateBuilder(args); @@ -315,7 +315,7 @@ The claims in the token will look like this: ``` 3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; [Authorize] @@ -328,7 +328,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; [ApiController] @@ -353,7 +353,7 @@ To use callbacks for authentication, follow these steps: 1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; private Task OnLoginExecuting(LoginModel data) @@ -364,7 +364,7 @@ private Task OnLoginExecuting(LoginModel data) 2. In the `Program` class in the app builder section use -```charp +```cs var app = builder.Build(); app diff --git a/JwtAuthentication.Core/Usage for old .NET.md b/JwtAuthentication.Core/Usage for old .NET.md index 3dded77..db710b2 100644 --- a/JwtAuthentication.Core/Usage for old .NET.md +++ b/JwtAuthentication.Core/Usage for old .NET.md @@ -1,9 +1,9 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) -The library can be used for all projects based on .NET Core 3.0 - .NET Core 6.0. +The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. -Readme for usage on [.NET Core 6.0](README.md). +Readme for usage on [.NET Core 6.0](README.md) or newer. We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. This library contains middleware and authentication extensions. @@ -41,7 +41,7 @@ In this case, the default options will be used. Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -76,7 +76,7 @@ public class Startup This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -121,7 +121,7 @@ To use package you need to pass AuthenticationOptions to the AddJwtAuthenticatio | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; ... @@ -135,7 +135,7 @@ public void ConfigureServices(IServiceCollection services) } ``` -Minimum appsettings.json configuration: +Minimum `appsettings.json` configuration: ```json { "AuthenticationOptions": { @@ -145,7 +145,7 @@ Minimum appsettings.json configuration: } ``` -For generate pair RSA keys, use https://mkjwk.org/. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. ## Routing @@ -153,7 +153,7 @@ Here we can generate key pair in RSA521 algorithm and 2048 key size. In package The default route to the login endpoint is `/auth/login`. You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: -```csharp +```cs public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... @@ -164,7 +164,7 @@ public async void Configure(IApplicationBuilder app, IHostingEnvironment env) ``` **OR** like this if you are using cookie middleware: -```csharp +```cs public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... @@ -202,7 +202,7 @@ As a successful result it will return **Access Token Model** json: By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -236,7 +236,7 @@ public class Startup To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: For methods: -```csharp +```cs [Authorize] [HttpGet] public IEnumerable Get() @@ -246,7 +246,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs [Authorize] [ApiController] [Route("[controller]")] @@ -261,7 +261,7 @@ public class ExampleController : ControllerBase This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: 1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -284,9 +284,9 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the Startup.cs. +2. Connect this provider in the `Startup.cs`. You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; public void ConfigureServices(IServiceCollection services) @@ -310,7 +310,7 @@ The claims in the token will look like this: ``` 3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; [Authorize] @@ -323,7 +323,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; [ApiController] @@ -348,7 +348,7 @@ To use callbacks for authentication, follow these steps: 1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; private Task OnLoginExecuting(LoginModel data) @@ -359,7 +359,7 @@ private Task OnLoginExecuting(LoginModel data) 2. In the `Startup` class in the `Configure` method use -```charp +```cs app .OnLoginExecuting(OnLoginExecuting) .OnLoginExecuted(OnLoginExecuted) diff --git a/JwtAuthentication.Identity/README.md b/JwtAuthentication.Identity/README.md index 2e579b1..c601d58 100644 --- a/JwtAuthentication.Identity/README.md +++ b/JwtAuthentication.Identity/README.md @@ -1,13 +1,13 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) -The library can be used for all projects based on .NET Core 3.0 - .NET Core 6.0. +The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. -Readme for usage on [.NET Core 3.0 - .NET Core 5.0](Usage%20for%20old%20.NET.md). +Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). This library contains middleware and authentication extensions. With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. -Optianally, you can enable usage of Refresh token to provide additional level of security to your app. +Optionally, you can enable usage of Refresh token to provide additional level of security to your app. Also, this library allows to easily implement registration and logout functionality. **NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) @@ -44,7 +44,7 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity # Basic usage 1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -58,7 +58,7 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -69,7 +69,7 @@ var configuration = builder.Configuration; ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +builder. services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions); @@ -84,7 +84,7 @@ app ``` 3. Optionally you can add the default user to the database -```csharp +```cs ... var app = builder.Build(); @@ -102,7 +102,7 @@ But can also use your own ID type by passing a generic type key in the **TKey** For example, by creating a custom entity with its id long type. -```csharp +```cs ... public class CustomUser : IdentityUser // where long is generic type { @@ -113,7 +113,7 @@ public class CustomUser : IdentityUser // where long is generic type Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. > AppDbContext.cs -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -128,7 +128,7 @@ public class AppDbContext : TourmalineDbContext > Program.cs -```csharp +```cs ... var builder = WebApplication.CreateBuilder(args); @@ -156,11 +156,11 @@ app.UseRegistration(x => new CustomUser # Registration -Using Identity allows you to easily implement regestration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: -- **User**: Entity representing the user of your app. It is must be inhereted from IdentityUser. +Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: +- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. - **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -172,7 +172,7 @@ var configuration = builder.Configuration; ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +builder. services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions) @@ -200,14 +200,14 @@ You can call the registration endpoint, you need to use the POST method, add to } ``` -As a successful result it will return **Access Token Model**, so user will be automaically logged in. +As a successful result it will return **Access Token Model**, so user will be automatically logged in. ## Registration Routing The default route to the Registration endpoint is `/auth/register`. You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: -```csharp +```cs ... var app = builder.Build(); @@ -228,7 +228,7 @@ app.UseRegistration(requestModel => new C If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -239,7 +239,7 @@ var configuration = builder.Configuration; ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +builder. services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); @@ -256,7 +256,7 @@ app ``` ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a genereted access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. In addition to a access token login request will also return a **refresh token** in the response. ```json @@ -284,7 +284,7 @@ When you use a refresh token, its value will be added to every successful login ## Refresh Token Request -To call the Refresh Token Endpoind, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json { "refreshTokenValue": "{{REFRESH_TOKEN}}", @@ -311,7 +311,7 @@ To use package you need to pass AuthenticationOptions to the AddJwtAuthenticatio | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; ... @@ -340,7 +340,7 @@ Minimum appsettings.json configuration: The default route to the refresh endpoint is `/auth/refresh`. You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; ... @@ -421,7 +421,7 @@ sequenceDiagram Usage examples: You can set refresh confidence interval directly (in milliseconds) -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); @@ -438,7 +438,7 @@ You can also choose not to set a refresh confidence interval. In this case, the refresh confidence interval will be set to 60,000 milliseconds. With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); @@ -454,7 +454,7 @@ builder.Services If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -481,7 +481,7 @@ app ## Logout request -To call the Logout Endpoind, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json { "refreshTokenValue": "{{REFRESH_TOKEN}}", @@ -499,7 +499,7 @@ The only difference in implementation will be in the second step when adding ser Connect this provider in the Startup.cs. You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); diff --git a/JwtAuthentication.Identity/Usage for old .NET.md b/JwtAuthentication.Identity/Usage for old .NET.md index 84c2ff7..78fe3ce 100644 --- a/JwtAuthentication.Identity/Usage for old .NET.md +++ b/JwtAuthentication.Identity/Usage for old .NET.md @@ -1,13 +1,13 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) -The library can be used for all projects based on .NET Core 3.0 - .NET Core 6.0. +The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. -Readme for usage on [.NET Core 6.0](README.md). +Readme for usage on [.NET 6.0](README.md) or newer. This library contains middleware and authentication extensions. With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. -Optianally, you can enable usage of Refresh token to provide additional level of security to your app. +Optionally, you can enable usage of Refresh token to provide additional level of security to your app. Also, this library allows to easily implement registration and logout functionality. **NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) @@ -41,7 +41,7 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity # Basic usage 1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -55,7 +55,7 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -89,7 +89,7 @@ public class Startup ``` 3. Optionally you can add the default user to the database -```csharp +```cs public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) @@ -109,7 +109,7 @@ But can also use your own ID type by passing a generic type key in the **TKey** For example, by creating a custom entity with its id long type. -```csharp +```cs public class CustomUser : IdentityUser // where long is generic type { public string Name { get; set; } @@ -119,7 +119,7 @@ public class CustomUser : IdentityUser // where long is generic type Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. > Database context class -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class AppDbContext : TourmalineDbContext @@ -133,7 +133,7 @@ public class AppDbContext : TourmalineDbContext > Startup.cs -```csharp +```cs ... public void ConfigureServices(IServiceCollection services) { @@ -171,11 +171,11 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) # Registration -Using Identity allows you to easily implement regestration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: -- **User**: Entity representing the user of your app. It is must be inhereted from IdentityUser. +Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: +- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. - **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -223,14 +223,14 @@ You can call the registration endpoint, you need to use the POST method, add to } ``` -As a successful result it will return **Access Token Model**, so user will be automaically logged in. +As a successful result it will return **Access Token Model**, so user will be automatically logged in. ## Registration Routing The default route to the Registration endpoint is `/auth/register`. You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: -```csharp +```cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... @@ -251,7 +251,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -288,7 +288,7 @@ public class Startup ``` ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a genereted access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. In addition to a access token login request will also return a **refresh token** in the response. ```json @@ -316,7 +316,7 @@ When you use a refresh token, its value will be added to every successful login ## Refresh Token Request -To call the Refresh Token Endpoind, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json { "refreshTokenValue": "{{REFRESH_TOKEN}}", @@ -343,7 +343,7 @@ To use package you need to pass AuthenticationOptions to the AddJwtAuthenticatio | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; ... @@ -375,7 +375,7 @@ Minimum appsettings.json configuration: The default route to the refresh endpoint is `/auth/refresh`. You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; ... @@ -457,7 +457,7 @@ sequenceDiagram Usage examples: You can set refresh confidence interval directly (in milliseconds) -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -494,7 +494,7 @@ You can also choose not to set a refresh confidence interval. In this case, the refresh confidence interval will be set to 60,000 milliseconds. With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -531,7 +531,7 @@ public class Startup If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: -```csharp +```cs ... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -563,7 +563,7 @@ public class Startup ## Logout request -To call the Logout Endpoind, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json { "refreshTokenValue": "{{REFRESH_TOKEN}}", @@ -581,7 +581,7 @@ The only difference in implementation will be in the second step when adding ser Connect this provider in the Startup.cs. You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public void ConfigureServices(IServiceCollection services) diff --git a/README.md b/README.md index 09a77c0..ef03e45 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # TourmalineCore.AspNetCore.JwtAuthentication This project contains libraries that will help you very easily connect the JWT-based authentication to your project. -The libraries can be used for all projects based on .NET Core 3.0 - .NET Core 5.0. +The libraries can be used for all projects based on .NET Core 3.0 - .NET 9.0. ## [JwtAuthentication.Core](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) Basic JWT-based authentication implementation. From 3ebd9a83e39f36bde86681c019bee64e37574d9b Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 11:36:04 +0500 Subject: [PATCH 24/49] chore(ci): #65: update test workflow to .NET 9 --- .github/workflows/tests_workflow.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests_workflow.yml b/.github/workflows/tests_workflow.yml index ea56980..d1dbff8 100644 --- a/.github/workflows/tests_workflow.yml +++ b/.github/workflows/tests_workflow.yml @@ -2,16 +2,16 @@ name: .NET on: push: - + jobs: tests: - name: Run tests - runs-on: 'ubuntu-latest' + name: Run tests + runs-on: "ubuntu-latest" steps: - - uses: actions/checkout@master - - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '6.0' - - run: | - dotnet restore ./Examples/Tests/Tests.csproj - dotnet test ./Examples/Tests/Tests.csproj --verbosity normal \ No newline at end of file + - uses: actions/checkout@master + - uses: actions/setup-dotnet@v1 + with: + dotnet-version: "9.0" + - run: | + dotnet restore ./Examples/Tests/Tests.csproj + dotnet test ./Examples/Tests/Tests.csproj --verbosity normal From eb64b351048007a2ebd48333b73c6924d1cc19c6 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 13:29:05 +0500 Subject: [PATCH 25/49] chore(codestyle): apply dotnet format --- .../Startup.cs | 6 +- .../Startup.cs | 8 +- .../Program.cs | 2 +- .../Startup.cs | 8 +- .../Data/AppDbContext.cs | 10 +-- .../ProgramGeneric.cs | 8 +- .../Data/AppDbContext.cs | 22 ++--- .../Program.cs | 3 +- .../ProgramCookies.cs | 6 +- .../Program.cs | 2 +- .../UserClaimsProvider.cs | 42 ++++----- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 11 ++- .../Models/CustomUser.cs | 2 +- .../ProgramGeneric.cs | 10 +-- .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 4 +- .../Controllers/ExampleController.cs | 2 +- .../ProgramCookies.cs | 8 +- .../Controllers/ExampleController.cs | 2 +- .../Program.cs | 3 +- .../UserClaimsProvider.cs | 2 +- .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 2 +- .../Program.cs | 3 +- .../UserCredentialsValidator.cs | 2 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 12 ++- .../Models/CustomUser.cs | 3 +- .../ProgramGeneric.cs | 11 ++- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 5 +- .../Controllers/ExampleController.cs | 2 +- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 3 +- .../ProgramCookies.cs | 9 +- .../Controllers/ExampleController.cs | 3 +- .../Program.cs | 4 +- .../UserClaimsProvider.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Program.cs | 4 +- .../UserCredentialsValidator.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 12 ++- .../Models/CustomUser.cs | 3 +- .../ProgramGeneric.cs | 11 ++- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 5 +- .../Controllers/ExampleController.cs | 2 +- .../Program.cs | 2 +- .../Controllers/ExampleController.cs | 3 +- .../ProgramCookies.cs | 9 +- .../Controllers/ExampleController.cs | 3 +- .../Program.cs | 4 +- .../UserClaimsProvider.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Data/AppDbContext.cs | 3 +- .../Models/CustomUser.cs | 3 +- .../Program.cs | 3 +- .../Controllers/ExampleController.cs | 3 +- .../Program.cs | 4 +- .../UserCredentialsValidator.cs | 3 +- .../AuthResponseModelEqualityComparer.cs | 2 +- Examples/Tests/AuthTestsBase.cs | 18 ++-- .../Tests/NetCore5.0/LoginCallbackTests.cs | 14 +-- Examples/Tests/NetCore5.0/LogoutTest.cs | 12 +-- .../Tests/NetCore5.0/RegistrationTests.cs | 8 +- .../Tests/NetCore6.0/LoginCallbackTests.cs | 14 +-- Examples/Tests/NetCore6.0/LogoutTest.cs | 12 +-- Examples/Tests/NetCore6.0/RefreshTests.cs | 6 +- .../Tests/NetCore6.0/RegistrationTests.cs | 8 +- .../Tests/NetCore7.0/LoginCallbackTests.cs | 14 +-- Examples/Tests/NetCore7.0/LogoutTest.cs | 12 +-- Examples/Tests/NetCore7.0/RefreshTests.cs | 6 +- .../Tests/NetCore7.0/RegistrationTests.cs | 8 +- .../Tests/NetCore8.0/LoginCallbackTests.cs | 14 +-- Examples/Tests/NetCore8.0/LogoutTest.cs | 12 +-- Examples/Tests/NetCore8.0/RefreshTests.cs | 6 +- .../Tests/NetCore8.0/RegistrationTests.cs | 8 +- .../Tests/NetCore9.0/LoginCallbackTests.cs | 14 +-- Examples/Tests/NetCore9.0/LogoutTest.cs | 12 +-- Examples/Tests/NetCore9.0/RefreshTests.cs | 6 +- .../Tests/NetCore9.0/RegistrationTests.cs | 8 +- .../Services/IRefreshTokenManager.cs | 2 +- .../Services/Implementation/TokenManager.cs | 8 +- .../ApplicationBuilderExtensions.cs | 6 +- .../Middleware/Logout/LogoutMiddleware.cs | 2 +- .../Options/RefreshOptions.cs | 42 ++++----- .../Services/IdentityLogoutService.cs | 4 +- .../Services/IdentityRefreshLoginService.cs | 12 +-- .../Services/IdentityRegistrationService.cs | 8 +- .../Services/RefreshSignInManager.cs | 4 +- .../Services/RefreshTokenManager.cs | 4 +- .../Signing/SigningHelper.cs | 54 ++++++------ .../IdentityUserCredentialsValidator.cs | 88 +++++++++---------- 133 files changed, 404 insertions(+), 476 deletions(-) diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs b/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs index 7421b24..cd5d3bf 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs +++ b/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs @@ -34,9 +34,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRouting(); app.UseCookieLoginMiddleware(new CookieAuthOptions - { - Key = "ExampleCookieName", - } + { + Key = "ExampleCookieName", + } ); app.UseJwtAuthentication(); diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs index 9756420..1df60d9 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs +++ b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs @@ -59,10 +59,10 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } + { + UserName = x.Login, + NormalizedUserName = x.Login, + } ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs index d81a8d6..a5a72c4 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -16,4 +16,4 @@ private static IHostBuilder CreateHostBuilder(string[] args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs index 647e317..e980087 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs +++ b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs @@ -57,10 +57,10 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } + { + UserName = x.Login, + NormalizedUserName = x.Login, + } ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index da2b1a3..89619ae 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -3,10 +3,10 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Data; - public class AppDbContext : TourmalineDbContext +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) { - public AppDbContext(DbContextOptions options) - : base(options) - { - } } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index d9c6a83..75238a2 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -53,10 +53,10 @@ app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index caa2b63..bc8db00 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -1,14 +1,14 @@ -using Example.NetCore6._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; +using Example.NetCore6._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } +namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs index cf09a1c..b6b40ee 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs @@ -72,5 +72,4 @@ Task OnLogoutExecuted(LogoutModel data) Task OnRefreshExecuting(RefreshModel data) { return Task.CompletedTask; -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs index 1d9184c..b7f5597 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -25,9 +25,9 @@ app.UseRouting(); app.UseCookieLoginMiddleware(new CookieAuthOptions - { - Key = "ExampleCookieName", - } +{ + Key = "ExampleCookieName", +} ); app.UseJwtAuthentication(); diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs index a4cb7bc..57095c6 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs @@ -32,4 +32,4 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs index 04fe1a4..3b422ad 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -1,24 +1,24 @@ -using System.Security.Claims; +using System.Security.Claims; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore6._0.PermissionBasedAuthorization -{ - public class UserClaimsProvider : IUserClaimsProvider - { - public const string ExampleClaimType = "ExamplePermission"; - - public const string FirstExampleClaimName = "CanUseExampleFirst"; - - public const string SecondExampleClaimName = "CanUseExampleSecond"; - - public Task> GetUserClaimsAsync(string login) - { - return Task.FromResult(new List - { - new Claim(ExampleClaimType, FirstExampleClaimName), - new Claim(ExampleClaimType, SecondExampleClaimName), - } - ); - } - } +namespace Example.NetCore6._0.PermissionBasedAuthorization +{ + public class UserClaimsProvider : IUserClaimsProvider + { + public const string ExampleClaimType = "ExamplePermission"; + + public const string FirstExampleClaimName = "CanUseExampleFirst"; + + public const string SecondExampleClaimName = "CanUseExampleSecond"; + + public Task> GetUserClaimsAsync(string login) + { + return Task.FromResult(new List + { + new Claim(ExampleClaimType, FirstExampleClaimName), + new Claim(ExampleClaimType, SecondExampleClaimName), + } + ); + } + } } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs index ad2c348..9d9aa8a 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs @@ -45,4 +45,4 @@ Task OnLoginExecuted(LoginModel data) { Console.WriteLine(data.Login); return Task.FromResult(data); -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs index 4e4b6bc..1cedcfc 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -29,4 +29,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index d76678d..8cda405 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -3,11 +3,10 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Data; - public class AppDbContext : TourmalineDbContext +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) { - public AppDbContext(DbContextOptions options) - : base(options) - { - } } - +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index f6f7af1..c0b2150 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -5,4 +5,4 @@ namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index c014819..29aa34c 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -53,14 +53,14 @@ app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.Run(); -public partial class ProgramGeneric { } +public partial class ProgramGeneric { } \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs index 5e02f53..d7c4094 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -28,4 +28,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index c394805..df8d699 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -11,4 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index 56137c1..86a56cc 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -6,4 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs index 22e725b..6a1e549 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs @@ -34,4 +34,4 @@ .UseDefaultLoginMiddleware() .UseJwtAuthentication(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs index d199d33..1d63cee 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -28,4 +28,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs index 094939e..b9b6fc8 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -11,4 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs index 2b272fe..9725375 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -6,4 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs index 3a07b30..366e61e 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs @@ -72,6 +72,4 @@ Task OnLogoutExecuted(LogoutModel data) Task OnRefreshExecuting(RefreshModel data) { return Task.CompletedTask; -} - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index 913261f..604e071 100644 --- a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -29,4 +29,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs index 8130bbc..4b2aa9b 100644 --- a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -25,9 +25,9 @@ app.UseRouting(); app.UseCookieLoginMiddleware(new CookieAuthOptions - { - Key = "ExampleCookieName", - } +{ + Key = "ExampleCookieName", +} ); app.UseJwtAuthentication(); @@ -40,4 +40,4 @@ app.Run(); -public partial class ProgramCookies { } +public partial class ProgramCookies { } \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index 4be0e3d..9eb36b6 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -30,4 +30,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs index 22eb04f..2b16221 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs @@ -32,5 +32,4 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); -app.Run(); - +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs index ccf6ca1..d2a38a1 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -21,4 +21,4 @@ public Task> GetUserClaimsAsync(string login) ); } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs index f130c65..540fb7b 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -28,4 +28,4 @@ public IEnumerable Get() { return Summaries; } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index 4d8c9ab..aa557f6 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -10,4 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs index e20e92d..85ce19c 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -5,4 +5,4 @@ namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Model public class CustomUser : IdentityUser { public string Name { get; set; } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 75c88f2..faac91d 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -62,4 +62,4 @@ app.Run(); -public partial class Program { } +public partial class Program { } \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index 52fb932..fb912be 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -28,4 +28,4 @@ public IEnumerable Get() { return Summaries; } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index d14434c..b05dc62 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -10,4 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index b24a6ae..6f8ceb0 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -5,4 +5,4 @@ namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs index a24f266..5acf728 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -62,4 +62,4 @@ app.Run(); -public abstract class ProgramWithConfidenceInterval { } +public abstract class ProgramWithConfidenceInterval { } \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs index 5bbbe23..05d0829 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -28,4 +28,4 @@ public IEnumerable Get() return Summaries; } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs index d337d33..c4eecb0 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs @@ -45,5 +45,4 @@ Task OnLoginExecuted(LoginModel data) { Console.WriteLine(data.Login); return Task.FromResult(data); -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs index 74cf638..b150a03 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -12,4 +12,4 @@ public Task ValidateUserCredentials(string login, string password) return Task.FromResult(login == Login && password == Password); } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs index b9bd3e3..1e28251 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -29,5 +29,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index 060d08e..665a455 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -3,12 +3,10 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Data; - public class AppDbContext : TourmalineDbContext +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) { - public AppDbContext(DbContextOptions options) - : base(options) - { - } } - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index 6d235d6..b55a57a 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index 63e378a..bed4955 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -53,15 +53,14 @@ app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.Run(); -public partial class ProgramGeneric { } - +public partial class ProgramGeneric { } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs index 76fec6c..31ee2b6 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index fe1c0ef..5a4dcfb 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -11,5 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index 8472131..6049f1d 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -6,5 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs index 7c8fb8f..62ea201 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs @@ -34,5 +34,4 @@ .UseDefaultLoginMiddleware() .UseJwtAuthentication(); -app.Run(); - +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs index c7cdfbe..e854bdc 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs index 4dac0ae..4b6120d 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -11,5 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs index c57391b..f33ae30 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -6,5 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs index 7016b81..813a9be 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs @@ -72,7 +72,4 @@ Task OnLogoutExecuted(LogoutModel data) Task OnRefreshExecuting(RefreshModel data) { return Task.CompletedTask; -} - - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs index a4362c6..cecae13 100644 --- a/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs @@ -19,4 +19,4 @@ public IActionResult GetPublic() { return Ok("This endpoint is public"); } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs b/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs index 9d80d68..7dce155 100644 --- a/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs +++ b/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs @@ -24,4 +24,4 @@ .UseDefaultLoginMiddleware() .UseJwtAuthentication(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index dfd494b..2e3f85b 100644 --- a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -29,5 +29,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs index 84d9c9c..4b2aa9b 100644 --- a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -25,9 +25,9 @@ app.UseRouting(); app.UseCookieLoginMiddleware(new CookieAuthOptions - { - Key = "ExampleCookieName", - } +{ + Key = "ExampleCookieName", +} ); app.UseJwtAuthentication(); @@ -40,5 +40,4 @@ app.Run(); -public partial class ProgramCookies { } - +public partial class ProgramCookies { } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index b153aaf..e16f85f 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -30,5 +30,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs index e50737a..c831415 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs @@ -32,6 +32,4 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); -app.Run(); - - +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs index 26406ac..d836cab 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -21,5 +21,4 @@ public Task> GetUserClaimsAsync(string login) ); } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs index 3746767..4fe79d9 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() { return Summaries; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index e43349a..ddb6ddb 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -10,5 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs index 3a67613..df99abb 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Model public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 998fac5..aece4e0 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -62,5 +62,4 @@ app.Run(); -public partial class Program { } - +public partial class Program { } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index c648208..bce7f60 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() { return Summaries; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index 4b03b7a..5b2573c 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -10,5 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 6f8431b..8f1bde4 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs index 66c24f5..bd5e3b5 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -62,5 +62,4 @@ app.Run(); -public abstract class ProgramWithConfidenceInterval { } - +public abstract class ProgramWithConfidenceInterval { } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs index 9b1a105..65132d3 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs index 0618b07..637d4a0 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs @@ -45,6 +45,4 @@ Task OnLoginExecuted(LoginModel data) { Console.WriteLine(data.Login); return Task.FromResult(data); -} - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs index c2e6fd6..c9185f6 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -12,5 +12,4 @@ public Task ValidateUserCredentials(string login, string password) return Task.FromResult(login == Login && password == Password); } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs index de00ccd..d7ce172 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -29,5 +29,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index f6085a0..651f8c1 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -3,12 +3,10 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Data; - public class AppDbContext : TourmalineDbContext +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) { - public AppDbContext(DbContextOptions options) - : base(options) - { - } } - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index 33390b4..971a421 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index 11b8b68..b45d02a 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -53,15 +53,14 @@ app.UseRefreshTokenLogoutMiddleware(); app.UseRegistration(x => new CustomUser - { - UserName = x.Login, - NormalizedUserName = x.Login, - } +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} ); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); app.Run(); -public partial class ProgramGeneric { } - +public partial class ProgramGeneric { } \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs index fd471db..2021ce8 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index 5a276f2..e5baef9 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -11,5 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index 72e9bfe..e83cca8 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -6,5 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs index 6e65126..3f36af8 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs @@ -34,5 +34,4 @@ .UseDefaultLoginMiddleware() .UseJwtAuthentication(); -app.Run(); - +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs index 873ec1d..48578c9 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs index 00437d8..a05ae23 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -11,5 +11,4 @@ public AppDbContext(DbContextOptions options) { } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs index 1139aba..4d29fcd 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -6,5 +6,4 @@ public class CustomUser : IdentityUser { public string Name { get; set; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs index a91e5a8..941f16b 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs @@ -72,7 +72,4 @@ Task OnLogoutExecuted(LogoutModel data) Task OnRefreshExecuting(RefreshModel data) { return Task.CompletedTask; -} - - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs index f6c4404..efc3bb4 100644 --- a/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs @@ -19,4 +19,4 @@ public IActionResult GetPublic() { return Ok("This endpoint is public"); } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs b/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs index 9d80d68..7dce155 100644 --- a/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs +++ b/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs @@ -24,4 +24,4 @@ .UseDefaultLoginMiddleware() .UseJwtAuthentication(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index 6a062ae..b4bcc1a 100644 --- a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -29,5 +29,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs index 84d9c9c..4b2aa9b 100644 --- a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -25,9 +25,9 @@ app.UseRouting(); app.UseCookieLoginMiddleware(new CookieAuthOptions - { - Key = "ExampleCookieName", - } +{ + Key = "ExampleCookieName", +} ); app.UseJwtAuthentication(); @@ -40,5 +40,4 @@ app.Run(); -public partial class ProgramCookies { } - +public partial class ProgramCookies { } \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index 22ed80f..88ce7bf 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -30,5 +30,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs index f237f7c..bff1793 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs @@ -32,6 +32,4 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); -app.Run(); - - +app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs index d8254d2..0f5e2a5 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -21,5 +21,4 @@ public Task> GetUserClaimsAsync(string login) ); } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs index 925b926..8cbf1bf 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() { return Summaries; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index 48c9f8a..5fe0752 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -10,5 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs index 8d08135..7db116a 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Model public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index ff03a6e..00e3ddb 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -62,5 +62,4 @@ app.Run(); -public partial class Program { } - +public partial class Program { } \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index b1693d9..998e3f7 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() { return Summaries; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index 3731156..b8383dc 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -10,5 +10,4 @@ public AppDbContext(DbContextOptions options) : base(options) { } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 3b02567..47d928e 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -5,5 +5,4 @@ namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { public string Name { get; set; } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs index 8ec3a3f..9b4a737 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -62,5 +62,4 @@ app.Run(); -public abstract class ProgramWithConfidenceInterval { } - +public abstract class ProgramWithConfidenceInterval { } \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs index 335028f..1a5b995 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -28,5 +28,4 @@ public IEnumerable Get() return Summaries; } } -} - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs index 60d8c8a..eb75292 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs @@ -45,6 +45,4 @@ Task OnLoginExecuted(LoginModel data) { Console.WriteLine(data.Login); return Task.FromResult(data); -} - - +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs index 88fff39..28533da 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -12,5 +12,4 @@ public Task ValidateUserCredentials(string login, string password) return Task.FromResult(login == Login && password == Password); } } -} - +} \ No newline at end of file diff --git a/Examples/Tests/AuthResponseModelEqualityComparer.cs b/Examples/Tests/AuthResponseModelEqualityComparer.cs index eba98ef..394ddd4 100644 --- a/Examples/Tests/AuthResponseModelEqualityComparer.cs +++ b/Examples/Tests/AuthResponseModelEqualityComparer.cs @@ -1,4 +1,4 @@ -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; namespace Tests; diff --git a/Examples/Tests/AuthTestsBase.cs b/Examples/Tests/AuthTestsBase.cs index ccc3f8b..c5ea733 100644 --- a/Examples/Tests/AuthTestsBase.cs +++ b/Examples/Tests/AuthTestsBase.cs @@ -42,11 +42,11 @@ public AuthTestsBase(WebApplicationFactory factory) var client = _factory.CreateClient(); var body = JsonContent.Create(new LoginRequestModel - { - Login = login, - Password = password, - ClientFingerPrint = clientFingerPrint, - } + { + Login = login, + Password = password, + ClientFingerPrint = clientFingerPrint, + } ); var response = await client.PostAsync(LoginUrl, body); @@ -61,10 +61,10 @@ public AuthTestsBase(WebApplicationFactory factory) var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(authResponseModel.RefreshToken.Value), - ClientFingerPrint = fingerprint, - } + { + RefreshTokenValue = Guid.Parse(authResponseModel.RefreshToken.Value), + ClientFingerPrint = fingerprint, + } ); var response = await client.PostAsync(RefreshUrl, body); diff --git a/Examples/Tests/NetCore5.0/LoginCallbackTests.cs b/Examples/Tests/NetCore5.0/LoginCallbackTests.cs index c2c9d06..e6aae4f 100644 --- a/Examples/Tests/NetCore5.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore5.0/LoginCallbackTests.cs @@ -26,10 +26,10 @@ public LoginCallbackTests() _httpContext.Request.Path = new PathString("/login"); var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel - { - Login = "Admin", - Password = "Admin", - } + { + Login = "Admin", + Password = "Admin", + } ) ); @@ -46,10 +46,10 @@ public LoginCallbackTests() .Returns(Task.CompletedTask); _loginService = new LoginService(new TokenManager(new AuthenticationOptions - { - PrivateSigningKey = + { + PrivateSigningKey = "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", - }, + }, new DefaultUserClaimsProvider() ), new FakeUserCredentialValidator() diff --git a/Examples/Tests/NetCore5.0/LogoutTest.cs b/Examples/Tests/NetCore5.0/LogoutTest.cs index ae24b15..9e8f39d 100644 --- a/Examples/Tests/NetCore5.0/LogoutTest.cs +++ b/Examples/Tests/NetCore5.0/LogoutTest.cs @@ -29,9 +29,9 @@ public async Task LogoutWithValidToken_Return200() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); @@ -45,9 +45,9 @@ public async Task LogoutWithInvalidToken_Return400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.NewGuid(), - } + { + RefreshTokenValue = Guid.NewGuid(), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore5.0/RegistrationTests.cs b/Examples/Tests/NetCore5.0/RegistrationTests.cs index 7bbe1d4..d07fca2 100644 --- a/Examples/Tests/NetCore5.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore5.0/RegistrationTests.cs @@ -55,10 +55,10 @@ public async Task RegisterWithCredsOfExistingUser_Returns400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RegistrationRequestModel - { - Login = login, - Password = password, - } + { + Login = login, + Password = password, + } ); var response = await client.PostAsync(RegisterUrl, body); diff --git a/Examples/Tests/NetCore6.0/LoginCallbackTests.cs b/Examples/Tests/NetCore6.0/LoginCallbackTests.cs index 79d1fba..b95f917 100644 --- a/Examples/Tests/NetCore6.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore6.0/LoginCallbackTests.cs @@ -26,10 +26,10 @@ public LoginCallbackTests() _httpContext.Request.Path = new PathString("/login"); var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel - { - Login = "Admin", - Password = "Admin", - } + { + Login = "Admin", + Password = "Admin", + } ) ); @@ -46,10 +46,10 @@ public LoginCallbackTests() .Returns(Task.CompletedTask); _loginService = new LoginService(new TokenManager(new AuthenticationOptions - { - PrivateSigningKey = + { + PrivateSigningKey = "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", - }, + }, new DefaultUserClaimsProvider() ), new FakeUserCredentialValidator() diff --git a/Examples/Tests/NetCore6.0/LogoutTest.cs b/Examples/Tests/NetCore6.0/LogoutTest.cs index a619dc9..5c6f964 100644 --- a/Examples/Tests/NetCore6.0/LogoutTest.cs +++ b/Examples/Tests/NetCore6.0/LogoutTest.cs @@ -28,9 +28,9 @@ public async Task LogoutWithValidToken_Return200() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); @@ -44,9 +44,9 @@ public async Task LogoutWithInvalidToken_Return400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.NewGuid(), - } + { + RefreshTokenValue = Guid.NewGuid(), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore6.0/RefreshTests.cs b/Examples/Tests/NetCore6.0/RefreshTests.cs index 339f8e1..1857958 100644 --- a/Examples/Tests/NetCore6.0/RefreshTests.cs +++ b/Examples/Tests/NetCore6.0/RefreshTests.cs @@ -75,9 +75,9 @@ public async Task LogoutWithValidToken_DiscardsRefresh() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore6.0/RegistrationTests.cs b/Examples/Tests/NetCore6.0/RegistrationTests.cs index 8407d1a..17cf176 100644 --- a/Examples/Tests/NetCore6.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore6.0/RegistrationTests.cs @@ -54,10 +54,10 @@ public async Task RegisterWithCredsOfExistingUser_Returns400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RegistrationRequestModel - { - Login = login, - Password = password, - } + { + Login = login, + Password = password, + } ); var response = await client.PostAsync(RegisterUrl, body); diff --git a/Examples/Tests/NetCore7.0/LoginCallbackTests.cs b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs index 7b6ba6b..e77c87a 100644 --- a/Examples/Tests/NetCore7.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs @@ -26,10 +26,10 @@ public LoginCallbackTests() _httpContext.Request.Path = new PathString("/login"); var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel - { - Login = "Admin", - Password = "Admin", - } + { + Login = "Admin", + Password = "Admin", + } ) ); @@ -46,10 +46,10 @@ public LoginCallbackTests() .Returns(Task.CompletedTask); _loginService = new LoginService(new TokenManager(new AuthenticationOptions - { - PrivateSigningKey = + { + PrivateSigningKey = "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", - }, + }, new DefaultUserClaimsProvider() ), new FakeUserCredentialValidator() diff --git a/Examples/Tests/NetCore7.0/LogoutTest.cs b/Examples/Tests/NetCore7.0/LogoutTest.cs index 5e6ee5f..ac06565 100644 --- a/Examples/Tests/NetCore7.0/LogoutTest.cs +++ b/Examples/Tests/NetCore7.0/LogoutTest.cs @@ -27,9 +27,9 @@ public async Task LogoutWithValidToken_Return200() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); @@ -43,9 +43,9 @@ public async Task LogoutWithInvalidToken_Return400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.NewGuid(), - } + { + RefreshTokenValue = Guid.NewGuid(), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore7.0/RefreshTests.cs b/Examples/Tests/NetCore7.0/RefreshTests.cs index f44105f..d03f3d7 100644 --- a/Examples/Tests/NetCore7.0/RefreshTests.cs +++ b/Examples/Tests/NetCore7.0/RefreshTests.cs @@ -74,9 +74,9 @@ public async Task LogoutWithValidToken_DiscardsRefresh() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore7.0/RegistrationTests.cs b/Examples/Tests/NetCore7.0/RegistrationTests.cs index 000596b..74699df 100644 --- a/Examples/Tests/NetCore7.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore7.0/RegistrationTests.cs @@ -53,10 +53,10 @@ public async Task RegisterWithCredsOfExistingUser_Returns400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RegistrationRequestModel - { - Login = login, - Password = password, - } + { + Login = login, + Password = password, + } ); var response = await client.PostAsync(RegisterUrl, body); diff --git a/Examples/Tests/NetCore8.0/LoginCallbackTests.cs b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs index f274468..d6650ab 100644 --- a/Examples/Tests/NetCore8.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs @@ -26,10 +26,10 @@ public LoginCallbackTests() _httpContext.Request.Path = new PathString("/login"); var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel - { - Login = "Admin", - Password = "Admin", - } + { + Login = "Admin", + Password = "Admin", + } ) ); @@ -46,10 +46,10 @@ public LoginCallbackTests() .Returns(Task.CompletedTask); _loginService = new LoginService(new TokenManager(new AuthenticationOptions - { - PrivateSigningKey = + { + PrivateSigningKey = "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", - }, + }, new DefaultUserClaimsProvider() ), new FakeUserCredentialValidator() diff --git a/Examples/Tests/NetCore8.0/LogoutTest.cs b/Examples/Tests/NetCore8.0/LogoutTest.cs index 5d54f7f..a4cab54 100644 --- a/Examples/Tests/NetCore8.0/LogoutTest.cs +++ b/Examples/Tests/NetCore8.0/LogoutTest.cs @@ -27,9 +27,9 @@ public async Task LogoutWithValidToken_Return200() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); @@ -43,9 +43,9 @@ public async Task LogoutWithInvalidToken_Return400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.NewGuid(), - } + { + RefreshTokenValue = Guid.NewGuid(), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore8.0/RefreshTests.cs b/Examples/Tests/NetCore8.0/RefreshTests.cs index 2aac2b3..b2596c3 100644 --- a/Examples/Tests/NetCore8.0/RefreshTests.cs +++ b/Examples/Tests/NetCore8.0/RefreshTests.cs @@ -74,9 +74,9 @@ public async Task LogoutWithValidToken_DiscardsRefresh() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore8.0/RegistrationTests.cs b/Examples/Tests/NetCore8.0/RegistrationTests.cs index f94ac46..feabeab 100644 --- a/Examples/Tests/NetCore8.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore8.0/RegistrationTests.cs @@ -53,10 +53,10 @@ public async Task RegisterWithCredsOfExistingUser_Returns400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RegistrationRequestModel - { - Login = login, - Password = password, - } + { + Login = login, + Password = password, + } ); var response = await client.PostAsync(RegisterUrl, body); diff --git a/Examples/Tests/NetCore9.0/LoginCallbackTests.cs b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs index 3ae9541..904c313 100644 --- a/Examples/Tests/NetCore9.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs @@ -26,10 +26,10 @@ public LoginCallbackTests() _httpContext.Request.Path = new PathString("/login"); var requestData = Encoding.Default.GetBytes(JsonConvert.SerializeObject(new LoginRequestModel - { - Login = "Admin", - Password = "Admin", - } + { + Login = "Admin", + Password = "Admin", + } ) ); @@ -46,10 +46,10 @@ public LoginCallbackTests() .Returns(Task.CompletedTask); _loginService = new LoginService(new TokenManager(new AuthenticationOptions - { - PrivateSigningKey = + { + PrivateSigningKey = "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU", - }, + }, new DefaultUserClaimsProvider() ), new FakeUserCredentialValidator() diff --git a/Examples/Tests/NetCore9.0/LogoutTest.cs b/Examples/Tests/NetCore9.0/LogoutTest.cs index 9287be5..efef6a4 100644 --- a/Examples/Tests/NetCore9.0/LogoutTest.cs +++ b/Examples/Tests/NetCore9.0/LogoutTest.cs @@ -27,9 +27,9 @@ public async Task LogoutWithValidToken_Return200() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(loginResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); @@ -43,9 +43,9 @@ public async Task LogoutWithInvalidToken_Return400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.NewGuid(), - } + { + RefreshTokenValue = Guid.NewGuid(), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore9.0/RefreshTests.cs b/Examples/Tests/NetCore9.0/RefreshTests.cs index dbacc22..d8d7115 100644 --- a/Examples/Tests/NetCore9.0/RefreshTests.cs +++ b/Examples/Tests/NetCore9.0/RefreshTests.cs @@ -74,9 +74,9 @@ public async Task LogoutWithValidToken_DiscardsRefresh() var client = _factory.CreateClient(); var body = JsonContent.Create(new RefreshTokenRequestModel - { - RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), - } + { + RefreshTokenValue = Guid.Parse(refreshResult.authModel.RefreshToken.Value), + } ); var logoutResult = await client.PostAsync(LogoutUrl, body); diff --git a/Examples/Tests/NetCore9.0/RegistrationTests.cs b/Examples/Tests/NetCore9.0/RegistrationTests.cs index 36245e6..eacb312 100644 --- a/Examples/Tests/NetCore9.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore9.0/RegistrationTests.cs @@ -53,10 +53,10 @@ public async Task RegisterWithCredsOfExistingUser_Returns400() var client = _factory.CreateClient(); var body = JsonContent.Create(new RegistrationRequestModel - { - Login = login, - Password = password, - } + { + Login = login, + Password = password, + } ); var response = await client.PostAsync(RegisterUrl, body); diff --git a/JwtAuthentication.Core/Services/IRefreshTokenManager.cs b/JwtAuthentication.Core/Services/IRefreshTokenManager.cs index aa3fb78..d39912a 100644 --- a/JwtAuthentication.Core/Services/IRefreshTokenManager.cs +++ b/JwtAuthentication.Core/Services/IRefreshTokenManager.cs @@ -5,7 +5,7 @@ namespace TourmalineCore.AspNetCore.JwtAuthentication.Core.Services { internal interface IRefreshTokenManager - where TUser : class + where TUser : class where TKey : IEquatable { Task GenerateRefreshTokenAsync(object user, string clientFingerPrint); diff --git a/JwtAuthentication.Core/Services/Implementation/TokenManager.cs b/JwtAuthentication.Core/Services/Implementation/TokenManager.cs index 1dcaf31..294925b 100644 --- a/JwtAuthentication.Core/Services/Implementation/TokenManager.cs +++ b/JwtAuthentication.Core/Services/Implementation/TokenManager.cs @@ -42,10 +42,10 @@ public async Task GetAccessToken(string login) var tokenValue = new JwtSecurityTokenHandler().WriteToken(token); return await Task.FromResult(new TokenModel - { - Value = tokenValue, - ExpiresInUtc = expires.ToUniversalTime(), - } + { + Value = tokenValue, + ExpiresInUtc = expires.ToUniversalTime(), + } ); } } diff --git a/JwtAuthentication.Identity/ApplicationBuilderExtensions.cs b/JwtAuthentication.Identity/ApplicationBuilderExtensions.cs index f86b6ff..c0fa08d 100644 --- a/JwtAuthentication.Identity/ApplicationBuilderExtensions.cs +++ b/JwtAuthentication.Identity/ApplicationBuilderExtensions.cs @@ -31,7 +31,7 @@ public static IApplicationBuilder UseDefaultDbUser( this IApplicationBuilder applicationBuilder, string username, string password) - where TContext : TourmalineDbContext + where TContext : TourmalineDbContext where TUser : IdentityUser { using var serviceScope = applicationBuilder.ApplicationServices.CreateScope(); @@ -74,9 +74,9 @@ public static IApplicationBuilder UseDefaultDbUser( { using var serviceScope = applicationBuilder.ApplicationServices.CreateScope(); var context = serviceScope.ServiceProvider.GetRequiredService(); - + var user = Activator.CreateInstance(); - + user.UserName = username; user.NormalizedUserName = username.ToUpper(); user.EmailConfirmed = true; diff --git a/JwtAuthentication.Identity/Middleware/Logout/LogoutMiddleware.cs b/JwtAuthentication.Identity/Middleware/Logout/LogoutMiddleware.cs index fff1f89..c19b482 100644 --- a/JwtAuthentication.Identity/Middleware/Logout/LogoutMiddleware.cs +++ b/JwtAuthentication.Identity/Middleware/Logout/LogoutMiddleware.cs @@ -23,7 +23,7 @@ public LogoutMiddleware( RequestDelegate next, LogoutEndpointOptions endpointOptions, ILogger logger, - Func onLogoutExecuting, + Func onLogoutExecuting, Func onLogoutExecuted) : base(next) { diff --git a/JwtAuthentication.Identity/Options/RefreshOptions.cs b/JwtAuthentication.Identity/Options/RefreshOptions.cs index 7873cc2..fd16693 100644 --- a/JwtAuthentication.Identity/Options/RefreshOptions.cs +++ b/JwtAuthentication.Identity/Options/RefreshOptions.cs @@ -1,23 +1,23 @@ -using System; - -namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options -{ - public class RefreshOptions - { - private int _refreshConfidenceIntervalInMilliseconds; - - public int RefreshConfidenceIntervalInMilliseconds - { - get => _refreshConfidenceIntervalInMilliseconds; - set - { - if (value <= 0) - { - throw new ArgumentException("Refresh confidence interval cannot be zero or negative"); +using System; + +namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options +{ + public class RefreshOptions + { + private int _refreshConfidenceIntervalInMilliseconds; + + public int RefreshConfidenceIntervalInMilliseconds + { + get => _refreshConfidenceIntervalInMilliseconds; + set + { + if (value <= 0) + { + throw new ArgumentException("Refresh confidence interval cannot be zero or negative"); } - - _refreshConfidenceIntervalInMilliseconds = value; - } - } - } + + _refreshConfidenceIntervalInMilliseconds = value; + } + } + } } \ No newline at end of file diff --git a/JwtAuthentication.Identity/Services/IdentityLogoutService.cs b/JwtAuthentication.Identity/Services/IdentityLogoutService.cs index 675b117..061df65 100644 --- a/JwtAuthentication.Identity/Services/IdentityLogoutService.cs +++ b/JwtAuthentication.Identity/Services/IdentityLogoutService.cs @@ -14,8 +14,8 @@ public IdentityLogoutService(IRefreshTokenManager refreshTokenMan } } - internal class IdentityLogoutService : ILogoutService - where TUser : IdentityUser + internal class IdentityLogoutService : ILogoutService + where TUser : IdentityUser where TKey : IEquatable { private readonly IRefreshTokenManager _refreshTokenManager; diff --git a/JwtAuthentication.Identity/Services/IdentityRefreshLoginService.cs b/JwtAuthentication.Identity/Services/IdentityRefreshLoginService.cs index cccf917..9102a9a 100644 --- a/JwtAuthentication.Identity/Services/IdentityRefreshLoginService.cs +++ b/JwtAuthentication.Identity/Services/IdentityRefreshLoginService.cs @@ -14,14 +14,14 @@ namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Services internal class IdentityRefreshLoginService : IdentityRefreshLoginService where TUser : IdentityUser { public IdentityRefreshLoginService( - RefreshSignInManager signInManager, - IValidator refreshTokenValidator, + RefreshSignInManager signInManager, + IValidator refreshTokenValidator, IUserCredentialsValidator userCredentialsValidator, IRefreshTokenManager refreshTokenManager, RefreshOptions refreshOptions) : base( - signInManager, - refreshTokenValidator, + signInManager, + refreshTokenValidator, userCredentialsValidator, refreshTokenManager, refreshOptions) @@ -30,7 +30,7 @@ public IdentityRefreshLoginService( } internal class IdentityRefreshLoginService : ILoginService, IRefreshService - where TUser : IdentityUser + where TUser : IdentityUser where TKey : IEquatable { private readonly RefreshSignInManager _signInManager; @@ -43,7 +43,7 @@ public IdentityRefreshLoginService( RefreshSignInManager signInManager, IValidator refreshTokenValidator, IUserCredentialsValidator userCredentialsValidator, - IRefreshTokenManager refreshTokenManager, + IRefreshTokenManager refreshTokenManager, RefreshOptions refreshOptions) { _signInManager = signInManager; diff --git a/JwtAuthentication.Identity/Services/IdentityRegistrationService.cs b/JwtAuthentication.Identity/Services/IdentityRegistrationService.cs index 3c78fa8..e4006c6 100644 --- a/JwtAuthentication.Identity/Services/IdentityRegistrationService.cs +++ b/JwtAuthentication.Identity/Services/IdentityRegistrationService.cs @@ -46,10 +46,10 @@ public async Task RegisterAsync(TRegistrationRequestModel mod } return await _loginService.LoginAsync(new LoginRequestModel - { - Login = model.Login, - Password = model.Password, - } + { + Login = model.Login, + Password = model.Password, + } ); } } diff --git a/JwtAuthentication.Identity/Services/RefreshSignInManager.cs b/JwtAuthentication.Identity/Services/RefreshSignInManager.cs index afe57d5..01ee2b8 100644 --- a/JwtAuthentication.Identity/Services/RefreshSignInManager.cs +++ b/JwtAuthentication.Identity/Services/RefreshSignInManager.cs @@ -35,8 +35,8 @@ public RefreshSignInManager(UserManager userManager, } } - internal class RefreshSignInManager : SignInManager - where TUser : IdentityUser + internal class RefreshSignInManager : SignInManager + where TUser : IdentityUser where TKey : IEquatable { private readonly IRefreshTokenManager _refreshTokenManager; diff --git a/JwtAuthentication.Identity/Services/RefreshTokenManager.cs b/JwtAuthentication.Identity/Services/RefreshTokenManager.cs index 5077084..4a420a1 100644 --- a/JwtAuthentication.Identity/Services/RefreshTokenManager.cs +++ b/JwtAuthentication.Identity/Services/RefreshTokenManager.cs @@ -19,7 +19,7 @@ internal class RefreshTokenManager : RefreshTokenManager w public RefreshTokenManager( TourmalineDbContext dbContext, RefreshAuthenticationOptions options) - :base(dbContext, options) + : base(dbContext, options) { } } @@ -57,7 +57,7 @@ public async Task GetRefreshTokenUserAsync(Guid refreshTokenValue, string .AsQueryable() .AsNoTracking() .Include(x => x.User) - .FirstOrDefaultAsync(x => x.Value == refreshTokenValue + .FirstOrDefaultAsync(x => x.Value == refreshTokenValue && x.ExpiresIn > DateTime.UtcNow && (clientFingerPrint == null || x.ClientFingerPrint == clientFingerPrint)); diff --git a/JwtAuthentication.Identity/Signing/SigningHelper.cs b/JwtAuthentication.Identity/Signing/SigningHelper.cs index 3b3470f..330804b 100644 --- a/JwtAuthentication.Identity/Signing/SigningHelper.cs +++ b/JwtAuthentication.Identity/Signing/SigningHelper.cs @@ -1,29 +1,29 @@ -using System; -using System.Security.Cryptography; -using Microsoft.IdentityModel.Tokens; +using System; +using System.Security.Cryptography; +using Microsoft.IdentityModel.Tokens; -namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Signing -{ - public static class SigningHelper - { - public static RsaSecurityKey GetPublicKey(string key) - { - var publicKey = Convert.FromBase64String(key); - - var rsa = RSA.Create(); - rsa.ImportSubjectPublicKeyInfo(publicKey, out _); - - return new RsaSecurityKey(rsa); - } - - public static RsaSecurityKey GetPrivateKey(string key) - { - var privateKey = Convert.FromBase64String(key); - - var rsa = RSA.Create(); - rsa.ImportRSAPrivateKey(privateKey, out _); - - return new RsaSecurityKey(rsa); - } - } +namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Signing +{ + public static class SigningHelper + { + public static RsaSecurityKey GetPublicKey(string key) + { + var publicKey = Convert.FromBase64String(key); + + var rsa = RSA.Create(); + rsa.ImportSubjectPublicKeyInfo(publicKey, out _); + + return new RsaSecurityKey(rsa); + } + + public static RsaSecurityKey GetPrivateKey(string key) + { + var privateKey = Convert.FromBase64String(key); + + var rsa = RSA.Create(); + rsa.ImportRSAPrivateKey(privateKey, out _); + + return new RsaSecurityKey(rsa); + } + } } \ No newline at end of file diff --git a/JwtAuthentication.Identity/Validators/IdentityUserCredentialsValidator.cs b/JwtAuthentication.Identity/Validators/IdentityUserCredentialsValidator.cs index 82dc4ea..192e3a0 100644 --- a/JwtAuthentication.Identity/Validators/IdentityUserCredentialsValidator.cs +++ b/JwtAuthentication.Identity/Validators/IdentityUserCredentialsValidator.cs @@ -1,46 +1,46 @@ -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Identity; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; - -namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Validators -{ - internal class IdentityUserCredentialsValidator : IdentityUserCredentialsValidator - where TUser : IdentityUser - { - public IdentityUserCredentialsValidator(SignInManager signInManager) - : base(signInManager) - { - } +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace TourmalineCore.AspNetCore.JwtAuthentication.Identity.Validators +{ + internal class IdentityUserCredentialsValidator : IdentityUserCredentialsValidator + where TUser : IdentityUser + { + public IdentityUserCredentialsValidator(SignInManager signInManager) + : base(signInManager) + { + } + } + + internal class IdentityUserCredentialsValidator : IUserCredentialsValidator + where TUser : IdentityUser + where TKey : IEquatable + { + private readonly SignInManager _signInManager; + + public IdentityUserCredentialsValidator(SignInManager signInManager) + { + _signInManager = signInManager; + } + + public async Task ValidateUserCredentials(string login, string password) + { + var user = await _signInManager.UserManager.FindByNameAsync(login); + + if (user == null) + { + return false; + } + + var signInResult = await _signInManager.PasswordSignInAsync(user, + password, + false, + true + ); + + return signInResult.Succeeded; + } } - - internal class IdentityUserCredentialsValidator : IUserCredentialsValidator - where TUser : IdentityUser - where TKey : IEquatable - { - private readonly SignInManager _signInManager; - - public IdentityUserCredentialsValidator(SignInManager signInManager) - { - _signInManager = signInManager; - } - - public async Task ValidateUserCredentials(string login, string password) - { - var user = await _signInManager.UserManager.FindByNameAsync(login); - - if (user == null) - { - return false; - } - - var signInResult = await _signInManager.PasswordSignInAsync(user, - password, - false, - true - ); - - return signInResult.Succeeded; - } - } } \ No newline at end of file From 034a76f83f561a1a8b45484a3d39edf57e35f8c4 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 13:48:07 +0500 Subject: [PATCH 26/49] chore: bump version of Identity to 0.1.2 and Core to 0.3.5 --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 9857345..19aecfb 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core - 0.3.4 + 0.3.5 Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev Tourmaline Core JwtAuthentication diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index 4a46af7..a793e80 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity - 0.1.1 + 0.1.2 Koval Maxim, Nikita Medvedev Tourmaline Core JwtAuthentication From fbd580234f96b85939539249df9dd54aaf146cc0 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Wed, 25 Jun 2025 15:06:44 +0500 Subject: [PATCH 27/49] chore(csproj): update first and last name order --- .../JwtAuthentication.Core.csproj | 14 +++++++------- .../JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 19aecfb..9896138 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core 0.3.5 - Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev Tourmaline Core JwtAuthentication @@ -25,32 +25,32 @@ - + - + - + - + - + - + diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index a793e80..ebee839 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity 0.1.2 - Koval Maxim, Nikita Medvedev + Maxim Koval, Nikita Medvedev Tourmaline Core JwtAuthentication From a99c2788b98f888e6948d185a19c4cce2e599381 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:08:12 +0500 Subject: [PATCH 28/49] chore(Assets): #67: move logo from solution to project --- .../Assets}/logo.png | Bin JwtAuthentication.Identity/Assets/logo.png | Bin 0 -> 249532 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename {Assets => JwtAuthentication.Core/Assets}/logo.png (100%) create mode 100644 JwtAuthentication.Identity/Assets/logo.png diff --git a/Assets/logo.png b/JwtAuthentication.Core/Assets/logo.png similarity index 100% rename from Assets/logo.png rename to JwtAuthentication.Core/Assets/logo.png diff --git a/JwtAuthentication.Identity/Assets/logo.png b/JwtAuthentication.Identity/Assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7 GIT binary patch literal 249532 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%0A5ROakV*}qlU(Z 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 z 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 literal 0 HcmV?d00001 From e7bcac414a7db6fdc6c3fe0517d94f688328ff04 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:10:47 +0500 Subject: [PATCH 29/49] chore(Assets): #67: add links to logo in csproj files --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 4 ++++ JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index f02336f..4e2c054 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -49,4 +49,8 @@ + + + + diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index 7aa760b..a3eab6b 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -35,4 +35,8 @@ + + + + From 01c595c0ff04284bbfafc9e37267df79ceeb149f Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 6 Jun 2025 17:11:13 +0500 Subject: [PATCH 30/49] chore: add .idea folder to gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 57b82a5..c9840a1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ **/.vs/* **.user **/lib/* +**/.idea/* -*Backup.* \ No newline at end of file +*Backup.* From 28fe434071d8530b34629ff85b92b1ec5ebc8ea7 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Mon, 9 Jun 2025 11:20:55 +0500 Subject: [PATCH 31/49] =?UTF-8?q?chore(Assets):=20#67:=20update=20logo=20f?= =?UTF-8?q?ile=20to=20128=C3=97128=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JwtAuthentication.Core/Assets/logo.png | Bin 249532 -> 19815 bytes JwtAuthentication.Identity/Assets/logo.png | Bin 249532 -> 19815 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/JwtAuthentication.Core/Assets/logo.png b/JwtAuthentication.Core/Assets/logo.png index 2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7..02816870c0ca1b9e1bc9f313880bc96910280be7 100644 GIT binary patch literal 19815 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�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 SC5oN^0000bNn=KgovXEY*+KP z#Q(+J0RD{sz19C&i~xIo{{t%j&)xrEl;`{B0D*@8+u#BGz5tJ&0Q`Ld{+a-3Z~%05 z{|G<-0EvwMve5vKl>n5d|4xej01E%A$^gd2|2mHV zov8mnbpV8v0sOQ7%+Ud~r2w|E0jjh8@#_H5%mB5$0KcsOo16mvr~l080C0Z*yT<=6 zf&f-j0A6GNj;{YhocrwC|372_;^Y5up#Qz-|CqP{Oh*5vzW)hT{~SpFF>wOz<^jdf z{@>64Q<(tKz5h|E0L-ocY+?U^sQyrJ0o&RCE@I>P+y5O~0KcFAui^bMRMP$4{~T=q zsHOm_y#HIa|8bE3d5*Ha%m0_k)%?!>XM_NljsU8f|7XAe%$)!~IKZ&O+3DqYeyL94 z-~Xf8|7EJV{?`G~+5No4|A4{mB}sz*#{GetrMSWX*`)t*wVP0rn*PqE%g;34+W?M& zr6y=%qvo zKZC^m#%KS*1^v{N#>W7AX2k2|wXC|G+}i=`fk{J#H|+Ccxv=jgZi(x_JbtD5iXnfAEgcb@0p+0%)xig2j_ri;H5SuXyh zdC+W2Z;rG8gP`Y2Y~9hQRQ;?=Co~D7hxO`=p!zymY+k7jmuynX_%k=<_h1OUMN zbGP=)ix)5qfd63E;c)0q4__b{0RIvWT!*J0KTf6OoV(YbAs7JvFe^M9K7KqNTPn=l zH7_s=1K=O9)6n%{YTM(>m&ZhfC{aGWc<}@P@Rt)V$qL(Pn%d*>C8H6HQkt6wOu_*8 z+oVvk!eh(9>%y->#3|x)2nN6(%H>m^nQv)IDDmoX+C({beLu{U%JA?RAq;?DWG8D}?h)hHZ~U6oudYy{ z(w`3S3xHpf>qC|4rHU0C9hrXRJPcho=8_mHpO7K~@blELhOU>);#ZP?!i8T(VMzY_ zfDi`2PovkfU|dEi5h54>-?sA33{9d?NM?RbRj^v&u-5tF z(U{l&qzt}Evz4%bS7Qx1h6cK=n=+$*Y&Uv0DSIN%d zSD;@cFKVb_wS}Wn##j9TWkdjK@ansP{qpdo_$3M&?ImoM`NdZ%GF~l%F;B7541h(i zz7xM@qL^u2`lX~t{31Iip;gQ;0TB!UX*m4U)#x=n=2yGL)FQ3SJDyfvB#BQU7`S&h zcs0GqC3eLOi+QBLv9hZ$v!sT`GHSO^36%WnUyX_mQ{7^0Gd zUf*`kdy$Y>N0Cg=$z)m^=}jKvh!hdrD>C;w_u*Id>ieaQG+F%e;-P*bKRgE2F9-(i zmEGZ4b3Th+E5G>jeZ5#Dy%=tq6MhMG4mKi11a}CpDxX-d^Qtz#t!!)!6K`C!)?!$3 z$vnA?pIV(Bn+AZpgA0cbjf5}8{Yq=U>=KVG>p;vB$GoOdTck)ym%m@C94OO+`(uB2 zIGvd;;@8Tq@1==pQoVRkA?-ih2-Z3h!LTa_xGT7DcseyrZ^aE={fY^gvG!z2i!MG) z3nf>R`rOhpAFFLr1Ve+_a(a8Gdb zdJwyMn|jS8hHd-`%?z_i2YRlAUr8m6ZmDn)5e(c7drc12t|2p{oQnIk?cNA3o5(pui|}R9ix~B*l)~3kk_@V+_RGj6F$V*;&Th|oJv6@R zmB+CgwSG7+dL83j4O^5*~5>>zC zmwe3NY9 zPlSQnWT(5Zc};%E1Cs?y^J0NHtrEkD52dzk)Q#u!MzFY9&BDG}MSF@W2e?Ic`%kLZ z;K|_{Vy3lTk2G(1YA7->V;+mc<6H-!SNL@q!m#%!xIK8AsB-diY9{+jR`u zg{jWKiUqFxSc;f+n{3r+Q-(Bmu@DAskKIo7YMMs;lF3)LJaHWO6U)nMA69}TZ$EUu za@j)s5x<<{df(0G36GqK9N=#|2+&E$)raEeEIANBd?? zi(XBC=A&1!oLo^?q6*J^tJkCtR#K(Rd=%e-J_J+Y^iTaZBV1 zzbtO$9L4!~cru9a72AqhV9NSPiynpXXDr<;Qq`(o+l{FtM?|j_xCOW_|BkIX^U?Dm z44pr#Zh)QCB03Q zJyB;hOZ{pt{33g9SxA!@l(tc;8b-#HC@8f^pT#db>^qx#W%sMtUtT&oJc6ND3S2wV z(0h{TrS*-oN3TKsVu}~$?Rn(wq$?iuGUmmy=#eVf-I6iG=RnIH!D_*|mG@ktj0mn5 z*~g}7&f=F~(aVb)QJGKbiwdVCg5`&ko~>5zoA-ua-qK-yMGsXfBp=HUkELC3)p)UTqnC1?@uSyOZ__Q%u7Z*xM)9I9$lV1SOqEGO=+D`GG@E-OiCE$Sz=~< z&8y;DBPw!fqrcHb6Tyfe7`P^6o2V1}b@I(@y59X-p8w+WIIvrcq=!?xL1$XaMxs=i zXGw^E|$6?XB&=#3SDyJF4_vPR!d~1I)&45-I`iDdu3{T9Eg?8nzEM(<_!1j0deeJ^{-xyMs~++9Eycxc1`*p=;Z)cf(I{8 z4@Ilq4eLxRJ)BwJ{3U`pshT!TQxrLpCxk)0XJ@P+Zwp^6*(-*PT2scwFFm!fx+V%{ ztb~ECHIU8mOWZ6f{i+GbQI0> z;g_KyuHXd_;2PNNKXcrAP}r|GP55O?U!ELB{1US!L+o0`uViPpfhbbERxn*ut7xXz z0QQx=^J%T62%@-u7j6_3FB)(c!f@fi7{Y*SVc>-j9=Yko5Qu~U889HOeGpfEC%=lH z#;S8pP2JA*zecm@Gxv7)%pKoT@JCfwS6ABukj9x<;$>nhC13O0&M<0v=Ca7frDJtM z!G002lqyEq<*F<9))lg^wTujrBn9mgFKw^n@^Yd5>dr>+Wy(od@Rd4_0e`kXs+q8+ zXDxFMjVcE${X+;?t$YEjLOEa8HCvQ2Hj<^}i;AE}k(kBbX(K& z)_dgcdG$i^0t~!x;(eJyt?O17gu6pnNOXthJzs46d0xtnZ!YaO0Y5tmgfgkmAX3ekW zYYx6f@--S?z{|%{&DZkleC@)%wc3bH&sFcge|dRgx;MZeP}MVaKG&Dm6ncDRz=)T? zQQ#1C)nwT-h3)wZ(h370`h{3wwu`FxB3)IQROWE3rGHx(vFSO=BO4^kGJ7!qSJLEo zfia43(UPrv>BN+sx5$>4XNcD4X&F!4r5*!j9olme=8{3%PvO{4L&Tp!wWH9Ro}=va zA<<=U;X0y&Sn;JiL>;~iz_i9(hYp>sYvmqlZ;D$vie<77`4UZRg_n?1<9MyhU%$#1 z{{nPXr5?uS%H#_w5OX*(JTJlmFcy%)Yf##+=oistzF}uW`(m6L zDH*WkF=4_KzjF9y1FY%!$dWc}>IJkAJtSRXD(#mmiqCuRuAx$VUAZ-jfRQh4qU2WR ztdqF@vY5oz`8m>i#TFi7kPAkaK5l{fre`Een7`NLOWGWvS`@{h087i| z%^k!7h>uRy178sLs*o=yt6p7(3R!Z#I^xxz8(4u?sR)~w;41*5i|Aiy*LF2GJtMvU zfgvTn&~Wb6qXAr#U9RA3Jr*{?^UUF>Pfkhu#p*UIUugMok-!(R5?)i>MhNjt>4+dK z`AQR(v#!8MPjQX8+yO9|FSB0tasO;(#+)-{bHuDGPI*X$ zhj>0sQ*VRmW;(adnlXNqHOp1z2-FKO`>>z@|C;Nz>9XnnmpO-*mx>!gT3QZioB{g5 zM7~&revTcMD_-?+lNqRYp;E`JN^Auk=n`K>)O6FEshW%|lQsHHiaKt|*B;K`t3<{6 zmhap2zsvA4(`8Vtc*!|514i*yvBbK9Zxp;%0>`iM#bVgk$rmwjvKXx3p|D1fAewG& zFh-1{Lywet6JCiRM@SpaqTnd_Qqp5PNw(?#lj=lWo(QWwyu8%Bf9%>&ntb(-HmN|W zz@Y#~D1#V*6$dgi08D(1kOGG0A1Zd(qlb?uX?2WetfUg{9Shh;-hL}T+VsCkf%%+u zsWSy#n1As>u6%V+@MYhbfZ6q!ub6o;D9`jLu7+V6#nr45bg_rL>j|2BjFU(1djU2^ z(Y6#lM3zHzX`i$^qC+!bP5+DJ975ts&S97@Tn3n89BcK%IHSll5HOzpY7kX?39l&d z>n(UNzB-hQaun9|r&7RKXU<>`yr$ls_vSD^IxYl4|H&{7&Md_OUZoEfGLs~^RVMMo+}a4!Fn9>9vK_`nRYB^YLp8d;JQHs z5s^d=3^Km8NHt(FTp+|J;f>Cv5!UqIOO-i=_9sTSkr$i)nT(w z5T-l#1f41HwXso#>o=3X8?~}&z!c-S_UpRli-m8Z7#lf@iIJh=lP~h(v#j$Q0Oa8e zTUG8!)j4F3GFT5R`1QBf+A%jQDUun6FEIm~^hd*;5{Y%Wy9{`ranYb-o|5o!6o1R|j91<=`1pS1fq-@(gLg zyvLoYXP1ID`8t$aP327u-CHePs_E$^=kPmBw^Hf&1z;vaiO~((FW3GFV7LSt6d^?M zr72j}+=vuJZ_CIK$LQ4L>X!k9q~22e1_F1vV+Fr1B~NY66O3}a9x|aP3kYj*#HJ^f zmc73Fj#f)z(uN{~+u&;pE2dOm;>Dj7JPcjHLv+tCLmbK1ZkGXi@I}m)()VZJ3$CEt zK-alSwc%b-L-ED8z@_Zh0x2@DPtBKo5bP-CBeqC=(^E^%;n96FZ)1#5arDJLqmfe4tRV_yUc zJDeBhelG^kE~c>4~IeW!L>l!X$n?hF8ASm2rA~+g8Gwo<>?$RuML9!*Xr+ zR+Z8FWB=f}3$Jn9NkVI|D+rsvUe8n6^A91g1=*PCP2=cJn{qWQf#c>I=Sx$s$z>4` z5R`#=+AyjVGLwM$AIY;I(tZVQGmU0{^75TVSQGUm&Y>n=K1!?A0kAG$S{+7ocnv}b zq)))`0bP{%`Xsc^7wPhbPMnDa=O?UgkuTz-3}1UbI$ryH^*r8k2)-)3oG+935@0)N zAzwdyd-Y)>tmz4)!zsy^mXsN>fCV#fykioF&=X&^@e0037&QlAhkVV+*N%L-&=u!J ze3?885zEc~?BwKTN~2{O2l3^AbporP8wHrO%r#%3x%ATy-<~!L)&%{_&f!ny7FK6C z>~E)ZyM&?cNnY|r!zB$#*ahvE@l^yE_>#aExsoC`7gZ5qiMrmPVXnrxF=oJkFE?Qh z(;A`gj4GZEwgx!>6J;cY4U-;~GUc!R>)YE`SBsA@~4OUqp_U_c3%DPkKH zUqh(4RAm%=0kDd%IGsrOQFqH70CN?{yuluEd0DDre4&n%X@tZVO&R#o8AkReBwr}C zO;vnBSw*|+y33ahu%>?pKjYx;K}d9hH=|vM=3SR8sH_qARiqc zt}rwI(6k^B!fpK8VrhRe^PuwZN<8S#d&V*ZRw;U6T?HeeX}|F1Az#vhwv@Zg?N##; zo1lO3bT3#h09MxoILasom027ymiyzT&FyAxi4BMGDV0$vk#qrgTPT=usZQ_hz?gMia860p=E zU!g<3vO36d>A(H{#p%O`ZBJO!zml|pGKaEVkE(8@z49I`b%`2A3fXJzi)gVGVd&DB z-R+Do?f_eNsjNm010^`2E`8_Lt7oA@=Vx%f2BU16Uft(mI z@dcri0Yj8=K^(sfZi)ug0A5Cv-$rIHPXIG{Oc64^AP21PRG^LWFkrp({tUp3F8@c3 zq~g=Cu}78^Dgp>D(d9;s>Ge8uk2Xshc}sH^7LAmx_G_`L7F^cdGBm)N{vGR;M-QbG zH}nw^16_bA4cLG#vwvmNR=^mczfh&NIzuY)3cyS-Sa%>2VfmB3cq-!1MHZs{6?=4% zs554DjGYligrw2cA)O=nf>69PPXtRXx%qN9dU^Hg)jJ=4_(oIH-_MsvJRZV;tr#O; zk+`Ac_-*AN?oY;4olU~X;4;Euas|9hk5Z)kg59!z1eA@AWY?d(KA{EEBurpgiw?%A zu0IMDO~4EyY_zmd5T>Y&V?bF-8Q9sPwU2Ni3uwK`6_K2^} zuCpNu+$?_iXR$j|6+$e*mo$?sNd~M;mzFE_(87pKe?Or&^P$)aEGhZYW=eyJ7nl-O zTR4Ia8h#k4oPa5;VU+pw>T5ujdzj+{OL&IPB;CWoS~pr%vFD`#+_9`4i@1{*fSQPDLVw9GU z70y`GHLP8E;=_TG^&($(?Wy7`ibnx32>VM+2qMm~VD?9=zNk&YP&2^SoO^J^;D+~c zkV^WBRanCmJ^8{5xLGQ|q`4SiA3r>_9V<KR{>qVfLtWipBWt834l36=ctq|t~zkWj>AazU6bfZoE*d~%2D0? z8erY+s}~Os@3dTwroWsMg#3>$<`TR2q)T2m)43qRLEIQ%m`Q%QcU}W@{0TU^|2Fe zkFo2`<>}Q`i*hvmRlGj<2?v+o$K*>DMMamSHx> zr4++C@Jj909FD>MbdpgZxQUTPAJCu%hmGx3zGkeT<>_EOSsTZkg0Xf$Y9U`mc;&9n z01V6E^I+NZHVJ!Zf%>Mul5%*dq^OE7+)P5pdR5v$x7~^;!wAGxe9?RnEw z!x_pH-#r6{JjFYoYr)4G>?)AY#xS+3`EuLkgo!T`w|+T^=dx<55|Fv`2Yjst4DA75 z*LO#+P9ID^Hw)JE*PO%P3%R`+;*ey;aso!cwsyrs#qBv%`bHU6g_DQ|nT42+DFab_ zWdW&WbPDIW44gO>BDR#`^D!Hy1uCq%!NCXzlF!|q(b7H2i~?iQ*&%CE4H(lS=gU_g zJv>}B!kYg4vKRJx0WMK?7@Xf5x?OU-{IjwbDT$^oBl30s74Rx~+(YoS7NK8fU-aT= zz=Q^@5)yVh^46=8jqqUWi)O0@6JI7z_f5Vsc3ATjBigSbzScAjB-9T_r!O8X-M3A` zn*JnSj?}$>=n>xg2%5}(P5bt1P3a|AXrYMC`;cZUR>ah=#*6Wd3wVd(YeoirmS`hO zW~Byz!qSGcV8!w3W8bo}haHS}CXl1N&Z{HyeiDzVotj7ex^%IadIvR?%3leyep z*?urX?CrMJ-1H|x8{ruet2(ha#kJ-2D0AUPt*7jXFBfjR^c11O8CdS^0$@4+($tH2 z@qT>yVB>!3!4oG{aQc7`>u~U>FCPB@!Uj^AF+{FE=aLsq6eXw}GJZ|*UM`18+CbC2 zJpJ?wH(||!HT`kY#(kA?D7s{?k}f%j5iV5p5RKsz%1xCf4C^h-Ddo>!WRaT;ZD0Wz z_5`u_iE}#;XIv?A*dcI{Cw=j4?fg>l4G3>UINq@Fo2V_yU&G53XA=K;$BV`cMFe1J zOMm+1XP-W_Fk;gm16JXLA)G2@z&F7jn!{4mYew)?8v+O;aj0adBPhlbY zE&~h}i`GOty!xJZaQE!S3==A2gAXZcik8I7o>i56y{y{}K!fy?-ieopTiQA2j)u$u zJH9^p_Tx{@hP8CWra#<|auPU&@|JP=q)T|A#~s+)ZWAfksjYT?h0%&-VjGv5FEn4% zKNMfH0E<15Fh(6*JWxfx&V9sF^)v@FfiHyUK}(Q=#sT5&%{SlN@R@(104gDr_I=6% zz!>DXJNdx@YZk2O_cv1_Fdt`@n-VrzvvdwsVqRovof)reT}m|sNHGPgwpA)zUuR0W ze>f|?@#t7R{(sH7YW;M=4az6Zmci9yYUWipCenr403-%2d_diDv_$5{H{ZOrHv^_r z7RM1=(xM#vh$W)z&2@Ks^>K3%n|{Z5`P|EtF?o(Raj3(=JWO*h^xMFTi(rnIGUqvp z4Bx0epRS^gi*njHcJ%tfvzQvqtN+*4`MIf@n8&zj0%ym5+U47hK#HQcbP3fy%a1d=kz64m%1?>kkbXE$}Hj=M3Y)C&a z)$@*6kukC*69#?F9bnv>0xc}eR+x0bZJXfhM>ANc&(VM)Mf!ahH~yM6J|#}6%v*z{Yg%10EqQXhMjGkigqw!IugYKt%5 zV6K$14dom9+xw~XvRoJvHjH4uGJwe1)REe|Fb@L>zN7t-(~a3L#x^1s-dX}<=F25G zFaT=l^Z6_5qwEjt*Ew6EcqRZ#TCg=#f4oe$ryqaZ%5pUQDqd7(9C}xuVZM>Jj#ixQ zu#G+rhy`C^wKxm2o`ZUUIq-tJD85R~SEkOd$K^RtSofN6CM@cUGJZdddO2AU0 zY|H@2VLU@)(G?}As=~h*N1eC?>~6Sxb@igTh)svip{7?-j1w&B#bk4|=eN{P1>IvC4&;Al_ zv7NbMER7d?At$t?J6H0B2^fNn-10^H#r^&O48o2u*hu(?MzQqek5tz; zEf=~}eOi$UW{WR{55ZU0F(J2bFWeO-VRzIj?g#P-vD!frRe~TCg0PCk-r#R3(1j*p5c!J>#k3Cn$FNl+uXMm-T z2Lt9k0HZ|O3Kwt0mv^}9f;8@=7GTiz+`nv5#HNFD%Uv99@;13j$xECtN=30YkkgB= zC^+hUEG%!8*FnI_McA(}VDkZAU~??cNWP}YK)NAbeeZ1^P^3f8gD)H7GX+Kn&&Mn( zoyX83OBN6Jz>*ZIqzZS2kuML`&zAAqELc+=In105N_?dbox_PmI3NW(=puR>slHoS zGcr|$IJWp*Gca|UfDx}OY~v}1h!HYpSEp9S?5jtMpg9O5F_RG`$57@AXP}EOal=+2 zLQ219@;n9!WBP@oRMs>32-qjxWed|cg>zWpRS{N~>XmXVtkla$!9(0~N(R27UbY0{ zk}smA=@ zAdXoy0c8kCAOj+}GmCMPH;{P?_r9I?o^x)W)I?qC{OOZSRduH``iZ~q-nw<`7M#OH z>m8P6?Z9}kYt2{Mrvy!u#ijPD03t^+5;VAvSFw$h4n+yTZVea?P3d}VLqXoWUYKT; z`V4riRa6Q|8}V_zxYRr(T}Q4ddq$;JgaI8%md%}W7-J+Q&M>K(x0MNtIO6P!Pd@v0 z0_=^8C9uI3Rd!3&L}jh6`LcQ=mg;~R>B>GyV?ds5FWRyj@nY@5M~Y*qgovKk+5{L?j*tU%fv*jN6(Q4_|!o z#RS;f7WShcsrTNT5ifBSJn^MaVo=vuuWVKBkU1O}6R;)t>Oqzy(`EZrl<`vaqi!$F z*8za7SAFQFPH;&3RTX=M*Ge%x#Xz)K1!+*x4v84-7w}+q6uMexj^2x9<_q{qEnlKh zY!+VtEV2>1%{LQZZ(G<+>2u5DMO8&MBIY*L^p0y_PE%9YSPsyFzkrz92*xxlF9q>%_X_JbSKn2^4Q0V~?>S`3^Y} zO)#!+t<4wL!B*#=ew~6GZ&!gAE!X{K!D_vE(Hx^knI{jN_B%R-&h4EOu$0fMY(_C# zW3S@A%`9yH9sNTQ#?1My2Uajwf-K`5{E07h>;I~uZT;>4RAL4$3W@T-8K@GRG| zZq|x5@*fK@psk_-oP(_w4?j(Sy;XVcb+2tHxG-Mk%j?VKA0}Hvynz=1s~s!+B8KrY zRy6=!)DKl*ssmgVMa=NVEeQi)V4^uK={37fZZ`beJR;n-ZC-;ZpbpC#_U~f?GW7#W7g5j#AuhxPMyf$BRhccq; z$(dBgfJyKUwE`Az7idEZi-ixO;oY%F07LZQ8F~tK*ov<&8K#%xSFU1@^h4tXp705- zaRVcnq@9hJC~EogMzG>baKUmZn@abAm&1-#R_aqJ2s?Bizn=hmYf_P3*{kTG`}sWy zqxo9sr{$~i=A*-iIfsP~Pbyj}G9MtBFF#b}ed9H1HO3FI1SY;%o(O978&9n5?Iq(OY?Sq#uRb&*H&0WQ=yxV;U)CKvII z>D|Xc2{@84l5`)CK~FY)c_XteSI;!wz^acQs9S1RSTDZH$N^N13q9Dgst|w>J**e) zSNw23mC+2^EFweyuS4yqRYVL&rw{dSP?Ccb068MS1?K_4@cf}5#eB7Z3B=vyeoa5i z*QLoLUz&oc263Dt_UB~5-jp)sa0c(sbisW6JXh(cAzlKD?UGh2Uj__Ru~M&exvVVm zvJ+li*{_grwdmcL-cWWVGf-fe>(CT`r|hgqS9X?zG zvc`VF7F{KB*i32uMQIY})T;cX05f4wWGR0+xrlE_?~rmhv{}6p`0`lNxhTwgVkH}1 zLCfN+6F5s|_|kfDwk46UCBq*|K@?y4R()*5=*8DXes74ID@!=W9NZ;eYaFY`h#@9x zN?xk8c>^O=r8fJAkUlBEiZ4GfLMVD+4X*+7A)J$o_@)HsP%Kqcz6}-@T?|vy!Ff=0 z_6&6b(b7{Ze1s9ifrj3^j779%#^;ydtPC(yS`x{E+{QW`_!&i6H=s!o4G3gG!06 zI~p$*!|q|f_#G9^Mi@_-zCft=qBD?jnHt@0Dojc1QjvvDy`QF!+N>6^EXR0OGcDL^ z0_;sFox`7JV#^taPS+r6B8+AW9jaXCumB@d2xLT;m!*!nAsr9C!KC;i;@9ib?|HOSw{A@gkgbq*n#)#TTC_OeC*I8#5cb;w!oq zu*2Smp$A_H*yJI;0loY9=b!Hp!=V0U_vDfYa8XOa^kow{#Akvjq*VHmDIB{TO042psK3m|J zE={dsWZ9Ap16%Ailg2I02NDL*wi95lU*R0i@9&A0ZI=MEY`)?}!vz*}#YHe_2F7sD z?1?x&NajFK4#`mfhLctl;UHf^jKPlmUUVgVRkN2YFr=U*WX2WgCMI8pR8j`A;->>R zgob#@Pb>)x-4$4D8=5GM(P;9;UbtcEr%*irleUwK_{zn|;e7LyF0>6;>=bA3vP+6| zWn;y-B5hdR>xG_=-4k&wUrO#UUuc9^%NK8sQ!q`wz!>QQTril$*A@aPgly~0l6D0p zuRy2NKHYeU&U{G-FOshz7jGzqr3ooJ?1|UDL)`RiK@O0kC*e z%o`*-YCYwu`^y^DF_(Hkb?IZYB$qz#LGi;MWW-kB3wxJC-d)*ak$G2HwaAQ80!N}2 zd{M-!(_su3M-*M2Na@X9=xn%P)hyE#s+NLhh-Ad$E<_sn+lsI3@=tS^0DH~C$;ul= z4d;?KnrPU> zs~~HD#<>^5^j*F>#Q4{%941bn$8#akHsa+99C_E|*s?k3VZ^NQa#v7=IOKLt_GRg0lpAt#HEcD@N#tHqOxzfb|OrlC?Ujr zDc#CxQ^#Xcg&|ekCH@K{nyso4wZOSu41Te|AT*M_wX1hz&O%VT4+w|Rc9IfHo1teQP_|oH6Efl z5I{czA*?8OuuB9CciHr4*y;|hz$!Ohf-w@O>WQMW;Y+xc?Fz1R1iW#K!KV-F*S z@#G@DLS?Ous&S|vANfkzc4-i*$r3a}L!5ArlnGGdHR5D@mMXJX#ci^?h}@%mbI_U#ob14G(b{$L$?b!B_q}XNcbAHQw0Uh;*&yZK`I4FVP-Uv~jaKV)>HPZeM((gm{y z&B#~R0R>gNQGEW(JgNB>-u`n~S#8(0g3Ib1L}cfE%#OsHRtwpS!c?wj0@g#tmp55{O}-A|Yc?!W0xhOe z9G$?IH*^k};S1taOdv>+gBWCimHd#to;*98z%mesVQ`sVhdlty$f3HLf|)P#Ry|@I zX-ZL*zW9P}Cl~Rx2&Yp9U})O2y+nf=UiHp}y3i#r#T9tLJ*D>YIy>`)U!z~E-lc75 z!Q$TaL9w!5nKzieU+}d#offAP8`-g4j&4{U8;GUlqNPLlgB~KP*lg2ijWwrS%BCob z9={P$kTKoE#j!=0d!tsBr&^5#-Qw4-u^Bt~O4je_CH^)6_A2xawQLp}3RDeMb3^E~ zr+Lx9Bn^6mQH{DFfR$a3>6LTl@igjdcurTsFGTP1Y>FYabZzMw<_~uu1FzF*6JVXs z=ZsV=^7<5b$wB1TbPm`+AF#v!_g!MPuAC_r_Jyx_BO(UG61~MgsdMm9{$BPwM&>=k zGHKvTD!ixxrgEDGtma?QZZQj+T*OzPcklny84iJ1G&W$4@?~Sf@@1q5mFi*-vRjJR zbEiM}>g6ViFOt>f4~u2Os4Znm2=07J5$%`wI&4S20x3WxzD`hbl41yQ-RWc%@`cJb z(bOVxB_XDn9Zn#EY`+{kOtl2qE6k?~u)$;`NK_ZXW4*vCzPto>p_zh-GYEX;vk7B= zx${f*D|8@VT>=w$g=Lz9EAe$aofJsSk62%{LiIXDHeAQRizPYeB;v6(mcbH|>$YFjL_4T>WVZ2h<#+-g3`HI1`UFGFVDf1yU;K~iiYFC0q z(aeVxr6R&WejsjHCKBWHi!G;Ra~npH##dg@_|>Xf^x6>y*+on#ha$}vk1@|tYQSKp zHL&1Ix~Ukx&)%c|C%!tIgN`sg_zHlMlLS>k6F>vTYB{S`pKZgEyI;-%OcI0qvQrcb zZJt}?M2`JFGp446=9jH>4r9AA6!C!#c%e8jSp|Y(f#7RX4`;d20R-t(J&=KAD)@Kg zi*T|RPWnNksyd4QE39v-&_gg^K#bLO$qFGF7O-CcA)!O%3$oX%AU&TWfkhaT=hyNe zaZh}~&s*%|YVMSp-^L3i-#nfgyn-YPG()cB0sqj19rnWOc5)G4vfv!Te4X$%UiAH% zWiO73uetEDhJkbeFHE4c3>-I!mwiM4W)-^_LXJ~1m&49s@pUJ@wyGAY6prYTi4jvV ztbQQ{QGAJ;=$QnZv5*|*x|jB=@R=PaUBO9;-r-4n?Zj91+8SoO94AcoP3WdT9uZ!kPh$$Xt39!@ci&`2hB ztTU(q2u}<1qUDIBRS|IXx%&S7}SK@ArdxP+<;No|x8Msx z^5G5f%0Izk4*Nx68b(!kB|g>lmn~oYdc9`p4)8_1#1{>h!~MIOLJ_pGS~g^PW5-UH zo@y0U7;(4-V35!PV(<^sf=#vQU!;iFeQUp5&E^sUFKDSW;dN+Td<=NE5?>vlgZ;z9 z@sw63O1md%4_VkM z0Lfw<2Fz109w0k`*IfRh-Q} zo23FzHdpR3X6UfUv3-O6s;Hn#3A6{XScy|*im(7jr>)C~nA}lSoGmAK3;2c+09_Pc zNPz0eSKJN0@&QF*SZWFnrs;~i(RE#>*5f7+0!;`TF5*SkkboWICXmw#b}Ffin7r1M z6{WXDLt~;WUtIBpK3>?bGP#H^N?KLkNZ_f>opzlFH}^m^P^pu>DF~@**X*Te( zTL)jH>v)0&vSY_^5MjF*$Av&tfBfa~kH_Oqvc)1_#%rf>b#@rV7x6M@`_Kf~i_*LI zTJb6=L+XCv)Ls)qkg6QEsIVNrw@)Z={G8AmGvpnbbajq;P%fxQ41q4;MGL0rMim!L z8-(=UL3q_#6~lz5`s+h{(MoZcw86LqU#l*IkFrW2M|_=AVa`06zaOPv;=)Y(T z(GJlEUXbh;6A}fK=psiX&sNPvtH#qU(Sk1(zL{Lamm$<)17E<(;<)06z@W8X_Wdl- z2!6P!1tUJxPUfm&04H7o*>+7|AYO7AU53Mi;l^mdV)cvm3ur8e7c>?bRn~^skExcP z>#^EA8eMyib}t#GM-QC9mpw+z(~vzC4M04Oa`u!);7fJeOc*2fzJdZUiG0;D?$dsi zmmubBQh0Gte7QCo zGdO6A$QJVBl_L+5Kn+|(Kq#1i91ZRwI*3twp)|mLB}JM2zVu6Ge+p=SA3}i z75HKxeh4ELZ)ac~&-nsj&@XsX@EK9(u+Xt~)tE0^v9*L+Z4F=R39#p_uwKAP1`LTC zysY{F1%wJ|kOupErMW#iv4_6az6AYyq`0Us__`L*pq! z{cu9uUBWk!M2jYdwdjmL0qqxW(U9TK#n{FId_e`+0KgQT=SM^?@d}+YSN@j}urgi( zOyDS>f#J2BvsfZxd!+q>F6iTrKbZ7v_3q<8?`x99bRsc^&gD0vEfN$;A8-@Xmr!Gx zywnA_l*R$tID$sHS{JgVD+IuZllV%hmQ4Drt8yBoWg#cvoRe)iInG#dcQ6h`YRizCQrfb_Us}3)6=}~4( zDTc^D>tw;6ts>)aGvbx?Dx%9*B}$e3%EmR^kTwa%jHNd}U%D>QumQ>cJP%0Kp43D05XQX&XkqX5dTtQRZtlkBh(yd{u(5HY}IX zqCL`>A;ohdm0b)TM^u*HI;nJMN;!Ll8h9+ji>Nk%IGdkm4U zkomF*PrVkMEuldJC?j34QuzTx97x(Y{}NsFz)QZN@j|akHyDNRSd3}FMA@K` zsl(&|hd_A05$j>jmO7xDq8!gqv8qgzXsR5NM>pqv^ChaBQAh{?4X{c%{%)s|=qTQ->@)WyK1rL{~;*K4>Sim#=Ya2E@BAa2r%=73&{W$b0c7lse}4p40~40 z7YCCCdw$~SUbTK~GnSgq$(MAQu-igV9MJ%d8kd=Ay(GAX_+YU4LL;@ssMNa%9JFNR zDDed!@oxWJ@D-GiucWJsSUhM79669+y3+a(6YwRtWT-Y;6;nh|X;njAW*Vgxbpcu| zg)n&RLqpiI0MqXRUsdl=TE#2*`YyNirWLy@yaF(prhdI10mB>&7$Cf!*al$n&L1GN zIdSJ$awDhEX;ygZEXCj#yicVwoJ2Z^M@+4+*N9@Yq!Zkv<;g8 zdp>&i@yDGFk;8-{C1t!)e9-17<%yT+D(0$FKm-gmHAMYer~<0bS7XAu0F1Gc@oZSl zzwSzVWHo&E-7QM^YL8{tD+3XwY8ZUGK{F%?fmba(E1y@BEET0oLxyW$RbZW1qyr0M zQWA#cFF|+AcS^otL_oX(##VeGe+uD9(Pg{_TQT&K3k!p;=qXsR52s|r=bu|RtG0uUQQXWkj7FC@RV(#2Tq5_z}dh>slXbptFiIghsaXS*a$H&55R)0czsuV zt!i>sA z=V=c1OcZ$GFL+c%!xpEi1aNdW<_6{ty0U^$&Ual&$Kx3#aP0vr-~_Us=PSiT}lhwOQ1{TtcQGkKmF?8VlGzBw#-UJVt7?XTOZx z<=uF30s5LRi-6UA#}BX1ToGX&A&^-9Aq(%{PUoQi?~2FZ(ufGj26Z<0sAqoa$JDLvv7Z# zQflCfE6i!Y76F9#ivJEQe6xXMmw;EI!uc2gdw`NG@f9rx=8Hq*BZ3>TqE%y#PR^aO z*)na;^w8p0%a^nTUkC9u6>j@qWW0W(7qx=Jl^T#C=-~U46pkWK_^89RO_+H!V1~+6 zk;le-K|NcY(KqJw8Zc6*@CE`K5NpmCU*#*}<6M5ORc85vJYbK<f(GQ~- zGdsOPKJUnY^<%A35ye18cS%=D$9^SY5zP=`;tQ9GC~9Rayx?`bu=eG!;bM{fAYn}_ z#XnD6$us;OE?@%~h!I+b_?-g+z(^P<19324^Cx^QvmSP4Y#=3yfI)#5|KhmACgzy)=MV7GDGr$z z#iAK3huGs3FpgCeF+F4PwGk_u@CO|;6kln&;;sP$hQGwu9{C&w!Phxn$7{X{ngpx( zq70bR>aF9&F_$f02Pbvxr`o>%v249Q%zZ=ODNApaug=FvGOKkMlu($;(cnsk7u;YR zy0%=_rpz6US3WIhsmsM>6|vXE>niUsZt1xI?CUgGpsCDObhqM7H3Ib42h%vlLzZ3I zdPk;c(}-DEEJgn|7-$)}^bJA66fD?E>Ofc6s?oZgaVy9QydEEN6SD#ssq9FJR3?jX z2{Y4Z*8IGWV5w9N;3eHklZ*JD%Es%{;0tMb;EM(fVr6#}vQ>3xiCd5r(JSg42LV7= zE}?YNwPW~>MP6+aquRJejC=N88|$K6uL@!VukSwpE_EB}8%**=Fl`<0)rti-Lf{LS zK?rYvslh245u*v!NwSMt*3v}GK@Bk{;eu?1#8(ag*s?*8UDdq^Y@`{u~7;0lC_!_O4 z`8rH1&HtI~9RB|4rz2ncZHUW5iYDZcZXzO00ud@x>O2kQ1qJU9pLWek^=Zjagp<7}F6kp7D&! z?ID-{FJ;^7@xWIZG2rF+yc^>-VZ|E>(mEdNv26Lt82Klo3_nd?$a)VpY zRBt9_kT={7%Q5jKDKK9K44?YnVeN`T@uG;CQOTDVK+vjZD==1{;?Z$MVJV`l&6D_) z?JL0W*}91T2gNyTydDED@l_dmKuY4x5hg>k8ji%oZ0(wY4HM>tnC(>jz$iUE;x1 zSpE~3Wpkr18&9`t8WqJ%^K$^;%>Fs%u_WNb{(u8#3 zEAS=z1t4)aA8`|4zHah`40xT=!KozS+fB8_dO5 zwUGityK@jDz7*RaRmGPMD-vI>U(??Q0t|m|aB@7*WxW&+f@e00jIGDp5S%0ZqC46nW-h8);bEtEpxcqu72a0sf z@aimjcUfXFq=WE@E~rCjvZNqin4^IK8oP;(ABIS3b>2UeIxEv<6;bj+Mc9FT!T~Sn z*+q?N+Do`;Zp+DAwtCteU$5>)r56;W;qc?bKGlh**d>9csCFR z<@Zv~lq&I=Y*kig@giZ%1Pdk5xIlwMmlkW9LdyN9N9rXdygUtHSbtf*hqk#=-<4v$ zUMQ*o88j8pBcPEL7~QD~w5{`%rWd2C{-hy}>%M5dY~5nNtp4$peke9>6hYKl5EjgQ zv1G;TFPbvy>=|Ba4?r>haKzV41voHYg;$qoe=%`e01V=b`BDN9=$F`^jl9Vl#A1s& zkqr|s#TU$1rTJD8qWR*rkOE$JHK9pcaiEiE1GWk^P-h<+FdHlU^Nw?vM9dT)=|drK zEph#2kuMJBYuokaJ5+KGp)p@)bP(||V8cpmA(#pg1GPi^2w1Pppzy&<+W&3{rhryV zHTWwziX6S)U9SYbLYQNl>1H9{|*Ri8KMG zmN=Su5e5yxL`k=ZpqYDb|%UUkAN&%(16^C>930z=i;ZPDWt`mUZNSOa6;8tX^*H}`LxIHg>A4l5=f zV)zim$d`7=s+O9hkTCPbtGTj0;~Ou_D>cr>{WwGwh*Pdq)?-^2@w-v*V&pJV{tUfC zCFoHHk}@53n+IDkZS8U@zEYgR4EgZ3iC1aF7vUPk=Sxm}g781^1T`ox0T}6Wk);jT z9#sxv%Vc#mv-q+BE2&5Jp6!<`*RsZJEq7m02y~r`uOa=Ai!S+tC$wSV3yxt^r)2ud zm@2v?00wm^G3E<1?>DbTeQzWIrYV6FV6k>0ZJ-OUZp{(Cf|rkJ-bOh-uClHCVj!z0 zz^h^#^*JzF!y$C_=aG$ecRRR;r(SfWycxqhCd+OfWoBZ&@+e2MG<42CWf~0VSQCZVOlQ*In;a9q*Xeicao`eY8!cm{29nDWC$ye zNR}W2ZsCg(U%qTz#P3KCkQ7BJzF`3`Xr_c-aV1x(4iDg8^f?Pw%ds?c!kn}4la>J{ zDR_w~D;)=nA(iHB69J|mq482+gC%MQ{3LgSVqAkU#ICahdbm~ihDnEzew%7==wpRc zq9T3aXvRche8YI*j`n6gPYQhj*p6eby>5(`ZVMpVs-g>4OnHd1Uig3*jw{jwz|2i9 zjTBz1yHW?~(_kt^VB;hBnlEoQyL|uv+a@DQAGIJQcwq-NeDVBm`A+3MQEF77O2pmn z3hKs#B&|>83SS{86MmiK`M8Y9>5zPYbEg)XG!|Ks{aSe8ZmmR39wcp7_^QF;og7B< z1-sjSe;B0+UJ7nd=1bxG$;35nB+UC|#Z@_tV(8{X#w&b%;A0AWxg$q%IlKxZSUhsC zS9RV8>vY5JLYjCYU#o-^Wxmq?rqSxrr$12UYV88Rwi{s|TMr%tFKohUQXj@MTzE** zH0or1@in1GrluT8IoxbGzu79WGk%vt5QH*)>AxWvuSDj>l-67wjo))@(c51J41*bS zc;nUOtLE)Bqw_j^-2s|L3?AWdt}Dm`bG%H#*V4IE^RA?T5gR^hELcn6#vFgs*Ma8|Y&@heO68@B&#a z<@VBM;pLqoTeJhE_=>Lsb>v9GZ%omk^k*Y&kk?&_Z&+(=<|sW&D=WffypnfFJvm@Y z4(@#o>#s9nCcSbLkxMcAhdT_b>}Cz77zdc@1VmFNz98eZl8Y#|pf`BG!EiHl3NT(D z^etWxX}iDwPy`K<5pzzW3!ELq$GZ^9{?-7IPY;s;%L*)n8AIbmzC6%bOfH9nyKPA` z^${CIAs6}vP8?czMY0AX%^NCg9dT|gI|5%bqcx1VvSib) zVUtzYmny0xbi#|U_+&l3i53Pz29^CPONLN~Pj_&CV#fZh<_RHsb*d3?kRym(eqk=H zNRrLdn<@CJ71*(oqhz)OSkZTNb@c}PeYh83EVAS$yI}Mj@BFPJA%KP!ELl>73=iQ@ z%7$4ky2LAd8Ly6RK+fu@1Yd20C6c)9?fVh+faR3ZCSQuK;XnPX3>c;b*8#?Zw5zaR zXfV=#BU;iClvW%QH#B*rG$@sZ`NG9z;miJE_|lUknfPd;7%$9TqnT({V*sr9az!@( zHIk~pzL5R$i48yux0`$^g6NorG==@D6&QU)rEVxde^2XnRVu!2fR~nGE@j4WM_*BV z@i9c==pWjEF`z;DDQ@*$_)7DsG^28`gA>UvB2zD&_se0MPXF=n`abZAHu-{%gcUK9 z$0)WE(979+eNI=)(fOq9rh~6j_-f!+8zq);H>s?>hM*z%5_49Lc9?NzIl+y!IKBEF z(m}j{K^9O{*g&{YQPysK5Xy)5$u!GICE z5=LRvE}{m7=lKmE4{;7Jz&biVaOPCsJ3J>|S#)KRl~>;hu;Po8IEh;q@nhvg8LTm1 zFC65!09=&;d!+LD1UnM07X;G6(*Uu%u~)3?GLa9GmtHs5HSS^zSTuu~0Bz zo-QYCz8F3PRiaD(nrk_l&1xmccj|`Z)=>hg*IquBh(k`-3to6t{E&RnLp)dveAU0I z@N##6p*H}o7{eFc))iDK$mYvP9Uq_66aybAfCv`BRsg$#7~`=0(#wF=eQ^VD+yuu_ z4t&IyVA5EC-6h@EPGUNbs_?7eN^HY`={qQxy|${Xd+Q>8tYYQQ*66C?1!OaJS$sh( zb3Hp;R0>hA{wp@mKiGB=>t!31`omFKGH;w$NV-x?iRD_6i|iM8bMPWb^(`&F3Yrg*Oqt5Qba7klK}A-J1a^_77h~2_E1i9N zd>x^(U>m3ZD3OiN!WZx&UoNDtS#9bUWyKexO!T0-z;Z~n-Ic;u!hfk!aY?ejRUbjz z^FocH^I6BaU(HKrLXoVdtHgMrlAO#JhC%iUQ=U?~^!;ql;m5^7d=W5S$rWC$r8VR* zK^4;9Mb)zLI>q{n*XeYBfB)hB{Ao^n!imBc;Eeae zt8cGbDP6L>oW|ER_qsBEU`-Jb$4mUa8w}< zmU9@eJ}XiwQX{^WnCX==W{NS5b`EhDt5!Bl_9}cCFQ~Yo6+7Uq1n6*It$N3N88D|w zxj(iI80h+Xz80)eCTKgDl_us37a|qD=JXnO%$FjD5Jp@Jud9a-A5P0hgh?Y`c#Oe- z)rCM2u$z0xxN)!y-kpKF6K#xV078&802UXq`AU6?gB%-xjk6Hz6TnK}-&(N$t<53O z`b>O9fT~m@_nV>Oi&8a5M9+{1?>U;0R#G%i5g_WMA}_xBGH%^l$|{Z`T~0PMVakd! zcS`u3Wmhc1P2+_z2gE|y1=9oneiW|pN#{K0e6MnPyBmF*E{+}ds1<1Og)j!FV(tb! zKwf|s-^7WyO%b=>2Uk>G?h~57EsSn7@pv!$6`-{J%uY7k3X8=eOS-7CGQ}xFo6+$h zVNtT^M~!`ZBW#;1_21HE=TLk_g%pKrFT%vvo?lphJ>^?~fiHoEtIJckgc3PH%)4Ta z7ODV0RhOi$lwz+|0Y;Q;zc@ewOCb*OB@?Ed<(BHc_^!eBt3=+MfyfXdb1DlqwnxS3 zM#UEZqeK-97cDQ*(l4$|+?;?Zr~!%u)D+VAMqm|R3>(IRL0N=RIm75K&j1u#E8bNj zHv+_}%kX8WQnX^^x}!ZWx`7hoAYWDvLN{NUZe7Ix1+VZm#;arWQt@TLnA>aZnXlb- zz91X0C0~%niU9H}+pu&B08)R_)&8!ofgTm`SQrb}d{%_#Y5i&n-N zCTxf4|86_4Uw=gsCk`OWXpQ*d;{_=*Uvv)(Ctf5PExZ93FbiMzc;XoV6Hy5zk}kS{ zj2Pm>bYD#Hi*WKGsWM-j=&9#W_<}r^gje{2Mu!*0fNh%w{112`<1l=MFs`^7EMDs& zRx7m$=0isIvd^R@qe-9_VsQ-<^RN}tz1LtAty!7@Oz=vSgD;5;9WY?&D7{YsbGG~d zRxDS1L!S;Sy7;qudAM5t^H`NB1Wk~wC*~$*UofQLIr)ct>yzhl z62q+da`!3#MfK{dsEgtyVrZ)+^JTpvZoUUzwTahtDVF*2=?&Ezz+9QKrSqniL*6_9 zGd<)BLVV+DcvRSlr+dC+!vGnkOrF9+Tru90Gkb}w0vn8#*Htd5Bt!g)e0jxH&v^@V z|BY0t7_!(e6Gp9{zE@KLw*1)^u>aIKG)@W6$9{#cG`w|_GxMdhRG@|VLL3opm9%gu z(d!d|=0Z$|>st%@js)zSc*Ql$aj>N{ymq-KFIxCCn zqyQKZlfzfD-4S0lU=#4iN%&&Lzqh~28En3;5I?+nxL*X>UUBp-A5ngAU*ZVjoLJ9@ zVKr}K;uAKVo3AB5HR*2O|Qou*SrYh$2hbn38on;@stUCfYMCIKXAb{1U#jnVh+xrGE zOb)je>_6O9&XQ|WUVA|mcjKJi)oT@V9IzRO|2(#BVVHUYCWi!e-8DP}-Q&&d`=8&!DePU-b!#`sKp$)c&mQcEncX1vDoBf5uD_683Mm0(j3wR{$HK)qM3K#g#=*(hx#)D__SByI}yw z@TJ@*BcsTnK5MNw{1R*q+=n;tMZs|Gc-E&4b(&!@XY!aaWt?EddS4lntiie+fboLF z7la4(uO(kcM+09AiY*yq!@?KAV_XJboR|G#(!_1i*vRs3Nmk3Kav({v0 z%Y3o)OZgi^f`+`p&W^&sdq+4ZUc#52$y7xKijT&8HDEGjmuHLB)<^vJ)Jv~T17@&r zQRarXnW+Mdw!j5eq%3$5H)G^Lg^4k1DeKY?tngx%FGky|Al7{4aODobd)I4z4&fiY zzP|Puv4j8En90MTUrFG$O<8(%;m`BG~sh(QdBfN8F!7Xc(-Rsn~>tFF%Vb=WXc z=DZR)2w4GDoOO%?6Ke0^d<)pWfBI0iy`sc6gcSyjys#8eow9Svd6dJz#;u^Tv)uSW zWb1r2ywaI%w4og3)URu>b#gj|PESvf>vufAhQ7SMo;!=mD*FZCSXoJtGN=YJX5jq$ z@^9%7!-2Au5xa3W(ez*&;__X~Eb`RHMm``I15YI`!H~g$+W{sm!tNU|J#dJ=C|eIE zN-D4%qm&vIhYn-jK$T*Mp5dKRu=WO{w5J~;9I{{L3b!R35q5F#qaXe3dt3d>2J?n# zlP^+4z-+g&3ueITl>M2zwFNNV?W83(<-GX-L%e9cgcnqZ)f;>nNlxq_CWt6IpOYFiF?>2KT!p3~5B%5#WMc8S@s-+F+3SVH0a(@nck8H|D z?{Hd-?Ux;M2oYG7>Dnh>QiU?E!WVc0Um(n8OPo29s2a?QYBXTx%YfOcg)f<`0<7J{ z=8H5DuMNI>HcF*8UlejsXXiiKTCjg}SNSt5Y)Oj9^8|1!n5mc^?<18+?WM_$Q+s*I zfw3`OP%?k#4b-Zpw;+s+q1HDl_CV6{F=jyL-Me?VIf2D0qX0EuQ2hwegRck$F;-q` z?L~wdFpj+f6JR8)7{uSydrV2O>kBz%KlTyF&wWCXYrYDv`UPSHU@%}1E+masOl0u} zBSj0w7$T5L=$_V#5e_vFO&V_!IC#4@!`nebNMpKV^BRpx!lLmxmk|Fdx|p9l-vajS z&SCJ92E6ccP~(!D%9g>i)DMOS#e%PtG}3Ts$H=X1T-HCv%h3-3MFX~!0V7=}rQ1U4 zm~&Vu?9YOsnx6U=+Nbb*3fk&x09J+#m?_)d35n*bQ>2O@+&FS*;?6E9%pDiSPrJU- zc$u-aT`v}uvi_1mdWAgFWM0cG*fE!;*$Hw zyki4WIf^M>Heel>4@4>as(ETFgWnOA_J|Pvuirg?xaI3#bifW?l znN8Ty(dZmY!6w5+*?vjp>!A6vPY4*KbKym#s^}NOOo>L|>E}OxxZjovx8aMA@FITr zmzgj2y78G{%~v;&O1y)&7tL3-2p9@mj?QKTY6mysYt2rrlu#-9wDdAxY>h4JrCi?W zv;YHH(<#eTuJFR0s0v;74+9gFwb_;Ux^alUUUyEHQkR>CO$uK=3Le2)+yOHQ(Rz^)GseX7NSEc*RmVdMMy9Vdd0dz|L|;5$V!Cn3{{?lG3e|_IJwf zoOlr_r5i$eK&DP=I3-sAD{87V3a~$m; zUto#e?@UjNt|a*4hJ^Xi3Q~Ij$o->~FVD%dSFwK2))jMGw zLnL5s6}1`?p$6g-Uex(19uv9{Oa@F-UV~iMT=s*s`K`a0cIKx)+eSFPrH82K+T;r= z#F{RL=6S=!-uh$tnq|zdadQB%Q?3QN{Aw$ebI4`Tco}@ddFvdvGG6os$7DTvM6x&u zSjLMIUpL^3>$K`bP)wWV>)imR_#vd3BlJl>1XC5GIn)s<#H;w?EpbY2ui9gWF9~cF zT_@e1&Cx@7g)m)Zz!*r3X%b#TTg3JaaV3285w#lAu@J(GeD%2xi}nx;t%UFKq2ZEz zOl%fbO!pml5?+wZSUktrGwq8NUz3w9U;oNE{Py@pqvg!r$}%TkGj-soQHc)Xi^hw| zMBSb+0mA_1L(s(+G`DnnTX;Ec0iGT~1Z>RL^ecQDz%1Z(T6~p{$VNI!FvcLh7H*a( zyu18=ny$jj zL60{wWO&(nIducuU-1^5-vP$71nY)vwbs%LfGuIqEHnXt0_tU?s>tZ_bFHbTy`oD>m~rpSM5CLA|@jrIy8)Dwm0u_=3Ek zJam1T2bNl@#i*+(yL6?G)mxD*HjKi%`6{@cLl2)ngh-eRm<3*8CcM1c34j?H|P=m@aDQlG1G>+r^^ zokQ@Yz(-1$F<+=Q4O)mf zAb(ia3;vQ1Kak(md?`IjFcBwQ2fi?ZK;o5U*Q(ZBOffG@^_!xLeEkM5+pjFbBnRaM zSlh|-_REevaoM{IvZL{k?*R!3ItpWQQ0k6EeMOQ4>uYPHPFMJ+}FE7Gmz3MY1Uv0iB z3J#GktiwvTbEx=I7?J<`pi81`17l_Uoy7(FmQ;83Q`)dj(3EwA-(>C&ll5yVQzhcOHCNx5MSC%1|m-OsD{}U za$GfF8e^{#-ynUXFR}=8fd1mu#gmi$pZ)lITW#b-JvKwaYfPA_8*0A11y+3FsroDV zJoCkY`yO@|_>OV7#@KDFYt8`|yo{LPg0&d}g&2NQSPgUmFI>piqb6)@!tj#FTZcDr zxfz^9^5qg2hYy)~GUE;2-7-KL0al$J{cMPes*YKusCHb`J#@E@2Dg>$hpZy!OINu|>r>L|CuBh^Hoc2$3=t zV0MFFuBa3(OaibT03;xk=7uU|R=eNeRTya=zBG>=YreW>1)sCC;%k2V)t0X)4d#JL zkDGY4+C6mg2Kl<^UbyPa4wMuTT)3^%kbelN?-Fg>fl4B&x)fiai+|`w@e6|Ws}lJd z;Q9?-0ZfR|uE|j}UqlKKevNg<`2TeQ#zol7hZEU6VU}Xc>ORj)m1UDJRo|2~b`t`O zwB18XaK;WD?C=V#cdu@JEo6p33;_E%M7+wL)fGyfRNFlkv5-3zICm9TH>>Y*=5EEo zn|nc~xM6+VJ=A8%tpX~2O5kaeS;>in?MQ%eic87k(O|zYLVL4|w{I`7#k@`7pwbE; zrc2tuD^l(T<=YE8Rdpd?%7gNP#EBYYj@qRqv-tvFRZC2|CiC-?>3-oszCH(8r9ulI z3YP3QVd{C0ig6Q5u|~kGQ<<&GtdbdXR`50Ahj{x}aOSPA6n&X5$4ZgGv2##-9W0!g z48XiwroUbA$I_9+oT+CE#>x_({TjO3jisrU(IsghjBlp)X2m6Os)y!ltxiluVK7qS z%V6OR)jj9Gw_j*)4>#oQ_e%IJzAF4-zM$T7Zp;WBpC`P5!GP6&r|lNlI$f0$^>ut1 zvVIc42I&@jxvil1+F9V0LSzX{2`gN8AWS7S%y{wyuHo_NR4Xo9uZk6N-SsQ@hQfaEc4V`?~_`;iNzJ9lO zD!u@T_;N2P9VuInS~=jsc#Sv2EZpczmijz6q7kjehL1e?_pT?%* zY-kJMm^If~mYT`8qo|9*9O|e>zINtt3_(o=E@ZrTQ*;S1yk)%}i7#;`5)tDjQQ%9Y zL8hw&#wf-)LfL%ai-3tQ33e-0ZlVl)(MXf8F3MJE%Z!UK1x|A=SRZLV7hlIk*a$Cu zY{1|omi6VYzg$G7BFZp@FB8^$rGvoz(CpVF2`{g{+IHETEuS93ypb;w#P~eGyQ^z= z=P+C;`wCxyE_`Vv#=mZ6JCoD>Enn-A4TBQ8zM;A@cr{<2{q3_~zFyVEj z;LLMIIV|y1W-O~OL*{UY?N`C(1C8#P#i7kEi~b@W)Rc1&Lx3EL2Tj;))^|zm(4j>M zb0itDCP|wwtQ6@u17ByC;Ooim>CgYP1*{_*Ntjn`BO2qiX}{_x{`NP7=Ux8G`24~F zL^C!@Hgp0n1P4uy+K{~qzLJl@3;A+nLzv+*#16w3@7DSHYKpgF8y1cPDo2rMaR6T8 ztIX#!)qVxAS4x>L%5dvE71gLHR#=9bSzkh}Q|Q^5K8@%ZpjT_ebJu=(>x+PiFcnw= zE;3ej7*FtF_C~L(BHm<=8F-m5{iyOdWRTi!i7)SeVcv0htETvQ@}=5LH*!meF?e~R zC6~uuiXAQvW|tQQ*zx{X+Xx3myn@Xbu*OSy^O+kk;ROT6zBb8caOI&amDn;}sy*SK zarRB}z7)kY4VfkZ_6QPO5$Viieqq|KBG00ee1gC)Q1VNK(*!=y6KJhQcm!4!Bz{; zo?V}8BZzhm-@hN(r4e6wPW60b;J{Z!IC@XW{n*TxCC<2Q+)bf{M)k&!|At2btf(Sk zFjO{LBMtFGKqcGdVV`(K`;uJ5>id3**A45RW53jMihTf*8O60%c9*+OTT3uD$tF(> zhss&ZiF*r(XmvKC0fQQeTzOF#-s`W5gc2^kC?gig>Q3Wmox}HIp1uXJ zeE+q4xhorW7{XH2bxgLz00uGP<&lgHNdZ{JRDFUp_AE-h5F!kJ%96Vd_)zRn5XzO|;dVo#k<705dhL z#V~hD+{>5X>v+r8_a6NHy|MXr!p3|BE=viB#EYkX$$^5HT}Zf+N{9gxUPE0!xies- zi{T8=#lT@y=8W)VU-_Xl<}1%>zmyo|L+v2&#SlHSIF!Dj?Qz;Gy& z3oy0xEVuv}`MN!4mp3Jz&_C>GhRqkJ7}#F~Q>J*R^&E8YG%e_;owi>F42aF$6(E(B z6z<%HqZ`{eW`klCMiYBqY{-ThOw^P-aYs!Njs{GS5wClH^MTZuBao#5m$a7Ryk~U@ zVqZYS2iH_lriFlbrn*^zZL!zTn|~Hnv`yfSIdY2D-u* zTl4yC6vgD(h0t+9Kmjm>N1V8_TJaAV;E-!*ZN@hgTI6W=(5iXg`(o#?#DndCml}BB zp-aKUmvuICI0Jlj0*7{&p@Qu4qTBc`o-V3bK$e=Abxv=(AhPF%q|7Ld(X^Lel_OPj zmH3;2`I?eE;|0lZ)ijSpk=U~lqknjRUnnBuHw!Mxd(7PA5>rF7nvPqKiK&x+-0RY?-cKkNGlN90bxjUlH-LLkPZ3jTb;8 zUvv+PuKcD*Xl6&a*A#es?&#$=tx&=a(*uq;OdOab1GI7F7qnBs0V&NzqLmM#%=r0dC_ztZo{GqbDr+6Ua z?Jh7OBZ=|h;^1Ec=5&qNuBiBQ06&D9rv}fDi?3nN>jvUFOo-L)GQ=i3$=~1-j4bi+ zN+tG+FT87+>2r-1B^<=Oa4l&^5hvZn*PKzRPstG}MFoo|NtobJhHt_38(st$;e*Yx z6w1J3->r3Nvs}si!6z8`SY`<@<@krb?XIJIqAxsYzMRY$T_|nvTXR z8d}#BT~=AK7N_7&`SSuac-24HfN_@MFBve#4xNW+zNA77d`UE5N|u+%8UlxSW5yg` zh%t_*%++voLV=!A(APnk>TJoqVze>?epE zf-jn{e;cq(pAmEsu;Qz&S9R9q5ps;RfBt#V04fTt#w&?~ju zM!Q_bD-NO@PA4FWFKz@7vJ<68QLBp4^O!J#^K8sl1vfw!Uzm_DWkeNUv|kLA4xEWE zo$cV-uX9;2TP_ZyYdTHEr6M~l1HgEtPB&9UKg<_i=4-!?Qwd%pz)%LJoR0976PVd& zLwrf%iC0hhlvf? z-lQ@KRrgV`czcGQ5B961y<;af1(1|#$v;dbiU9ky>2lCsA%G3(QH+<-!k)5LT(~I3 zmwMn@Om@jb@(OI;B ziDEz<0KICy6yea1G)iFgR6^!nu?iD!mb{PW4zjUr&Qh zG{P2hHB31CVpY|nOpm#igZPOarBXRj?;k^;3mQk@`JB^Dz`|7c(h}^|Y-bn$Mafr{ zaB-FXh;%WiAs3MmXuh7eBgBQq2roz$3&Jd_d#&FFyb?g!WWnLWIq4&56x{}8weUz7-=t)c*1`-f-XYYDS? z1IGYcAan4AE#{LSeToj^Pk#Cb)gFtlgyel~Q?;oerFr;z@$4l4BVQ`w!aALN5ifI* znq&SUqC1pI$PRCiDy_9f4x(I4x3;0iA$o+kQ>SSAb%VF@D)6zoY-WM!wFVIs!L*K>%ya7Xd5tV~}W$6p_H#=1Y7PUVNz$z3|G9HDBZo zGY*zv<4zFZ+ag z5X!y{FYK3TZjsW*&z{WX9bygT>JkH1OyDMT`31yizhb_~7hZ{OV2Y~=V*t{NuSDsI zl=aXeV3KK~Wffa)NU!kx9OAi`Y;;5O1*!d^1^Xq!>XdVG2)s({j;(+q0ppTuweo?? zI?`d)9YO1o0Q=RbnLMo(0ejBqA$>(zuj%OLz#SB_dIDaXFZK&CnfH=Qn%#%Z3RuA_ z?MH=GNfUkm81v+*G^`hO{O2P7z z;ML~qxY5E}eC-_Y7}>I3JGB$$42}lNjJ+UW;_Cnqb}#KC7Q89GaaeWB=)6%|UuD3o z6$G%7@NWCHZo;^+)p!+LO7q1Fj7S7jfYG-794rYhOU#+6-fb3NSB%ty7 zB88jW2`fkJ6Qx%ygJug4Tp+d(UyJ1jA6tvc@Zt+eQm0@2{xMJ?B0ilY5iVV01G z`uJjC&O9Z)44e(v&XdXcu@a?Vm@2bSg*fSbVJWj3smzp$V?%A4<5~z4B5u9d>joM`I3F=tzp%YA^m?Uwl9U0uRq_QfM8ALjjA_2x|4#;NcJAGGFQ3W}RNB1#L*w<6 z^j({hNOHFq!v@trzUukO^3nddI5fh3O{Gf+kVBOHD?YVb|@pc zymkX2;TGDOFYtr6YA)d5p^tLl7lI}HReRVA{AK<7pV4}qImAK0Hg{SMj8CF2Ta%{tR z1+XYV@cn+gYzq zc>EU@UM%|}Tn-vul(f0bf?@^=Egzi{el!JN?x?R`9IdI%d5CF>?7u z0T#RxoA+L{7hk4o5WdMT0M>}sWks9VBkb+zmdYi+qVNRWtKHqcj36 zbBF0|2lG130wfSlzC={`;>}b+nN935dj`DBm(_gjt>Qn#;)U81OFU9z-+cXlgy`qy z-o2A|C@^flUUp<-x>7m)qZGcl_jI%PdIS@ezhu12{FBY|Q&%8=^KFNJL2=O-PdUtu_;OV1)q-cgu85#pNJ{nf&V9~z`;kTeBA>~|HA82tiJMLGhVulEomb$5|%3~FK|z>X?~ zW9Rg%=j--tS+5&U!`I*88=5SPHJMK1rF$5@@K@7<{U^R&Zf@+{zkijl8tu&ae#pyb z@}#W|=>bNjN~C#8`_&f#lL_N!zS=?bO00$fFu~Q{VG}357C4msg3wR+@wx+tjv|sT zsZ)G`mfJ|V;>-4mH$J`!Uh)%rGm7CrH=Q?K5_dJsSJ>hp17@1?GPciS*~sQAi?15G zJ%CqPnzWH3U(|q?tdo<0aZfM$QuD=D`xiM@dfWD^`8wLz_&*5I!#RBW_Qnl3cELg` zFQsxo|F*O%ODo|OzD7>u1Yq~D;~|>VXZJ3j1ev7jT;)cYzoLZ69zskwLFpl-I1;h$4)B(&dZ!&~WiFY%E=)AXA>ISH6|j6?c7MhvM}hIk8M zext|o27806A{+uqaPiD#H=?g^yF4IK(zRnZ``!Ov*rWx8U!M4c1qS+1E# z;sDrbN>oG_KU5JXUy-@C5>w7>!ul*`KII%{QdKX9 z^eCLM{P4+d6GlXg9>r$OS6Q*0fiHwOimzuI+h6q_*zH;I74zjFy!}EF7Q9AEgTn*H z=EYY4o962=A{^lBe#gNYFiQqZgdH|tvR|aDDC^DSVvEkA;F1mF9g>fzHCuzLyV$C6 zFkduX-^HvNCk_?zU z#h?|scm=WEUmi#1Tj4960tTZczMvse?=i^ z@nVb~DGE8S3nSqoV+1KFzL+Xv*fz|#@g={NUQ!bIYP^nO^tWMOB>c$MrJj%y>!Yc8rtSSM^kihD#Oz+ zScO)buc(fBxXM>O2rTst7#bfoUO5Wl&A6QNd!Sx>Xse*@Z5Nflk@o-$%ZvvV5$iNSvF`p6C2LNOPKXxVEE8{B@vN^ z-U;;T;X7=B&F^(jn@J@Pk*ej7cfhhG9ANlR?jV)Z%@k;#4jAUQNcb_{Vb);cDz*zB zT&YK)Qr8TTE(2u&GzxhAQr1fuQmbg!dxEuD;gx>+6UXvu2`0Y2+T-@%9D*<7^-{)( zCCduV2a+gY4bCC30$-0e3E21Y~!4ul5rqq^SIA7dwK* z7rvAdR;M6^FW?ovP2w6Bw#f>wbzFrP z!yNJub57BfP~)@hK69bV{!LZet1i%uNEh8hft0Kb&J0*LkOE&$0bScciO)j4B zRU7WR=t~E$SU*eP`4(7eIH#>I;RV%gXIp&je4ULrX6I%GyuK^GAOpn)H$yr{bfxN~ zj&2}eC8AYBB5UC*+T2>fpYWf8Cs+^zmgqyw*ZP{E!{2oVHE)Fta1k7fu z$4`K5D@u=BG$$Ys|St9`> zZUAg)_qR{Tm*9GJEOd`0p2X?hFa1APV$KdK!En~Y*SW`xUI1_ozq9o+UJ~dEU%aTm z624%p09ffMg?p#l4_DM*K#+K^5QFPe8+q_gWf?z^92#GY&RP? z^VOyNQpj+I{Lg?FLmdGughf}m@_n4~J7gXjp;pgz8}^pt7}l649n}nj{^G@xU07_M z-RIOR(iR$nlN&OuNcOZfmH<( zKEi7_&;g!`Kr>*DaKv!U*Tm~D5av#!3L^G#drsllRd54SOzEmF0BchWi?(o;44&d7Qk%4Ch)=p#5pGlORpC<>U0$R zBj@~QJA*o)eT9%|Z~3?Zs~kkMLcEFNEN^{fA$mB6Gk;}h|l$49W$nsLt&|O(KK(wOMpS?ACG8M!t@Rxc9BX&1C9w)GIbH%!#vr#2gH!WI`5JCz=u%}V zjYb_q%)ZyCOH>!1C|4fc5pJxnUf|Fp=sD%1p18t(?pi*8<`)0QPT^pR6ac&V`ux^c zWx#6N>;0u%!vgFjW)Rp?=+LMbli)Gnf_`gHAJ>)_@p9UROc-u-l%@%b>03SNo_~(l znlNe9+u8<^(RAGv zUv1E0xFp^MlwqokI6NgZ?|`9hkokf%!4ydwFCRWxJUhnU*J&Eu-U45a$F4vX-wF2Cyl< zesQpR)-HtFq>Ta7A+EuThyX7GMh~$MUk+j!U=>Sz_zsy$w#)Vj4Fk{4PVT-*Eb7JN12pAtY3NHaB1QM$tU!tXRpzg++ zktFYm9eN(_JdO=moI`4yblACuczM-1OeEt3x87IgU7#Uh9!VP)75pSy_-ej{7Z+f- zJ@=wp-#_L8cZXZdMc0Q9UylI;UNhf*yi9O|eARsdt&t5XD$JMlsPJ0HXX!CpQqXQ~ z;wJq^0|w)Fut>n1lB7jg_$uG<8*^boaF2gzO~A#lht^#xkc#z6&SCI6*8lr%%QiM( z?hC*hwO9gJV8(Wgd`SST54GghAHEPltY#fFUpyzJTW^4{r1z%SvJyDDr%iHi{cH=S zo2GndcQJs)uJO@b+J@y#tk4zLq`a+p|A<^X4Y;f?L?*-*E*nmZnG}zG_0% z;%gm%truY4TBfr|>tzS=djtExbg4FcD%($8W(b%`hz)DLMgb0*ukTUTUL4I=vsI)0 z{$Q2xynr%Z5y&dEByKZXOSWGK)iW8f!aTqWll6hG6Y6&=sQe>yd+irmRo{E@%0K+! zLAC7(ZBCq@PK7#j6j35)QgF+mL>(~{V^NMy5mTITLeYMCN=;<-@^JH7eEsS~-Ut_4 zyNm8k2@8> z5dXlRPPM~GWc}(^aT##V!dNWWVHDOVwMgt{_M+*PbS1)JsuH0upbXfk-A3?ow|OLO z{PN|QIIvx&j5irYi)n}ToZ_;a2 z=8K$^8w6~7Ojz=x)G=ys4jJJntX5g}RZ8;Hs>~OpNd4w!5e8}bMZOkUS;;@4 zBn)4rZVtdM+4$2bFRnbNq(@n-v%CxC%!WvWO|saN)P~uB#auyg1)*^@Wtwb+F9^@! zO073kg@StJy|Y*J4t3xke82u5t2m)nT>`8mx`x;mJVY$OZhajFY<70$&6}Bz6+66y z36tKzaJ_ScBbB%vo{z{EYQ4Orycs#rkpjyQ7QRNhx3sXm)2dAoMw)EDC?jFOyj85^ zrzyVDpUrTQM%=)bWpcgXb6q6{PUNj%Qa~Lo95r7U5kbV_i~Tg_`B^H-dO<)75?&A? zJE-p1C~E;;3rvk7UWQcIBj!d!~q+N5qj2hf*l-zP0W1BahA4nw>f3)8t5o&W_S2DZbM-jCehWgXpx4F<<(dDdjMWFx4=- zpXd#4V$k4u<(^*Dg&7AUVdT36UVOhLfdN;DC<}=@U`-s zcyS3vkFbFWR#nsvz*3(V=@p`4tPqRsQ6YZJ{EgNBFWB355I zSRT{*uMYcl^TRE;h}U`rhJ5*%nHlXXUuO49vuuIgrYRb&IpmJz8l>kRhbPz^o8-%N_ zvkm+S-+*ktvhj5eyrTJK@`e7Q^Yi?dCrFIQV<@};8;@r8`pW?hh7Te6U*@Y(!^PcY zDX~M{>FllH>i(ixQ~@nfh9@Qcny^$a;~`}zq*&2Ig*a%Kh)vo7NceUl^M=k@l1@e` z#(oXBWSlE=GKCNXs2#$d^Fee;ri)l2QjY+AZ82Z-J!Z7p0AI|RxB2o6jNyuhC^qQX zjrh6;XYg^61^=){Y=D*06$*G};T6=0O3^UYUh(BoNrnJf$` zT!!*%$9SC%d=*ZJUlr4O+CO8?q4~-N*oZHde?e&GOY6<0rioJ5s4ILas~2_2&Anz-H&ldVNd0Y`|c@-<(Rb(Nzo z@@z0)Jb^0Sc+q@G4jcM`kEAOeX79opI<4Qwa(g8#R2EICgXshJ-Vd}q} zeyEeu*>T>ax#FenT6`rGFBkDxZAAC=N_=^z`F!gfLIP?@!TB1VEr2!IFD$sk7*Jc+ zd>2>yheKZ*M-OO3SQ&+Q!)W!D#!;rrlzCfhYVj5QyvTw`9LA1tq(_eUlERn5gBaSj z@~Qit9uJ4TPJ%=$$j$@EE>u zX8=REo2dYX2_Kx#E75`#TEp`3WN)>s*G0+yK5%2zdYtj8m?|!-MOK7&xF8xZJlAoS zz^fKuAFgc(5uroqBcT#rJtbE+F3p#%4yeF|S@YFB4oR0uGhd8p)Xj8xW)Cq|aN2-9 zTE-a~;Y&foO8YTfj&ihQze?RdD*1=W>WxMvl{zma_Di)X+i?mRpYOgK_yS+&csv4M z^b3_mZ@$*OLxDA@T8-LE^ePN|(R_g~XQr3P*Ku9p>r8xEM$2G%^9wiQlOJ2@8?6MRcnbN6Im@+IMyb#gw0!$lV zpv=*XebrTJuUXl?=TP&t3cd&!t1QV^sd`0;FIaKjWxv?e1|Rap0uWjdwgdFGa&0&Z zuO@6FCZDdL$?L6=m#3)><4x{iY@E+xNhTEHhjRXUe>wI`kDNoPN2y0}#DCJ_>w=L( zSY_j-BWA^ymtayGtHe7vl_qz@>Y+Tu;_LLi`~kkL;R`Ej8NnP7x9SBnL->^9nz(+t}R%fUy0RM_)1a~2@_sJ zPweb^QR;O_yTt$^RCw7##A2&#*BLK>rmZk9zMfV6viWj{00Xw^O)#kNdW8IW@r7Ru zxvR}dZ+{)@h*Sb53s&A$U8OcWBi#*K{S}VL8jr-_qkeI+s8o|;l@a9@arp8%usI2K z+-XC!ot%&_)mtxWKiP$$c5TU5gA>38%J`_dWv9NGFD5PGFIhvMfDa!Sp}(Fhu-mi3 z%Y4yV(Ub+S=Bp&*bq{L1z?YkoY28KHfR&Ql+q&oR-gGni=n(>vwFWD`lp#g6z0n(5 zA@gM`MY?RhAVdxgn0LMgzE;dv$2QJL)CN>H111l#02>-_oQbcZ>lyf(hnlY?)mL)u zwF@!FchkA^08D)0m&1gqO1T07e{A!m#TTSZ4s{`Pjd2Ioa~>XnGfE-K((K2)G&>ZG zIWHx6C2Tl!+3frVLQ&-z^DU~oqTOn7<5*XU+{$xhhm5`*U*5?&V70-s&3ePaU@?3Ai|iLFW`kMLOut~ z(=vP{dOB7GIwNy`(GH+=4Py)5U}RUK@I|@{VKiaLmu1!k#@_1=@MW+ zC1Htih%c9;xado^NmeX)m9p^S&Q}mSDu*y9Jm9=?2I7@~*@W%t$a5Gk{h;v{*uqI0 zuev({P*ohq&oP7fD!A|^sDxAi^UQqV5=}ibZ9nF@miVNLfP~F6{`OstGS2NKMahfu zi`1bQGZ$J{LKlm%S9z8)rfMjse;xCctZX8qc~YuV5XRjvg%S1FuxVGt5RoGF;UCv8 zggAHSldKki%E-I<0&;@wg#e4{Okr6s04Bb0)BYD%VQs!lmLkX-^Q+MEQu9SK z;;IYgD|}hw60l4XK{Q@ji}^56zY?j@&<8fBPOzKXF$^>86 zuMx-Woo_$cU|F9?80lgFF^jPm#w%wL;fL}%5B3gU_7O2g2MtyzE5cmwf@|tDO92K0 z#$7PQ=xxHR=haiWYVa(@F4}e(HS<-fQK3e9DTInR?M#{}h=cQdC4Yl_VWCC9iZ24T zT%}$vsU%{G&WkNfBsK>eFN@>Ob|LD3D?yn0_H7VJT@MTM^i zBor z^&F}VFt5bS)^yrn&T1&Ul+Zht-?$&Wv!zDoJ1~3WOnvTC{|{*N@wT#w;%W;Qp9U+& z#vzUzuIi{IJdrNpwXMb*-b3ciYpPa9I@CA77R(-n@~XnuhbjZRZXx=)JMR_FAY{4# z7`X~y_7clK1P&si&MkjLx|**g#WhM?g>8zr^{%UI!X^{wyO)RT;gkVmgadr}&ph|` zcRba#rl^$pVuW5Du!9%*3SLf!qVbA>iVX{3{SAZtg8<==Qne;VY%~yKfJTC?q z{u{y?;wzpa)N~D+uwmWD8=Z*JDMU~DH;Dam&nOJxi-Y9Sbn~?$OQuDcnFL=A*blE; zo#pJ@dl@K-w@+92N)VBFQNruq!6xxCUyjdHn7F~sI`L|x>V}87h#F(R!WZ?ZIw>B3 zFCkVYtB+go69BUXyRW)r!DPG`Pjuig=F8c<#tUV$;j8nb@{Ez;c)S;1M~jSWR2oM| zHkNiFxQE8e@k6x)z(~{Og3|+aKwRh~2guH$LjpAmU!!sopY9LB^orXP0ZQ(md^UL9lL>Wd;@#3&;xVFJTL8(dMfQmpd?z3txrT z6kiTc3~%oq7G6zMtP}>1j2zOynXs_+T%!OhkeZ~LD&*0wB9tDYnD-H}7wCJ)WM}~bRXR-> zbMb{AD(0#i12BeI$Z=A!j#Z{_m@gSHSuF^R)qR>TKIct`2d52JiYsv=UuLhlDp%Be z8L)1K?VvpIs;3-F>Ct?_;$578uVehxh#bx-wk2Dh}tP;j z7DK!UA{Jjew`M-iU7H98yu;!P_KPMAUsmiFr9Cm7_P}6Y^Fy;M;DVIVj!U6(0_LNU`xIterQTs~kuTPx+!tYLBg&llE}u+#M);D& zI)|Ds;>D=^Vzm~L0 zoOLF}If-b#Y`-3at_BRF>%Fiot#Ys8sx|n6=7|$2fK@hBH|td$$|5Zpi@$8X+~0;g zb*~LMi|sHj>1^hQ_Z}YX&a-vY))3<0kA5a>DDlDZjvSZVIl1li;d$iyNqpwVN%N&4 zmMFdeZ{Tw8s3DQRW_An-Sqf5yfi|rh=I_-BocQ5#HiQf%*+=(_GAY0+B3={f19ME2 zi~jsTPviWYRVtr9&s`I~5IZcq8Zd_736coo)K8E~!RQ^nL}UY|i+st35wCTJ55-kl zNNI{?nfa3SB4ttzV;=D(DT_n)qtlgY81uCvzLJ3`#eNMdFY*<#&M+#V(Uyx7PMxO# zwvW!Y3bDnbMH(=fuLX#Ft%|Qg%<*|ZbwH*{^|V`lV=YHv!N3<&=(lh=#8Egwg%|l! zzHjO(<059G3$ySP$UN(msrZi+T|%WahA`n(VR{iZnRuA?hQBE_U+(68f`9eBJ=EJE zR0zH{&L;ZsR`Z>PDJke8GTSj}_SLo%e7L!Pi^z#X`z< z3q#f5FX|V_d~H_Z?LzU@!9(qOrLB#y8Z|J9Bg+zqRn?;%jIGaE`ldnD@XGOEhrU_`+4W9LvjzZp3_H zrkMS1wWEK+- z;lQEe8sQ7#VagL}z4fcBuJU4W_u$3)QYEAKz)#u6j#a31IZ7{^@MXz<0kA;TNV<>M z2Kc&01`OU|sqEKVJBZ4I5=xW^Q^11`Wci2qmiXo z8uB-yA;gh9M7V?a!|T`{Wz=?dWRw`6m+lL&)Tb!EF=`{4d|t`!AV*1I4cI6Ci>5al zy+qj3wqMe`Y#5#y<0!tU$C$XG6u)?&3ig*(pR(^52gJ~Z(880;I|5h~N6@V`f>yW+ zbqJXb=RTMz9bn#_=M^bD8L|%vn;b*Rd_lsC^_8Hk;_@eZ_<^xB54z;yLPX1yVC_Z5 z43ls9|B!l!Zfuh}2_fe1>Hq&?|wQc!8}+ya-rbHS{73bdj&9Pzzhrd?gPN-r)jbb~G@if;@z;ioOf4`vlA- zmc&c(4H&TIYiJ=_o`}6e^Hoc`q{}y7T!Bey)28)T_?lmW#233~VUYPk2(=^iok&l< znCu``TN_6Xi57BU}eDsn9Wymer3PvQyrw%=h?azQiTRHH{332>u`45eWDmKJu_ZWo38+d4g|HAE&FBJ#j``eI|SG3vD2+3b|`CjpbBZjh;S zd7+7JuonQSbKW5jt)z;sq5B5#!n}U!AjqLs0ierUfCt(HYreK*yK31bzIq#MI6p<3 zNLRMNyzLc$M*GWn)0%k7Un;=Fl#}*ZenP=&@uBM|i>hX<<`f=!zE@qr%L*SyBuuyF zi$Bnk7v*StlyqO8p+dk!RBfR+ONxy+&fTr=)|Y=^Z0#(+|3tnh1C~4v87|_btuKA! z#qQD~4-r9!GV&$BgjhIoAcN(EBfBU9{9)>#zQ1uIbyj116_65w0Y%KW~<;T>6r}>7iy`t+-c9S>oi|Fp-6l|2np~FUovPS9(FB zO70=Gx{5wn<>QXvN+oigJCvTwi55=D8HczLFr(@97fqP>+CS$$=(XUBvBQs$_`0Nr zNWdJV7hr$=D@KLrZP%9OnK&*LU_>lm4x9BHC+DbR$g^$SSVfX!IE-)fRDH zc)5t6(0W4qCBTp$#X>1%Jk*5siCbHE!5Iu9`C^7)Q$wr@7bX?jctPD*l$7zNxMJ+r z;g~L~ic>(7x4wo0z(#z2wZpwryKhM=I0xPgDdyjdJvBMi5-;*zE=ysU+p;u!Btj15@zOFxE=R`|{ zCHpW2419?!eDcPCMNb9?aiYjFigct{@fE<5Vj(BdIf%@Ma-R(ySwyAZVJ8qs1dP^8 zO7uUXQR7%wk`U{tWp-o}UR4gJXb7XL{;6ZY+(F8RoIiZ>WJwO90~)HJs#n`A3d7#m z#rCn&QhqOtDA8tlDF(9A0y~7sU}^BqavhCQ zP3E=s;!05lOklB#x%*xplBRJ2hZX890_Gx#wNy9PFWM=-O6S^U{-V?9XXoyGl=*7D zE^#@C*hESAMsg6}|MjL?DQ#6}7fHz*y4YFM6p^Yd$;N!SC89J{VmT%Cs2c2-dO7)6 zWIYBj!lbR{2U9i6&e*o~LXhJsUII%ae(ST?ECD8Srl8^S67W*@4F>SR769{u{-dl{ zuLSW$ym&D|YJK6P_)<3S@v+W22Vb&ZC$bAGhja%;NP-#i{Ji+m8-EM1fi*~D=!*I3 zZuX6sa^)RG^b#zMqSWuO3|D)HI#^S9ofKZrC3=OlU&8Bo<5Lfe7}g^%sPCim9u!Gr zl-_&=!W~vIoS)BT!PZA^7r2%&}CAFlWFFd_AtHY5~Ry9d|%1`}Oc)MG;pQX}^>dCB6!) zLXCJ;hv*f?GAv=^tJ&#SochZKOd^*_-H@VJRv-SA*kJ>PxQ7}>0Wx&70bgpdS_CLF!R+T!yDx5=%`MNJ^g}1h_iQYz%{&l55+%J zkRH;3DKF#^zNH0o$m6fy-h6#z3vyoPq|zmF?+vM$>d>L18$gN!!Ag*W5?t08uSfxo z!pjXX*o8(A$frx83WMmQmaMp(Aj=z*Q=)R3weo;Xl+{go|r20 z#VLo@4gr(>VxsStYrtmbzD3vqa3Me+yxuX3qm-Opggx-FL3>|#y%t^@`cp_NHqRmz z1IE;a&hm}aMQT)}GCC)et8Q_QivlbEiY6J z+0tGg`+%3o<-_Si;ft0mfC;L`D@ywfBbK5{c!xnuR?7=7o!)>eFaPVqQj?BF1`+_=5DE;){S)AvuQXHhTKSh7jlOtXJGZ zSOqWeCBR<7e$j%_JN!h?5uE)M$HaiIp$j`MuELn-o3*@amq&aJ*@(ew(tbVqPqB@^ zQ!rpSUaXwMUVjk?%ZPxl`*n#g09J(AIi&rXTzd`CLbqQFUgx;j;II%9QGAr}WCJG4 zsc+%A3RLJU){zhDqP0o&26Il?BVW6F?qyc4Vc}IJ(5p~!N5txggKU3Qq~mH#UY4rv zU8(FLjRL}#gB#9pR5GvUpof5Us(he=lC*IFsT%<5y^PmdvBfZRHiY|QT^5eIp z3q2kcT+mPML=Xv>l)|s^tkFvKGUW;t>puauxqf7n)VR9)SQ8D3gq3rsWGO{B#-YQ> zhP|UwN-w_5Qw*4OZcD}Go`}L!h$5U=X)NRm)@ym*E7IX#-AA1ht)i^(!t#Y26{%z`rf>FV6s$QktBm0h1-KkkJi2+Ny~gMglFj|BqR7L*{NDWezQ;O1WH* z%|>TtzR*Sivv<~ai?5Fc>^*N%_>$^7#P~*An?!0)`NJa~Lpy<^Tc{ zb+h8?OTl^bg$MltckK;b;j0iE^_@>28;!=xO4P9Ca9tPiLj)h7&#q8xkw;@?xS+a) zEer%m_=v5#s4xU_gjIK>GQX90&PDhUl^Qf|mlmNEodbAxelN$2pW=_zrrD zZLc?Fyz08e6CI_kDZV(7KR5=AmMbz{|Gf!)07Hml-3}tyD!i=Dr!OJd*Bt>wnDL7I ze@zL(komHROE|K;>?)j{(1A}mgt$ZMa>GISy*%*&oK^S`xtT0!)6$S?eG^YfoS z&wP=+eCJ@kpc|LKt3veeZKE(=DnzeSifGB+QJ?U$;?0{k;Oot;H`v;%|Lu-oYfp7D z4Y9_eDRD$8VR^iCfCFM1`Y1?EA;u(*$Iq0cB&tMMw=R_Zsvrjg8u#zhh~Y}Y+u;!8 z7zH=L>P1hJu_3FKv%ZLz;KC?zwzweEWgA9^8FWFwg?#O%TN^w>Jgv^}a~-p{SYb%k zwp6+zIQ!)iTuJ1h;qP`PD|P|Ebcmi+1^>Cy(uM+I@eU)ez;HERZei1>t4|$~(qmUs z%6gG5)VUG?auXyN?SzX!a|^y?zZ#<)0j4j!6F3~qQBEyNqX5N)^;_@<;x=X5$=)z}oN^BG*%XhO<5b3v-lj!Z`QHX<4M0oc1;oyTX8?g3DYBIE&Pwepw zBd^pfLz}^nU9Q0JUtWEDS1UNOf3k;Tm?0OB zkw>UbT-jY-+}G*quwdc~y!?!|YRY~Qszyv~LCM;{SF84w@kPD_SZB`HecC&8U(pNj zRa%^PiO^0b?2aOV?jKiDX8?PM*(WAomJy{It7zaW9r)H9LEOL#6sbU8+_S2_N@97+VkZ<_<%|5>NFUS{EX&lUC9l3~N%Tt;!+_MOi`NBs~k+J^}K+G;P zzKcz;BbDys4_{K3&S`qCc0|lcum+6DQA6iz%h3|Li|qtTHUAfL=M!4jT19c2JX7mH zt72#a&T0sOLM#&KSa=W#X=$6mLud%aA{dZ@AYvgck-mx3qEMVUC6r|S4Ll9hht+mg($7^k$Xxeq|J?A?of9i|*W$$l)d+)EKiP}uB){(Wfd9pli z5F)~4GgN$4Y80NyesMoAh38pZ>DHw54V{W#pTuy;lKOXmPVf8dO-PiK;bVFNRy!4$ zrzy|SRh8)qP;C~elvbLnm@dC-()In~i`}oQ0$uvM5usR=%RYS431I$#u>qd_ZuRJ;p@8Azv=^EuRgr`5Jrr6S$obu zTrgkmG3s1ji=?G`IR2mfjlIh~ii(|-u^&ZRd4>26Jf2{*TSmXONUzO22kN-jc zvOj|~07g{6NC0!w(9F0>wp}@M)eOQ}uQ6Xi*`X{1=nJs-Dnx(ci(KP`Y67-d(T$c( zSJI&#VS4uR<=ouM8OG%)5XKAB?i{ryU^tw?k$o)JTf?{-a+t4FeyRG4uk;vwt-#kd zTD8#?MEam-Urd_G1kB5m>UMbEeCaRg2(Rdt=5ozVg7O1%xMi9=9%9uCpH*&3&&GfU z1ilnyhi;V35?l*Ao?a=1esvz-LH!f&)WWnPBlx(Mq1nHlBkqwQ^L3U6ShZi%?%}v! z@1$2K$h=1@#4{g39g=r}^3aGaNgF)jRqkQ60hs@2VPnm0bw_;pI?6e$hh5Fw6!sTn zGUl5Wf{!$3hScAd=1Ymd%H1;@5C35Z3{0W_F;uN7)Uf^o{Nz%rffhY zYR`DVh&^~PGqbR0>&3Q!GGX)GBip25$UI1a5Om>-NA{?PhC!fPt_rKdWWOGeui4r6 zD2x6JUu?F%R|mpbAA+wz&xUkfTd-&M3oz2f({tceTAX3#0`ZEA*mi3i<;Y$SHQJ7U zII+u~=z3#>-h5R%dhDk{*|>;|Wa*B2BH|!l+Ab`3QF}P>+3JAUz;$+pR+TL<;hytl z!)nT>)pgP$yrA%*8#3W=zN%+ZTI`TI2H{If%Uoqvhaa+Z*8kZLAoBIzgy<_TYDnLf{rV7qHDR%2oxFkO05cHEZHU-a9Ma6`gPUN~1Sh^wbDfonn~0Xkuyo5`1x@l}*0F zBtFKObG$=#>ZPq>RZ93;FkjtDN)t16+E7HkB?HFE*LsHs@eE&2?zk@>09#ekuM+JG zFE=HDuB>8@>lIV%RME?R}u|%&AOKd9|19#FU%V2 zzdAeRHDBqyhEao|w0XjX3&xVZ!bpX$ViG5eqq>dn!S61y5R56l)ZF3wV!#~RAY54D zEUi{H>9zgVfhh}M$L?ctPQGe+S${HUz!o|2dQg0+2?wP(Mh6f5U;-~976T@{AVxRd zB7hhN5r7rh;>%ILt#Q%&hIrI_Vp4>>;M!_;)-BSS}(~wvk`~W=xc!)!MFD%gb44DGi+NgPQPHju3avg z+J^Bp!PgQ)W*flk0|NG3oGp&|QZB2#LN`LpZbf4euNW`_#<^GYy7^a{WxEfDqZ*S2 zOt=NG3Ua6wwv&?Cc^6Pc-buUo+H1?ymCHb>(>JQFYiGxgH$)k33NIEdbH;^Wpd3O? z$7sJ8y%1jbGA>0EFD^Gjo7}pH5?|MZm$#3fzlzmzIEbfvyYkT0Ys&_VcSV;0^O`aa zMmcz;{Zh}5G>#%iVT$6SGr>dH5dWiAHZDSKk${t<@Et8AZ9%L)BM+l#zAoTkLRWUJ zPvj$UM(0prECWWq=H4H^zVO9sl7kzot7X2(mskQ?rG4;L(zDH#a*339=={UybP#u- znwx>I)Gw>Fa#fgFZV-?)=441&l^pf<4q_T{fENKaR=VF1Fq$tdXx(wGWav`p*S+_^ zmu0>ZoM%TUsBSqq<5-2v-06XUL0rpn!|+wy;zsd#Uh7wMqbyx)*Cw}9Im5;QqD**Y zGnp%^itZbuLVV+chxfo4 z0ILLY#y;FXD(%@=5pT-Em)``8C(8ju9>MDk5yb0T%ZzXcus!$+<09lvs`vjL?2JMo zB7TdJef72Br$EZicH$upd65wlHg*>19d>eW_iJOLfSnTOpdza9(#ltb>Ajo`u)**~ zJ!)-k;^z&TE}!8AgDY2R)PH2u5c1lMi|6=zNP=v@(!m#x8?eb%0A5ROakV*}qlU(Z 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 z zCQ`7Bb9nQI^!yS`Cy6zlz^>D>W?1w@hx|1^-g#8@{r?^ioYp92ZDsdi;|e+S4IRNF zao!*+e83$YL61}hGctZd8=tZx3xUKl#61Te&nQNCq%NQTs9=o`)J?3OzF~JiB6o(7 zbA2qe{9uPS>JY0MNEgcyzvrQG!`|1?3y4r6Dw_)CsN;+8OW7BYscrA&b z5GPE_(-m;)NSdUZ{v6sM#REM8P~}I_$Q&iaRoq>O2lkMg4{jEc=3l3+P~7YGxtnDW zvi1P>e(7}x?LIq-DdaCCA>l{Y;P0PfcyI(y0UM0x<@l6qwQOn5o)rJ2aeaT%p2{+f7e9pcX;O91mC}sRhs-&@&!hQy>(uT7R+|- zkb{U=rM+c=f~YXGz)yYJHeB6(pGOAJH1F8-e^rs3cGqQV+`zB{Kgd+zIKc|(7iZf! z=wbIsC#V^5o{5gZx7g?3IgLK^=MOa!ndnj2gpJng&T^jf_7Omy?@Ufb2(rvEhaP@_7mtL^N4=rjxcbp(on<TJx4E2JUwn7 zCA~YU_gCIQvmMW$@c57q66l_jy25pue_q{Y&Pt<3z)K(5@fted&7NazLV2qsB>jFb=>olrUp@dV$y$7 z)oVP52xmhxSspIgUqSk`KxCTeki2=koY*kue`(?UNp$S@ue&=_5o3!X1|cPive@;Q zlJ;i8hjq?TP>kX$kK62+rl@JtW|1iq0D(b#Ih0c|`}q96Em6^Umh9OByIF@9GX1}X zn_c2va~MmiOhy`lbXzfj=z~cvq^iKTgV3qp z!5c}l^&aqfsbx~X4MQ;BK=-@X)?S(*p(7&E&xMHR-h8+n!OVqV}n_l}0xQfKtrl!*;JlXh!0!cl4Sf-yS5&_6(kWApF&|Q++=k zuy?`9Tu-HxB~eTrgsQWJpf@A8q#);|)@dswH-b3d%zur>dCilG_Jz%hG5iF54E$>N zc?u#x;baQzijNhglVlKOF8e_3Plq--I014CsWC#IEUid%<#L}TV;u=y8!VVlgAMxa zh8*&?QTP({MC42GnnSZ?h>Pd!bT@}WaO!JQeRl2KlKBb^D=Uf(aKA!>;tpK$Q+In| zlay3T)OJ$9_PWQ7h?2nC`nY=7?WRWX?fG~NxAcu=oB7FIw9NaCP0xWdd75hP5qo{} zku&dRpp16;^>A^h;FaWp|C^SGMWf?q?z$DJfA#Nq&vq(y!`<&Y<|yBNMaWR12$MUC zX2)xZ)3BJgtV((nVi8QAvbGwn@`XT`Ed`ur*#QZ+WSS@m{wLEZ=SJ-EbpG?)OyW9*;iY zd6V~+aIx(;=x(B^Ir^O+74hdP_wwZ-a4m>YHS}d=7Bn4Ujf2AaQHksR5&wzKe`J`@TH=7c7JKxZSa@D53TF%DXpyQ-#N<;B=$GKDic? ztvo<7hZAMHN_xus5cS7wc3f;6&=mqU647lu^@1X~j-wS_Rd#j0evlA$Q)WXEzgR1Z z%yRcY;^PiZ8o#L1BgcwV++OJ@>wW0R=s-r#%9&bNpY6$$6UD2fr*ev~lBEz_E&@fgpAomeAv$=12k?39E+44W) zRRM+$N|gP*JKJVW0_0_F zoFAtEtmNZYA2Q5+_}Z)Jh0ghyrJcbdkqnf@aW1A|h@I&zl32?gTh$zSok)paeM18* zJ_U{eaP+15I$Qs}Wo~N;=2F-&&m0}jYvf6HllifN8*LduC#Pg-L{+jrV1Ew`t=qEJ zuUJbN98g!jK8OqC5`2P?(=NcRn&C27^8wBsxcfpQBKm?RMO_;IO_We1MM)yF2t*~a zt%4t4vgjFR3Qd)s(>jbN0w=yj1yR-0SB0)og3-SkJcH=Nz_FlMUhPtoTlbq#-rV%I z+^{KK&jo*lrw?v{dBM##H0I@wNsavp2Y&uZJ$*EZ=x*H_PgOT>uO-`3 z`gJ)&P*w!iXVudXcYcU4#e;~d9x@-!QJ==>vGl zof+9jI;#2tBh>%SjT6fKl5)KsM~y?)`e9{nKb;Id>vTS~{q5kQ-Fd(s!g+^A?XvWM zhO=W?ps&TrMNsNMM_pq?iC^!#G>78dwW%7H_OU3^VpZCJWV{~MGTu+q`k=d0!wp5W z=Q)rvF`gu&tLQGUzWEdSWguzb#KMaoi9F2Z6YsM^gc)LKYaHTSu#RlsZNA48n)Lzl zz3so3PcgiyUBGR4m;G#cw^ZjOX?OQMSHfxdGIftOKYmbpGulOorc)|xn@Zzg$ZF(o z+F0l7S0i^qYG@ttaH7jaA8dl!tvm$q>|3wWR(C~fA&~InzY+NAQJ3)yd;8%tRgs50 z@!N3nI>s>ak;yPpj_y5zqvGKR++H#oM+YIFjnJfXaNbXd5EO+1ZU^ZINhs**a6?d2 zp{z5dc0Gck+9HE@fy$|&ZnfLK4dko=wBgu2&T#ARv84ndyKJ)9p)%o*ZPF}P~T|D=#0(hm8{ z2DNXH78L!_`Z4XMm5t!ycqqXoMDw+(f+Eh-(!`_Y*yun=r7~M-=HDFBjWSLNA# zJlaVlg*}7bMP@Zrw5ss5k~^*LJ_ae)4&9x<?1DuDm-^K_%D&Kn}s4+jr-(Yx3r^8EAc0Kt%o_^&f(dv*k?n{&K!9GqxaN=g_Z z6w`81>RTepKeL}}0d`QMkv>2$NK`5xki_K8{ofZNv-yvvr;fdgMLkacbqlU4X@z}l zet6wWyS5@1IQigaH~Hgkz$~a@!o#5?H|ocHFXsLmH)^_g5@;h1EdRN`#vcyS ziuf?y?yM$wTlGs;jmFk6-?y2xzS>bhlrVTc0HYRNQTro+j^1yNEC1-9SXwLmM}Ke_ z%E4)Eu};`mHuUq81GmEFe~vve?ylmztCjOD;vc{f*^LQDy}on^UZgO4?yJ*Jd#RPl z8*6)2rN!e7E~l;dMZrf>mH@-)Dpe5K@t}M{u(XiY0!|?wm;D&TW@MPpqaS8D%q~1M ziR5aw4tg&3t78fEF$f7iwr6Ty(~Ge4m%G^Mv`c_(X9|;g7ID74l)UYa0tv6XcVa)} zZN(`tTf1M^QoT!ORJh@xWDuIB$Gpw=d{0u&nJ+aW0tO*5u3qRmB22opb-S7=@MO>^(7|Eo!g@}G<3oPp$Z9Y5ol z;YqUCY4I`XI{)!&o0VRk{20r1Bi)0b@iWv0(ZElK*kaK}vRtQQ_b_rP!Vr+ms^o+e zS9bS&*77K~XT-Glb=0}+>}Drc#CP^;Uj6%<{g8ld?eWD^UHobmf_)vbb~lL{ss>62 ze|B^_1nMdb?J)i7LpRG5M}@q8vzn9uAgQGhENJR)ky_28t9YwdNPrKpX?N5JnO<30;_?-W zC;~6m1x0a>p6$w+BykmDPu2R^gy@N-$1Z2mz>Ca#wzjOED3j-z{zMNR&VH1XDIW<| z72g->eK-8@SIjy2P0*JjVczD-^Ob}>=($}208tOT6DK29WT+Tlm+G5NH8P^B(pTuc}qR zQx5TlX5)5(C)vAW;faYSJe2S+G>-+I#3zrw<%ewZ#xr267{Wppj}V=XYo@zO-j@^M zOE4MJ+?Cq*A&Hv zJGWhnWExVev4d}87Ke0uyVyP|J^9G`LH?z*Y0Jm4$}QxJi!Dv^t$X*vd|v&1HM5!l zsF{tGsnANcCsQ<7;#@s{cWoR*qQ{(>t@#s4D6SCzW(M8pRdDAiU-OMY+7sAxovFjjm;4cSZ&07<^BSp<3-9arLK~rt({BsDNRMIcG-Oev!^nPM@ z%kd|Bu@+qTK<)6q+!T?l!nb2CMjF3#8JS+Do*1Z0?F|Z^u^wp&rDq!GS5PDzSYpDQ z+4m;sl8SUAPL>jLxmPd8@-7ug_Y6USPA@8MQ)&kkHvS( z=2}Sm_|@(S$Xsb?O`FUnrT>MaaQ*SuL>c~ ztd@O4JuCZ#$+dUmry`!=T3k-YzY6b-TYo@rpr!Gbulos6e!25R(7Atvk+3zR1@Rs? zy!O`&#fsC zA;Qr?dcK(#J2euYwy^2n=37TH*M;@p)b%2fgmoYkgII12KiQ4nd?WJsgUt-Ti%X7N zZcgadMbedte5&nzR;a{gxW7KkZ|r`wUsq>0{4>+QCIv(n@PXED7 zzU6H--r$!bxgwZbji{&R4@5UVtB^f+^|ULHz(GFkqYsSXFb&L&co|IvsVA^D;Unjr zv;=0(T;~hu8-B~Neqk9d8jaPWmz?t88Cv&Kgeg{}pl*5mN;2Ih@^P12`L?vl$pG`E zF7lWf^22nm$puaQs4GoR;8s4Yl(ATb;dZLew;L3}wqHVzth9RL<0MW6SfyfQrVvgG<9dBoKA3;*Hsf=s0N&G zau=d!?rB7W7&5LEcBrleLb4-tZ&PEgSsT#1ZVf<3-K)Cu?glbzIum(FmhR7>$7On~J8f|4`|1U*DV?%q#7>c>Ut{3(QZwX^M6QG8 z4YNlzx=5&`JGtzlyBC!cQ8~|1(CyUsYhP}Gk6L%@X;bwc53pv(Y#Wryv=SRO06Eh_ z31Zbk53WX`G&HuVAh@rSlS88^a(xfGx*NECk+IN%h|I$}5=wOm+rbZ`zz?5E9a)-P zjG(qYzv~{!4dWeOHiH#23%w#x!e}8Aa#nCdAf5Vet0L@4^M>SF-(cHW!s;a@B!K{n z77yoiS4j}=?$Ln{<4c!5uHq@aOMMG1xI80k)!8xy{I&3HjGK7 zYY@6QRrZSmeR0=;*Cd`?DA^<2qsfj-+Tq&iAc4%vxm9$(X;a)w6Od(IwkY3+W7Y9Wez(eCC4TRl%t=QAJ22)8F3kdNyxP%CM~rHM(j?B368*oBhcB(yPPvPR{`;;;Vh zF7$S0h6q-(eC`D-6o`~2aq+kFCKc0h+QILIOSol6h(~jxhPEf^>hPF#mX%SWHOwer zc-ZO^K1B8a^4|On+LNf<-1`vmv=2%1?a?4AS)dTH!cI6bfg$SM2=~)U_kBjt`dAW> z2Nag`bNnwPy4f9yLnzNs{h(CxdHJ5rve+`NvvqcWgLwFL&au208*)My_A)j9BdaC% z2zP@c#Dm`2c2c40e2YIAW72q@oeogph3T@lKlQyeBEv0KzP;AS3?-`L7i^BhDPI|f zBp?=Ge<0;1uo7mSUni$j_fY*XP58Mg?8XPzw^G;q13(=ivMTM8AAdif0n(Q}?oWGQ@DtYjkeD9=C!-G2V(S(S>wM@$)kjt7` zI6^O^EP64;f`o3;(n|jleojKTP1sc=`{xqa0XJ>BpL_EoE!$ChyFAwy}CS#UCGsGTx78*rxW=& z$THh^v5<%Wghg*Pl+v<5Y-Ja8NSmJ)+*xl4Uv)sF$SDVGqbLDxC|WhUBXEsf|>PBe8SmybHJ{a0nkW)NNeL zx<*ELC0g{zl0E~3j%$qM?N84wJ+#mHl#EW>neC^Iq_aqUyG3hzVx~**-6=Tq+ml`fAdpMlgsNeCpjuQ&ke^qj=CZnS!o=L)_%O3IzgCwNvzBpiy8N^j_}}Y$B3gHu~ZjBCN^d>v!0yqbiXwOSQ8W!CeCFEGO8M0L(GI+UUR>Ui%$^{%?&#j zNZXnM#b2{^>-?e}0TH-^kPH07C3*nO`iR5t2Ujy%OPnxXjht%mr@$y1vaf- z#M=A?^b&uyBQX>7hkk?h*6ENOlKG5H_&}s{>JKd!@^`RUeb~g?hyvNGG|gh1Q;BR5 zGEJ5mm1xcSePpwtG597G0L$tBoe zoy^EWH!L~Ih}7np{KL+L7BEsr7;1A@skmN^LnPDi^#gk5-o_)y-zY<}CJM(L1!phv z+F4AzoL*E~Ll75`SeZFqq*W6>3u9!(8o@dqYX}e$-OMoDT_l(Ys_pmfGU(6GhbWsS zMq;{uJ9ioQ=+(G{G7HV_NmODF`aN5qLqmUPRYb>u8SAbql^&&pX^L;ikGDw->OVqt zII4bv-iQZl!(ymOWIudV;<=-h^XYJ4xIG{4mqE6Q8(M|hQ->_zf+Cyzm6lfGuDjtR z$%D$`zWlS#j&iG)$BdqLmqaO|h1q6a#JetZ7h=*u|Q z+MvC(9n|98CvvDUqb6-_c9Fyfa^(2^A|BrKPy-G&s+^IA% z0#IxhC75c&8Kega$1ox2IZfzY6r1abp??S;kIUKqr5aS=)v7ds*QSaS^*KTLm(@{S zT&t9Jc0t4nqn$>%Dp8+*d)`j=RCzWX2VIcB98{jX>Iw3amF<1T*v#ZS*L62?;Y1e?~x~URAfg|PCj2A2@Aab%qmm~Sr6hI9Z zuw)aBXvZzLg|F$f?rp--6{Q=7BF z4&iAu*Hw@wpe7Z!If%Y*5hZB^lFALJ(a7qB3c2%t$%~o@q(>uZtcvozp>J>qaScFG zT?M*=J{>YKII&t7v@RAs$y0N@k*546F)1w`$AB`r`bKAuLStNUCnY55+WfLIe4bB= z4*I71K8eB>6(N$RQaHNo&6U4ZSt*Fhl%l> zdi#ehik=?TXa6qBey*myAO3ziU5KeNGFr5D@>ma~$62;oa&#=U%Ifbd5B~WB?pwh9 zJ#VkVWB(I2$`r~zm;Pspjg|i)F;2+p`tN}lcSX2uPSmw>kfSzh+R=vOVMl$`AE>8< zHyqB%>aW^al~ivh;wNe9%14xlX5ww;i1VaJh(|(#$Z)}p%fCBc6&}F4PTY?&W8=~( z`QG1}ALWW$OG(M?JXWOob_fmT<+o7|Y~Uq32{gW(9y#?eP<3rrmo{3x81eh6&0HDJ6OB-f=4#fE zZWh8$Q!bwE5cc8oET--oHq^d%I;vJEmV#Ckl4sRme_6oSHfFSvvt!ziO;KaM<*|I;x&<77t~rLiRu71!;^Evey!t%yj?pA2!T< zd_U6ll((O<^T5(!y5)R+W%z~8pW}=W(3%3#(FG>l@L_t)OBN1f15J59-|`L{hRT*f zkR-pC=DszTyiY9r!BrZ4&B6MX8Z2}ktf}L9WwRq#nx2_vn3f_gIfK&F#vy{!>YXPq zA3okmkRg9CRo=XQX7=x#vXXJG^H-5<6sbjNte})>;Txc6sTn;vFp9N!{M|5M!1`po zmsR$t5e*ve%vOJd7fM(&R(SkbwTNZw(RE316nFQM>30s47)od{Tn$o@qAoGYBXzMr zAtj!ikZ;w=@Nc>0AJT~jE|IG1^NS-_2{pEj;O5)+$4@Ls#ORJ$vc=@?kfR+W3|$6N zDgXPXQ^9u-q#MnLO&eS2^m2SrZW)ed^G*_RB*1}eY(<23s5CCPwM2W)287bJQlz3s z545_58D5u0+y18IxIN?)REX$5e9Na62NvSQ4 zsUJO@BzMEJG}Ph01ymiZvR-mWS0E-z;3dMsuHCD=7d=&873cFxqXuZXhw_LN5=+TF zvpk7$MMR@m7Ja6F21^B~Ir09d-n<26%3yq6ZQx4o7R85IcsV#Z^ZS^F7olM(l$C## zVS-McfXG6`Hp`LWPLM%Z*_~|4WDDwhJwf4L0r}fTT6+gKi{Z6W2=AKrDD~N_J+DWlE0E9PsF8GODd%aNWWgJ&Yo+9hpe^5^4?(i_j|?OJe=)B?(AvjNO%)D z54!sA2okKue{NnQwMq3!^Sq%I*oOlknq2!QS!-k)(;);0`=0FqH|0QNEpwdYU}?l( zOGGF(X9ul($NQc9|Hq70c$;+qetQsbTS8d9kJKD50dZ`~7O zYrnFLJPNPAXli*hNj=+f20xi>H}^Ea>bGT*`R{Uu@W)Z{KyxPSt_mIHaCi0d;@cv; zR*G*lCLJO7m<(9<%7kd47x}S*c z$5z_fwa4c=f?wII-P^d;{upAa{XVdgzf6PWI)?jjpP*Gp6pma`=^PL?Qo@cgGGNkW zD`uFV!l%R-oAGj6%$Zd951qzm{`q2W2uvqcRfnb;r-{X4;kK9%vfL4XaZG z*~5+VA?AjwU(SA1_u;F%U6>^SWMcs((w-D|>gEH{Ah-8=kr&g!ikk23uNYaTw!1Utwt}!gYpYH3)6Q9B} zwm(JqezyA1_Rkx}Z)K$)Bq5g7=ZR!_rMk|a4s}a?l|Z%9aUu2$+law-?1H~pUZ`8g zOKQx~ZcJj0)=z5xJ!(fbH0k}I#|3StbhKdh2{ibGU`KnZGjpO(QWE942K_z`WJ~N| zT_#brWsSygR?WCdQgDqJu zUL_kMV?Uxd(GobQo>h{v(B^43hBr#Ra7ss%f&*(8mK--7Y{mzC*MJe_&=jvJ9<@kf zthtT;LNEC$q50;$HD^eItZBEcP_?kC$D6fXQdh~qE=<~;VNZy+3(4NpNjL;$oeN`s zFYszHK;TR(u<)q~$?eZONM@Z_gKvs8O;#0%V4-)N42RW=bnqQsI{=+YF`E=h3RuHOG;7D7qhXZcHMO=%U%`pB$9QRVC88PSZN}IPn>U=tL@Tzet`9?d-S?`ByKd zW(0|0SV=9mq|hrdb33yN1Y0tGuv};CO6Ohva%pSYhAEkIVr1 z$=c#9bNzWg!DVP-iRZUSp32m`IdQBl^lxhDgh0Y1?dJwBI)PgUx*56qhi`G(wlCAE z>E}y>=USd!@uI-u-7L!=?XujBV-Yz!sHmHxfBO)L*Z88Fz=RFqSnh7)cyigU_4Igi z5QTenSoeBsVkJc~F!jfCmF9WeiK9e=19bnSH>2h!NHXY#^DQEPlk=5wYe{3sc*m(S zl6fTg#U0${A+P2eNWe9H$Zy3+>(D-?=1Qv4RNuytJUNL(S88O_@$}RMfbU~ybaG5e z-FO$staOpWAVl|Bo=5T_f?E|J4Md`q`(n-56eRQT6d;Mku&WMd^uA)1R%O1U71SF|p4-l- z2s5!8z=pDzn)gQ|KejbGdhR&vkefx7FDVG&F7EJHx2rU$CbD){ii<%A{J&L)@h<-| zpuXgQ2eS1*q}%VB|DO6*Yfh?&|3ke*6`2GA??N>;y~?Fs$Zy*JM0;pVAR5R~wBqUV zH}L&GN~hH-^Kg|D<06Y}m;sp?_OTrMKdn{cefEM@IjiHRA?*z{Q7MRZqP!h5uDhkh zUZELnA@?Dy$Y-ysdQoJ8Ff4&tG7BFQLVBZH$$`WhmAqKVvFZ4xh^9Cf8pTuKZe74) z3Bjd7Qg?6yUr8XSlf7!MFr7Y%kQWWQ+C$jKqwrV$(Bj}x5a)d;pYFS<=@Z#hepLtI zXAJ?m=j1JVayJT=2=U;+8v^*LN5=vaBG{hVuPlWa+sNe~y=h7OCil1S0&r-GF2$vM z^hgA`%qT%3?*11vPJQ%GcjrqNJ(cI6=!g`fR9*3K`b2L84DL1ZS!pqD)E zr*JV#aLwjW)kR%r;z~~LF91yEb226y8s6bb#P^6_ND4AIqqxZ^cgyNnhCO0Tml@x9 z;K~Q9({cF5%G zn;~McA=vvHX=3W8?Hrefzdt^xilDOTm$X-jB2{_9=HUKfzmSlzJO?5DPyLAb7nh4wJa=5k|-4_NlMbOo`0qrMM8F!aCR}3#h0t$J%KD zqsO$1!>U0~kVMv$N>0`(vWJpg{)g~CZY5QpV$JqlWee&i4I@9`K89)q@oe|Y+o%56 zg-Bj};Gty&`ypOd`pV3)DRyd?EujIdb<4k(!?h`Gv@ps~5gG?&8;u#SW$BCsxZtl# zn9AYdrrDdLn1^Nwn<@Oon@B=yJ@!S?$jbgwb%P>8b>JoACYaowiq#_jy4Ax0*TMr~VjaM<}D*}hK(L%{N7FUcT%j3-Z#lzKHlZJ4ed`ZC4 z9n!q;I&w&3I^#M-Fg+<0d4>79FV?a`?!;R5@%iDlF6e(0o%LUnUmu5Qq`MoXV>E(* z(nyHp=n;aXl3!|ccQZnyJ4Q$fV{~^TlG30w8~N<{2lm5x?LOze-{8>o?iNjAY&&Crzvnv-6oUf{&npMhv*%SfmDHgHL@uG+@QFBSN$3jz?6ky z8BeTTYc8vIgAKA@s>T7S|Enb{>OE!S0hcaMd?6y+aX=|u|Ldo@FT-Q~j%tDHz3v4H z7V-shbdYNMDV>6-Nupm2HLP0V;S=6$TXYrZe99vSGHLa9`+@D|=$!Sx$z z2lmFk`ahzM#XM{wM#3H58j*YYr-(3vQ2qb*LxJaB`x!{RdHQdaL~wU}BN8G>45PUP zMm6~X$RWE2-2K^T_x0}k%!lR>+PoKOtL5~7gKYn|GEU=k_nK?}{n6=Mc0~>!CQeKZ zo2Zr2n1(@d2s=u)kMD?1Vhgvpkm>;@rQ7rj;+W8b2Q)%-h1|0=5HLni_RHIp%+dL~5p|PE7W7vb`@Bv;I3%P_DEQ6md`_-rD}30(6C**5yS# zXVsyuB5BF8O8Hmkmd?7*G*d=yY(KV$JN&Y2z=Gee?uGb4*>XXy4Lv+SY3zm-B=|3^Vfx%{m^P zT`2|y3&*DOrhB<<`L+UkFNp-^cM~||ip^KT1smPZa=})_oBj+IH_Tf#;Uv-3F4vW# z6!_G48(B+hWP-Wes`Cpt_E(v~xpHF~6W`?>CtSil_s4(2&w2>D#-6Bpd#mWzTYSL{ z*8gs|;wXucz#ZHEZ4lT|{E9&*H1fyn_UuKB$=_c1x25A83I4r0D$p&TtC6xliZ*eg zAuj1E)P}lejkq~Ay%4rsf9KGuyS4rzm0Vskf(Hxq>u%|?pGIo%%vS5bj}|r`1w|1! zbhO$-feIHUpUPT;gxwmkvumHXK@X$--S9E9b{ebD>T`Uv%?N#M-e3cKT%5(=nEGvk zj&PtEKlt~<1j*l^7^O%+2n6*}MZE}FD0Bx@+o0Q8lH*9|?ObQDzPxrL6s`{eR_^QS zzQjv>Il2Kx-cpB!b5;~KYC?iukuaoBoHgQ?(xC)d9%ssu9E8d0l}W!vK%dlXv3PK+ zWqFsF#9OUt()yyTs*&{GS1$u!m~)(a{W+LvaxyjT-*Y-rP7ZWBzCl)F zNxHx5Yxnq8Q{H$9T^%A8Hu}~26?9n|s?%3@fItUJIaf$JH^?CQ994BV-MF5-&|!AL zzHzY>ueU*-hO%`YviMeufNx6#+TAbA-(MsLJbpVN3hrsIk_wP}^2%MjDFuFqi0iMJ zE#ijg2QUaRAq!4SETvHw8UPwHyG^@ai^8N=+q>$?!rC^ zZF=B~_(8QUWYr{Ggy%GhVe~z8?CQj@TSSt{H6Np_NbK^XmNlbTHb!F?6cH_Y-mSAtk9E=xNRg?2B|4Ns~u!CZWV48{T;pN`U?f;GrpOG&{?W) z!WvScW++@M=TcIH4b^-JX0ix8tz(76gVLwxgmAw1)oli_5b_P`(b!txCRiv(zMSC3z7F&+9&GH%{~A2MZov&Ltt z-@i1)5(^mD(DFehcmJ^#>zh7Inx{_6=$YqfCq8jCi0?10#{@o&Y z493gyD7G*J%bqLI{vrg$<@~v$uZ8HCpdqKq%;c*(|0=@aY&Bw*b3In|bi{U|PN@Gs zo3=|u*x8ODq46mY6Y4NO4K3E<0l(J*ZeMzYCmcj(6`j+83$4fZ_8@O-6|S&I%R3}> z)Y*IkviZV=kvS!9(Pb51`hZ8jzR7~KSc}!am~E3tf@^yxo{F`}v))F*@!(>Y7}8S9 zU-FAuhqmO0#C!GP@@;W&jQ^ONw+Vn~#%a=&AO*Mpyx7G)8hjA9Ht|9n03PeH8=G=o z__W2Z>z0&+#s~X2VfOV`kIA5hx9Ia-A|8PyTp3L`RDgsmW0SA5!bPw7b(VX`GD`#v z`d!CxlTs$2EdHvZJPxYbD)t%+@Z&aS0@6kJhC(d~mw!}{%9AVDSd?IlgABH2x-(zU zgW}oiYpG_*;*NRDMfrK!yE$nc#)5XgOBwCOdo8#yOG`s72I6teYhywtZiGHZ)518L znmUUT|Kx`D0rYCfqb93bAvMmUcaZ&wu9Be{hFy(EyZxM9f! zeMCEn>GHq*a`M|}+mJYPb5qA8thDsw4I+LeDf zH4U6QMt3j{*?w7~^7Nq3(E7FD{moW9VBP&+tS;Z!=OqKO++jq-62x$664c|INHz|y zzxnqz+>M8v1Vl?~UGl=_eTH;){KoHfmFxsabRB!_05wRz#AS*m2y^~Spi-CNbc^o< zw1u}=;8k68x1)b=x3Zipn%3zG0M6_tHb{oE4LFocZJv z5~g=Q%9zL9TC^I~|MTsby(jPVxuL8fo%_|ZB=D#$V!1^SI?k}h^G2O{vEw}ZD>W%(Ca$t*WD1aZJE zKh!nNsx}LEqPD9as;fL6EOEiI0=<~DOD{jOoow~JWTyK-smcd0;e9Di{7%&~ajXwQ z%Z~I>t~+6Yf;LEZ-PP)H|Zfb+{@8BXKCm2s6L|t(_oGlg1$=cS=(K2!2%M zVFK@koX>MON*NA%3Mvl z%j1h@g=vb7(OrK`fH+zj`M>GOF|@(Er7w1tsJ%NL{Zfu{z>k(;8?Wtg7o{#yA|Z*Zy^H402AT(rp`GU^J>i4AH#I!Xzrrkp(8vG9 zFA?Ot#p_hy@;Mi_{9*L*r3BuThlAIrVn`LIDDSD%9-EJ`or8MT2Bo=My;;;zLsSA- zL`(Gd;>eUP>C`c$s~`=1MZhat34eQFLe!a zZj*(=OBb71QpzpJH7rG8cR6ByQby-qh`)D8gUA>k99Oo~zfk5kzI#XHdNny;Qda!! zpVQ!2a@!gqN-?IPbT2x=7gB~m4wwHN;t$-fF2Sdtzy}W%&e}cQi83;#p6~HM2kQmr z3lWprZcTU=qjEB^&z0=a%!fT%y8fcpDh60OGfJkvO6UNX)VCLunk!de5ljkHhta{g z0tdJm5!-Zxb|MwV?>sJh$Mu}v3n9(kkCS*|?G`_ojNQfKzeO-G46i0@>ZDzyZehhN z{-QRIXjq`VF{=0f1;p|RsUjMydwt>id#F2fxsC3*n9Il5V=AnoK2uHQI5TLJDn@uQ zYb2$^M;pxZRc@A(3NaeT|5|lm&QO6tF(Sk1rcP~4`?qX&$Dq)8W$Y+)CeK7_OxS0< zO_zcp@7Ml08*LAR>>8CH@Yd&5R^#%Jw}8~wSRPur$dsN{ZbfadP2OEG&^sq6`bQYu z^U)(HmPEQj{++O1L+0NJ!!yU8r3{uH8UyiIT8D3)UR(C(JHaLci?@4_BBUSyrxNPuwF;0#6Nz(Dy zI1pSazBYujc!XTqbb86+sS_@+yh%BDqb_$H>{^CKefR;6TqqN>j=H1e?^7P~?ggq! zP$OeM%YFyYE!R4tsgTQpw?Hq_jp&KYhts@v-KISpLVzu0YPISo*Mjv18Q4aqfurEU zg=^Wbiy=IFaSOJY@Ed^z#I)tX7Z1 zcPwvWN}g^Ppmf@S3M+k@`?vN+4B*EjNeKM7OM0-UwCJz!M?#BDy92*8b?WRb0$Z77 zUd&4?UR-Xs9%H4|PR&q2{zCQ8`hy*HgXJ)|q0@{`=hYoG2!pUQof+H0Xm+`+h$&0_ zp10+yRKKYA7LJRu!V-|Vu|B(PPf!##=1daP7p*JiY?+Fb_$hOyAmPoPl1 zawC1g*+Nw#Y@I2881-3(>e|{pBfpy%DK3x;=p5h+`B}A;87HLp4+s<=keU<@n&j?vh6()k7Bs{l21&1ek}Cu4v3){Erqoz8%PZJNG_v9Th(G&wDmw0g=n=vulnXdd$^o{-S+RO&OG@Kb4e!)k>s2; zQ-4IBID$9$kA*3^=3WGxkD0o~Z&EzVQCkla(2Tm+{^*ELYuWShpbFP7i~JL9Za>-# zSXcq8KKE@fw7up`88)x_I?LkER31+HFc=^31Kq;xjzqS0u9VYnNP%1>7t;97hpDBE z8U_9Q&$fVb)pLgeE@C~exW=bfD-YaxMFh-;fF@iT#dI14CHn`}w=yx6>GeWC37 zV7X_wqo@r>d(qiqUrTWT2>4Kv3Jr_F8GX7oF~NzF0C*XeyTzx$%Rc8j321gwxxlG= zMgAReVO+1;wznGx^KU9|_~2E-=(*FSXw{Q#zIqD_sY+YFCD=Acq=d%D#{-U7u$wzO zmM9zeg)-J@tJjt1R=;sFCCal(e)qzz7{HDVlp+)WUr&G3uB|V7QIr%Lu)BW8f+NKs z$vbo3)k6R)ns+!>hjl$Igv*<~zyu(Q4pf*_#Snf1F$`QuPC3{-7=%n106`hu(uDZR z;(Lg$V|q-+WWaU1CA<|&6DM|Ea?LL!=X~n}YPz~s__1o#FeCWj#1~ck`shdhEwZZx6j)sPAs`ldzsQF^<{ucQsw7pXwrbRo${H5aUMQff@QP;9%nKOLoEE=-;s^a%FFB)OkK>0a`CE z5lh;_LMRLm1JAlea2JH@OBjv2ny^=6f}yj=cAyR`TriR`XX%M@g_7iFhR{Fx;>ztY^F0SEBF>~bOxo2Y!i7Kj&a1@B$j zN7Gx0yHq3*+V#k97QC@GBr?bay8I;F^R2-DMRUM!K+3e5X9lF>xOFs6W06tWs z|3n~uKPv7(4=W-%CbKT6PKqEQ^A-Zma}7f(Ve?!*p-`cINu0&^Q55&O1m;&=0A&;^ zl*kB(m$ikhL*Rqm5E{qtM?`9Kf@0b39a|tqPvTB^M92w*-h;IaGkj-~($h==j_|>G zkx+s2X7Cf@{fQH#2dy5T;V&`h=KzF4G8BT)l}lgGsX8l#Jaz5(-!LhkHN#{<-niyY zwxA2>3)dn9q_slnojB;a?DDl4GWnbhPj`Z5#6}p3{|wLk1pBxWK(kdJW*|cKB(6uD z$8n(`ZNU3EKWSKHNUCk?gYPvH(q7(p;C$mEEg$^c6Q)Wf-zmE32tRoE90ywvT41q2 zqz*C|M=3D60qU-nX|!C8Y$$*pRQ;6G|HQ0}vyyWKOMg3c29IF~CSR!E@-yi^WyDHk zgSRZL((aKt&aIsWLx*yCLp?{!SVf0nR}Zox_ia>+&fYCakdMt}hA082+X3B&1rbfuRuKtJ1%(4VG0|5o)C#dv zBHsD0kN;eUtGOd76Pn*Crhkp0pLljx7h*2pEh!L~gw5ED3i-QR0pC z^S}QJZVnN*T*c0e9;&Sh^C5uWtXtkiWLd_PWTue;$optK?d7B#|AQf8N)UC!FV(*7 zlZYY%C4GK2`Zb-+@)#$fDh*Dl!(=xAilY(WDRlsvaT1-Ge_Kp(|_z+43%1O(ZoF1oHnZHTu0m+ym2AiuG%@VF}w!unPeY~CR{@hoiT_4b4yT%vqz zM6rT%~$_%adT@A3};{^Qf+xzZKt%JrO@zgSR-p<-r$;Anzi$3R~QLjh49cAq6 z=9MvX{XTn7ehIOQ<{GO&x{TdYz@(Kne7nQ?Ot+7xyl==UI#W)$ZmC~&3eGx%Zfd{% zyoL@73#*G-?rj*jV8gsBIo@ER-l1{W7RJSk2~?jD-+=kFaB_lp=n%rD}_b?x)3;e zpR&ex%JXcJ669jMeXOJsdDS7UEb8OJQ;dll7gRWgW>Rm=cUSP~{zguyV7r>RxBp{Y zIg9{A-q)A^@aK}{zIO=+BqeAo9CvHWUV}1ji-QuFw1X2O`&>kSSM(9NWD3}M$hQjID5w1Y~_e9lU`y6AtLFs#;65!P zOh_=i>C{?nLs1lTs6oOr7()4D8m1l?Lr`rw~(>V`(@hcNr&XlL>^od0; zXousiG(vahTIfzA>JWq`%EL<12=kO|#(Yl-WGNgK?jR)i-c8A_MDD6YB-BDHh49(7&@$$oFBrfdciy9Umr$*-FGufU6qKA z1+VYz&5^#wE|xpB)E)Ho|GmN78(SZaGrq}>tfmjI#Qrv3Z4#sVE<4ETCJuuSCVo;a z|J8dJKy4aByA3Ls9|fiO%O#{B6toNrioGZsq9Qpqe#meRH|%p~fb(JfSem;jflfo5=Hrx&_pmcv6yf@d(Aw-m|}kRln1_%PgZCYXY9Y=wxOzqC09Y1HK=w) zuLUQVu~zikXKLn7cRbJ{!o_!yQm9_U{0Jkf6E*7+{CMQ8-6Y&D5qd~!RKd>6BDoXE zvS}4Tb9Nq+S|F5qV184NsA@!0rdjaQu3_@OT#|}?ajFo3U&JT8TZGFOINbH}l4qc0 z$cl)avH7eMON(lV#oey!w&k@-x2G2a?5{hlZ*}wd-9)!g{Yw(6Qb>?7jL0&oGiR;* zG#iki@a^ncikFod#IPY`fwqShpb#~%6g;LeW&2ee_g8WRI+x2fC}8708&_Ws-V5xF z>Trq z>!0!E?PJ4BuL+dI4$&CoLTTQwW-vL$0H6odWychHXBsXuofwn}ApA~weY=)vFmS1& z8WqN>N#AbrfYE8`F9o1db5`bS%e{YWSK{#sn+MIF+n>__qf>7JcHUJMeN!c729Ib| zuq@m}sEnqw6dselTG&h;tL~^snDVlRJ(XPQwZIw*H>=Q(gXAnF5JzEeZ7fO45Gp;x zvbD{&gFjZkVb}AA9Om@d^o)ULOxZNwBGrF8d@eh2IvY^AIp^9Qu--MqY_SIw^7$Bi zhLtGy_S4Y+LNKieS@Mr+A;k%^~yl_&j89&D&RKFpk^#>P5OOXS(35yXV zfLFMuHA9F0a!fu9MZ0%-3C)Q7Y?w@2yU!cj*u1`=y72SPzhA$Fc_$j(-KGA=t^w73 zy-rA`?HL(aBKhH)_c&%rqM}uAl99OsVrlj%3^(cT{%!u_`11hp%mlsOI{pl-)suW# z;#bY#X)so-E78^xP#OprCAfGMbT2je%r28M5clD`w!E5otr>cab%J_kYJn?;(f&gy zO(?*VsHLFViJdcAI zgT8Ov_VHyHR9Z}#YA!d;x5RyJQ_Ng9Qe6+TsdY__uuJdzD-;21q4mL5m;g2u{a!`P z>fvuXG#-1v_iWo%GqLq7LZvj|okAkPhk*9W|Fp6I69yVrMyv}yUQ&q-e{5lGGfdw& z!Yi;5NGO|&wC3YE zN7+sA!YsL`OeVnR;_G`EX$JK&!)LmfUzd%RGEJB;3>sC%?mH^9|Nd;QyoA0}oz{qj za&_BcYJ~m7sOD=Xg8NLz_>*S7BHjc2`Re0cikG_;VQt5~)Cjgu)r5Th>|R@#F&*Kp zjHaR}k8&O4h3FcC#9mHrJ&;sM9BTK|1RuuB{sIn0hNYqn8uYZFEw~~R5IOOcjOZg6 zS*_JSdb23+N6lP9ml9-d65p$7x+Ms$yY)`K5?)OSiuKK|Hq=`hili`c0yjMg()D zdU0=kyH)2AwMo!$Fz|&^E~=oPA)AM7pjnKZurR8pAOh&%$0<+sOy@-u!u-C>VjJ}~ z59!V3!+m$W0NvYsi&hNheyJp+NaD~aRLUynjLQ%=o;UZ42ZqRMETKgAZR_NO71%a9 zeNKTc1JT~t!c%|7guK^UF?uGq5I`=8zoDH7w|y%b01ZI`5wLyP4e*qIFHLaah{W$B z<+SN0{|IQ})C`KN6QbA6b<2A#<8U_XWFV(8hL_f`Ej#aGY>3rz7Oc;h>uvw_lW2GTN8Tvr|=K*@p1aB-X}b`>qHceEV%+&#cI;!m0Gx$PW% zd6D=R4}6PrfPGq+*1_yvz1wo%e7Ay86xmz^UpXshR8`S=A;J(VuvP#boD6VT_5W4ax{YKniuzMb*9aQ9iil-5&j)U#$JNB_*$b69GO z?^{k|^UW5^!zM1}sJYEWM6Li!?P|nNOPdjJgL!+ZM7@AjXb6+6k86HF+=0x$L=W3Q zj@HIXrj1KpwYkpmCc!Sl*D1hjmf(={9i}sE%N(#&FS>4oQN(M+JS!Q+y$%M`;8?Vj zCMe!l)z-*^{1Grt&vD=tib-VVj<7rvu?!$p;q$0>rJnFzqGdG_tCQcv`4VAOx`PGnfB2db8#e&0_H5d%}4%Dv4=oE)M%Tv zc2WhaHWSaWGrr5eZ{aP;+c}Dhq7T3FTA}Cjo;)X3=sGWQ6%3)&gK1@AyNx>_{ZUvt zW97<+Q9O_?@Z=Or2@Avr-KE;;nLD|&W&)xvqe+sgnHg~Ut%zBh`#;6~~?1&-NMDqe}lg0-mH0eOwdd!m?o$0zkEdiDzHG7^fbLdRIi% znaah1UBUwrZmN3s@6sxRkfjU0x-qSVgi7#5w5ywRoV&7b(InIxK}zi zW|4q7g8R;D;%PB@fwPpHLYYG2VQ}YB2lt(njPsL*jgWPk0{nj&1L6weJogV z4%H2aHi#x7_^uM5DzehfSx@(YX)sNU^OOU8_XNls2?KPXdmJb89eaRo$=~jA@IW`S zs93z0IEc(?^c63h##HyU3KTKRQqcGF12ZQ6zyb-Ivr|wCH4U%*Cv{@R4@iXp2v|LY zXc68Z&kq05t;?oFM>{G*2q&*1v6Lqq=+^%=m}KTNe6y#+ zYWg%#GFFKAkVOK*$G9HJ|LB#=$*ySB=7{NW*I8zTrlN-(b$F6xEn>q z8Ufg_AA|83PQ2R5Ra{J5bCB#{dy%Q(2Llx9{KGjFCIKkT7+4#S!sIoY zQ@va*I^o;hh;PdBRNo@7bda1QF=WZfXDAdIBA>N$p4iTXWt2pkQNX&R=*nPxp>RH( z_7E(ZfWSV*Do&uR*56?b3S@wx+EB_sOgmU8wa(qk_2%BttZjzcZ<_k938dD%uJBBx z_2XEx0u}K|kow%IyZzIG5jusF7OGf!H*R#!(F>2eenwW(_6MBNM`r%!H9M>A<-_b( zr2_OsH|UVzsy$gAw|KK0UG&pC_l$v#|~`YzQjMy z5<>j(76WQ7zA?VETGujXFV$aHJ`LU=8Md5i5z@|>n9x4ElLDca<==5woKp$n!#oXCbx(D)=*<+^ppQ8hERO3H<>)?cMYT&4l zSZ?lWD&M1Qq#IFCXhx7ZTD>V9p4?tCCFqF+R^W8Dkd-k``CxE5$!lHAz(f;S9!q$!-*v^L(FL!BG&#%{9 zP}0V_jj`)`Y~$cE0QG-ujGCug@G%Ae(K5gI(c8ykRZ*BoUToQYrm1J60v- z{jN>Nav_Gv7qT*H^ElR#;}JS$>5~*RR06&6fYQLz`~|gvo@@m!#0hJj|6G{=;X8WZ zcCkzhrK|n)ETV?)Eayj}H$z0r@XW(TaBYLT|21V>a^(g6GEMJaUC`x@%Y3l7MJ+P} zCqr!9b52`kjE(eIF>Z`ER@OsYc;66RmQ>F7YDoEZ+?mR`S78|lck-`Xi+_IYsD`mJ zuD1;P@8Okn&i`}QSo-VgVz(ti3#dbrIcdcQSc#Fbr0nmbMXjR~l<6bbFsU8b?SyFOR7b7a;UVw^28G>yMee(b=-8Ft+=z|=Ncd89p4sUad9@W<8aKZiy6$p2VBU8j8lL2m&FdgP_Dkrz2&PO(G> zr9|gAV{clgunLL4K&$%F*H?JAX~4At+-BJ06T*h>@d+-1-%miW^f>5cPCzmUGg6^V~l=gk3`0plaTxXEUQm-)bXyu8sb zdXtHGBg19Q7ldZ+J?25N4?Ma7cp zFu492zl4~zh)kUkeER51a?cA3Oh2d57q@uM1~j`^`WbklcGdaJpn<+mrhfQBN4hQV zs?m40+KONzZ|p8;zgaor5H9pQ!|7A90pbuJWnX_jFgEmTA;qsjbmmq1C)33vf6Td5 zK-!U~+Ou02U;a?+$XQ1Gf6b79-a~7;3L21$Uji?N(C>Wz??d;H40UvG668PlfFiB? zh{ZCByn0(-?(^-b$)kxs)MBU*vFiUU8ypNJ0dL|HV^U;{yrN=aWrt1PposMY18Ug- zn0pl&U7N*gk3f_ko^{UhLnB#N3{2BrsAnTY^0V z|gmD73+`7UMc{!rvV!F(`L?H7ApKEfFy{&D92yc>}2)#plK z(C-Rgb{yS)BD1(ESBr|3vnyg~<|y%o#a|x##H@@lJ>E&3*bgp`Ua&m-s0;KTJ)yW# z?Xj{1y{|G@FZFqP@vpv$hCy>r8o|$hfA@Xvyx+P1d3GImAwJ1=WRnHRB3C=p^+6}b z)0+-cv=u9(dM?Cow`VB$KG;3kYcT7lLv0z`62S5Go8=RM?Q=R2R5!(?w(=|#pe1?v z!g7K}`;XqN6vBTqZn7MagUKlGWXIRqsHW+o{9ExGx~a>6>ijg<_h=kN(RpwoI?&u> zpNiO!?T&>SwDDMXa{Tvl-+PNsPM;+etM=4Hw#sCmuY9itID-pKo~QRY{I4UXuN}XL zJ^r)d$I;?#kS>3X*!jZc2EhdNe8SB^PnJ~{f6YQ*v%c^4Jl=e``=!CWTV*6d6f|En zv^@d*3EUb;HJh<@OLzb@A*=otQuDLSz6BeC1CFkSHZ^P|Bhy<7-4=MZID#vBbr@t{ zeQ>Kfr^f_<6c>%%Yh?zUAs&v_F(J!uKJ-J>r}%shL?jtpU$xnxXwuzrA*F&t!&ymf zXWNwLUjHRPO*kaaU&Y^bTuR{!$qy)6M^Oov;%>(_t!enI)O}=O8%x^L_(;~D6cQt; zl)!+v`|I6})D)3Zcx z`L+u2&=;{u)Q15W8Wh9uFY`l_{QA3V>NbtR>&Qk@?nY;!=RYEGq8hB+mpAxM^8#2t z#J+H#I%df{0Guu1!w$^)Z7a-Y5$7-EzCE(Lbk>}Kdd}q+weBI2ri_$}h$}QrPxE&y zY9alCZ{JP@&4_?-0Ru}02ksAND~yq&9KbNFDX-h zW-y9oxecT8FhzXF29Cv%=>x0vnN<-~EUU^ds1t08s*y1unT7V13zO^bY1gqlz# z?+bkUXn|8d^lyh`iS*jv3Q(ZJiAW z?JJbOo+n67qUnZ4RSB!p2qU9KO8Z~ypW)aBBKa*;wj{br!mTWDT0$EeYu2AkV9{My z_!@My1yTwmmW$DBi$6qtem}uY*fyMdWIj*7F-*#Xf!o7I9p;;zPh;~GLfwhy#kVrT2!o0|`F7VHiU zLcm9+4fUuF2-{30`v6Uo*F$2BzOYr!QFYeCIHdXMT*s67zJmuQ*BZ6L?Wb0X)FU3` zo2pF4glf9xjegkAX5KNHH8)WBQ~2T4=D9`i%kTNhSz8))-bc;9`&#P|>fpWzQUa9M z4mXamI7%2JW{&_H8Uw(6{o!AC$(jv%=0k-qy{~zPFv1bDI-d6`{~`p9fxv&^ z7A7LqdvQ&BNAvQ3CeuiGQkWaR;i%xcSy@dLEexq{CE!mkMS}7XJ-0A-*MI9nM(re4 zo@6o8{u0^yQiAa6KhypuQY#ltk)Qu5s89kl%9Z}F*=HE2DMt}8!v`LmuSrLDv6&3c|j^VAP=(k^%-O}>P>!=LmP zydB|JJ4KAL>)583Fy$FwpW%C;L*nn=*9qJ&fiL|P?->GabKm-Vc`8Znd>J4iA<35^ z2C3!c7&!8octfT9vc?GQ?oKfyF~%#z%rU}#_Qv*Y))fC6hBO)P;!Yen0O-%5!gJFc zqSC|_KTkc<0<`cg_^QAb>8^2-wNbq7iM>EV!Lg&KGa9sNu|)MNaVy_oqaUB*8>cM? z|6CZJs(Kxw~1FAyzF!3bsjQ4Uk_HP$7~ zm_-M5zhTF{Z%4bIPP;!V)s90tcA}K;tLbE#-!T5WfL4n7XqH%fjs7Zt*lxxK=}5l$ zkEfPP;RY8rLvIphQ&xQmzK1nzlXfId&Dwwa$%>{O@pe-~#qP%pg*WL|9DiaI6+c!@ zAphANtFw;VH|;8Jz5QfyLsatOzYIKA?jbr&$H3zMAg{h#%K@TIE9(m8XG1tYmI4## zi`e{kl1nN(*yL&x6;1}Hdvk={GTrf>yrYBeV^u*2I_Aw% zIrbpFf|%y*<4Fs|T?!IkzCU;xznEvnI}eaGOZ1DT_K3yL3!{W6hL8JhARJ;7&B}T2 zXB>f*+yeh|5FMr52kydv;%0>Su)q#jeihY75lO zfG2!*#V!|`K*u-N{Vcvn)TF%RYMdQBG~$H@TP^oS^k9SenGY;Iae= z^qfQUIciA!7dFV!iyt&8gi_qAV`tG{5%Y{1{y1Itxm-_Zs^LY(BmBDY-=^3^V{;V8 z)UiyD^o`RnDPW}~8hx7(0fZA>xVNC`iBNqd1HEqvdj4rKwe;po4D^z%#sscRM_dpJ z=!p9M$?oPDv-K_OZDWvac5Gjy!cp;pir2?*Oc*zU8+P?J`({~Gxkp1}=iU@oer$b&B zhY&z_D{^~yIw|+VRez^h+>T<-sfa~!7;W$BXwPx>uKo7bWUZ;UH=<fh{u3NCpB3w9#mduh|!B$YuIRDI8l2(M>nHmEe(m!QX5i)7@a0eD7EN= znPqwp@`cuL8+W^aVkSM(RLV}8(vjNFKGv{a!w`v|z!p6x;g-UnVFaI5l6fSGw<7j* z&7i;-JMv})Sf=N*{QVmf2%?;WnB7(v)G&UIka-sd5OBPyI&cY&&~>T3?LYz`8__Z( zk=f!P*4-7`Thg)Fwj*gt9pK-ErZ1-`K2e-bb<6PZgXPi)wQR_QYRS*0pu#%tQoBVH z9OyUyDr1rcTlkMzW3>-Y5l&rTGia*eTN^b;-!^Q{f@i6};{-i{*hGJ^A6_|ncE-w~EdctA|b%s&~4 z5xEvXuO?&zq$+mK0p~_JNyD?c;xKg*^SyoFTn=zFC^~)-x|2q=h>+hHKi-^m^zQGP zAABn@^YcDR#$*)plZQAtFVFnI7S;Oni`+t-Uqj2~XcAOm`CMt<5yiEw;YP&sWB@^d zpA7ZU@3HRr1f4*97SK%JsE&q_ovA!p8RX@Th z=M)GYX{<4eg!0@98NJ6jIaW?pwI=^GLvB8Nb4?C|J!z4@w%_n$?Nm!KSy|d)ZnCG% z^tqbr%Frx6_VmGO_&&jtbN(B#r#rGYb@6i52Ga`cEPzq3SpmPpnyie9 z_}dQFXL}caP|J#e^cGQBk#2wk?fXfKcR{s-|u4!4ysVq}0a8`Gv(Ac!4v3DPq5LGHX?bqla(+h9Akfcp9r#*;Sa*Yx1$Svreo3)hizG z^%I3SX1)@83tt|SN9i`rc^soLI%mxnx9vd30p=s>cwxk)cIaC(EuIU$Cat=y3xzN6 z@(w0w>fbHrzoO>LM76z16JLv-;>_2)Vmj&5MSG3Fo_xrw29$spzPM(ShaWvG%Tkh9 zbp(^TK~(_qk7|fhyF+elGk5jKp}^As23~F}xDm<4oT+Q;a_vL6I6zSik8!jI8ffryJjRi1p6Hv4gMa0CadcaHOn!D6Zsd|K`PiNO6Zn40H z_wpb9DJRgwm;Q$UDrmYYqofUA=Qjjc8&@Z^KVn{?EGsaB z7bgQo^?+I5{N_&p?A6QS3&4a|Nqj|fKkDDMQJMJaOr^nMX&z;*P?~P~?tm{2Hrvz8 zSAKJ=eKnx1@#RG~Of0MJ#mc(GP8UR2DtKj8Wbg3tz~Ih*?#- zmOfw0R_OA7r6(<#ucM=*t*g&=$n_-zzHxh(!W%&ezIb?Y8R?!X+~~?dz|;eXVPzLR z@zp_kN9xs~6kmKB8yWH4+$A~c_3;hig~S+C#lJ$>27HxVFaWHGA^ObX%iG)A@~>?k zMc3xV?cZ%~?yYuLxs7{WE{47$zA8V8{m-}|@#Eo)29<#L)$SsSD1$W<7F+WSwHI9i z7Y}cHE~;p!$LQ6TW-I+dljT$F>($r4{%utec=h#PeeG-12m9{VUmgJ$fGIdH`7_X7 z)N1#drl8VTq#*hw!4ruusc)6q-0Ftgvlf%ux!>ug5f*_6FVMH(OyTaj{+_rrkB`c86Rmz+#Ed- zHrQ}9PhyRV)gy#4K$dhKl zEZd8ld)tQ*NaV`z-9O+&*OTbs3H)n=Pq^(14#b!33%)qm(8|0fec(3iz?T5qt8)3} zSjE>xE}TWbdCq(>z=JRM4{PtC6z~;h;cFzx2P~gv)tz}ZT6_Vm(&%~W!ZCZRH2~w4 zgc4OafCgvuWAXLP3UEBYyx@x^e<$H<)lZv(dtGa0cDflbn&RuQ`D!&^);eENKsuJM zB+bjlR^)V)exC8|4q}jqlCT^6X1=0cvUxmTV?dL#AQ!%nGU(5-az#N6^W{n$x)Z(x zSIK-4p@gp!#Si5$L-4dCxNKkC5nmliG;7{p1u@69S^9GwFf&&@m4EFK-Qe9@Y;p0G zikoBOT>*ftsRv)@MH(g+`x1b&{8CIw3@F($>(~W$MSVZ8*J+Cg0DG+V*pmxMQUV8zk%~W zd?tJRc2zk@vAN)Z94_w#V8vHM7-t!;ddSo?HF>eXrGHJiR>L#BWo5)AN}ywvc%^Ql z)~PV{^>2I;P0U!7lQVpoS-x9S%ZFUDuyX(2n>TjPZbs}{DVws5(UNtQ*x2;~;Xh*q zDSiiiNlO%|@~CnS9m)51=Z72|9PqtLjyjQlm3zs)j8_3>CquF?=^D`vm@3kQ8G3n{ zC_N75;06LVhgT}TL2~7G_}an0YLEEu1tDOf_^JwU6vJ4V#jD|K25imM^fn8!;7LJ` z@5RNqGGUo+))37~|4fRdsw2jPz zn7kaNJ+N%6YOZ|hsG^v%s$ssGaJ8%k%y_MG-~(7Rf;MsKIGXSK2w$D<)H7SnSLbL9 zmX0gk;g}`=`z;FJ60Ur@Jcm;>s0Bipu^wD_n$P_bFC2guwJW%)|K>yE~uL6vNyEW)_e4!8% zzFOgHDc-x_D_3n_Ykb{b=gYrywy(O^e7UFQ9-(Q@06qRl^QGcZ;DvrvSiPqtx*nRZ`}a9i{>Bf^Z{K_K-pai$iZ8O~ z3mY|nLvji|z}0cP`0@+%8^ae%zW@v=kE+&LGSvlj{G3dXo!Z|%C%#VRUjW9l9>NKU zFDZOo3ttkaOoCOS6!DIiWY0nvbcrxcFzeqD_(B?hebp643!R!_c4(spcJ;eJEYZ$Njp&KN=GWR3C zNU=latTUIUURv`t0cN}!pd1HZ3j>?(1l#T&PMY{ypJNtREz=NXrAcCZSv?}=q~<80 z!GP#DbfvfTRC=8wliB%>`Av&_V88D82605jrCMm288Gb!hJV462dm27D7>E4^~1ya zY)!PYxBDgwD>pUdQsRdGdEX<}w_AXfHdlL2!b%wy`<`Q7TvPn8)+h^~8#l7}>ogg{ zT+7JHzdRd_;A@ZM4MpcqnjfVgV*IN4x{9D6%fC37F8NpCRU3uz#J-BJ?fOrGvOR}4 zko;@o=BN;0$JgSNV&+p~IUGdj?Qfix@~m>auG(BVu;@g^AckN_0mb0O zM6@j|r#yP43V=DjQ8|eJ1T6!0UnU_Fm}<1am!or%nVBc4y4dHWnXm5pnNYW_#pSfk z5K<#;ma92lueXd9XcJ%gw7cX*uaR^DN4kTJm%e;|SuD!$C6%S6_6nnkuYq8cn9BH$ z5SAE6Ng?_V8mp8D`1y~@zKXB==1VUdFRp1Fy*PM5<{?Gry$?AoRc2I01HkK%EUW}z z+o#XUpty$sWp5t@xvVJtDNP|K!l5ns&W0~_5RuY-=~BAz;feg~vJyD*nEB#pzF3hW z#(-<|4`p89#eYNq``sS@6~&j+5ikB3+HPwt*-h~UVFC=k;ONABwH(A3V3Cb3fJN>h zRwt2z9@?C*`P!k8$KdN%uU=JvLpf4J5aH`jHOE|^Q-!xmv-)qFKxZpKT*S4(NW zGhdNLVoM3HrZ+*50EBcDUgE27BlD&6w5qrhq)gZfFrG-wR%*U0@?x z-4$A;ztKnq9eeBWVM6JHG48n3w2@>mBZRMHPc` zFck`T_3HVnngM%ypZ_akV5Ub4p_8ZCL>tOBW>&A+i%w+sstU7BcC zj9z%v=Y^~&*%v?onDi{|*3F}X8?3AR*zQ3h87%2{c;n#F!NFO}Q(d>OY|E-ra-P#} ziI||WcU#yNe5F#hlIP(Px^CRKv3r{C;n}yJl&=lhmkyGq!!-3(S8_47Jr`cLOAc)a zGIg|EN-;YpPV-~)q$0b1epOsaq(b!;^Hx_S2jBV;cIdvNgP zoA=6pKnmy5xpZoOpI~~b0*I+|SFUWIicy_aR3o#x>Bh`_^Jh979Gaq{#K6f z9xh2`n-lw&@p1~HhGHd?l_P+`mxo&w-AMhLA`HHiCbg}Y4bAXH^LF(QwC#%rG>k)yPnVwRIdx@x|T!OKY<&6oDeG+ionpLzmH;@}8eBRmgL#g;AX zr++Q`VqZmNA%?Fh*9lE=h2#0^k9h|NIt6iP=1a}KecTEb_*wxLr?P=@EWnJvr^P!1 zms3Z||1kK%NE$95X8*#s%vX4r@#-*$q!+?VYrMXOmm(sw&3U6DIji{kprVGAk>KT) z@KjL^0)|zrSA5;Q_2TK%yN8Dr?>Ks-Wy_nW>ezh7Eix_k_W*34m5?KUWAnmoKBtHd zAvX)9175<#rmREpr4os7B~dG&eA3py{W5WSWDN@`FcfIaeSB+OS z^F0B~+wrM;m{PCL3NHYA_LZxOYB+ufP-7KXI){wI*7%ZxjiC*3?ufBiucizRO@Y2p z7vYGq>E(!}F9utv7p5dzqu&-_V`-e#8|+Cg4w^|0|JtNhe03?O1P}2O`Ip=WO^leo z?gBOxxSApKBP6u}S~^c;wS7(f(C`|#R@u~^D~C8@We<)X z{pnBa3ju38kG@ZELt*&MP3^S2X)$s+IFMV3FK@NSM-**lO-k^pqEUk{IoU@gLWrt} z=!jw=iaxdrVN|v`5nljc|8o4W=A3tIO6;e3jCw4g3U{N_PY=3&(tR z^_c+^S4ihn2*{?fKmF-X{|aBgRl0jW9;I?^D3N(?S&L;R+E&?%u%u~Iy6O97HD3d- zw9#rj7tVM=m^Q;a75$T@rT+7N~UVHkvnakz|B5NR5g`%-peiPv&3*=DY5CMK@Z zzPYy1122WI4~j1m-c-;=^)?PUADS|4NObh47ccH&UpqICZm1{#fXTJ08UW(ccV`d( z$`lu3dQ97umkZFt%a{xezEGm@q~8lMmDv_xN$~v`O$K@gC+91%4f6$0RygAhx<>D? zR8Xm3$ZBS)aa=gFNr&(PB@y2Muo7%o+p*sU=?B#|(P`GEO)6Liyc!cXA?QU><)JU(QH)SdxR?G-A&< zffxIkQ|gPdz0Yo79sFzSGS33+Q_m0|b&bEY$V@}9&sUm$(FM{peLH*&|FMI`zpnOm2TQnch+_#@ z{U{yz<@^>5Y>c}sTuVi=%e`n3>~PPJNwJ@Q{$ zXW8ILBR63=zuYoaI_lXgy_{WwICyPWm_xF!q^u82I(8ur^roRK;3n-mRa5k|mnj!B z$uLZWV-vH&f#9o9(-IVXZ2#;&7swk8!5Vx)7;?EAO(=VrN)}#fOO-kotIU3#2ru~B zTJd$>0xShJWMAe>9GS0P1f~cFE+*D4anrp)(xr@7@daAk+XAqw0*oUfZdf9+0bhmm z=Pm!n!eu~Vb%3MRV)h*=e3crnrTA8b=?RaTFCnGM*x&J{%<3nC*FT%D!{W;Ti7$uf zoV9*DUyYae>MDRKBqc4(s`;7#>*mCl4;`H+J@N@o5T8m1F?B_gvk|^Jp<>ls)Thyl zE3Q^}b-;ae5!V5mQRCt3@U_4TE%@pL4&sOKMbbPm=isHTA!4rU#T}U1f-ho;cd5Fu zv3DbUm4Rt)xcEAg&G2Z!m$K!(y#oLiXxhjtsU5tKsx};@+SLKRR4`k}jK;uiSfZ#)sEVr`wr=S3tCVHUq;*gIldyA5p<>Znww&&-Z2-h=W#q^2=6pr-;}=l%P+IHL-h^| zFP`R${-OK}(ML322)+#3BH?d>%MxB4n@%APG=)Yi;_kDnEkcvcSN&3DBHC5mbv4Wg zild~w7iX;wLM#_#uK+6>9Ft!@FEs(yK+ztE1)pigY|0ElB3-Cw_ABv?+VUNJPbPkd zFfTx3#n-`|olkHgsaH2Yap&xtH|QQFK|XWI3L^p+UtWuXtdNo!DV#3q@e$ z%GexF#m1C6FU&+Lhqs?Fyzw>_h~J15c*j@hqy;jS2+(k=w<%H(QDoI{jE11wwts0` zSz;V}ijQ)$bg5RUpbFIEU9<}$;w0onY5ZlvxIjC$FtfmOMMePQ9!CI!uBK*M)DrZX zs&+&D0`QV?efhV3Kp6TN`s+9CUjRlWdOKKXK_;yEYQ$#EONP7bd#_}k^F4a;Skz&{ zIf^pz1(NbFuktEmomIaqXhm|9fH5drZWhMPo?Xs)#;Q#UakiFp1=bKY(-oVnBl1Yh zeEs2lANnBn^@T5djm_P)#v70ZU$q-a9dCgbS@bjyShoCrCCy*VcFToQN)$qjXPXTM z{$(9-S&323_?7YPDn1{&>Wed%DbJxr&7(W%;n&IeYQn@QT zLnZcqwaSJ1vhm^sUEh(R{Z#&iw2ev(?8)G!`D(O$Tw!w@UtMSvEetP!MX%+ni5C0+ zi7!(#Ti4(#meH%Vrf&;?%8sJp62HF7vyZ{60qbV&Hmp6Xrmp~I>969w&DTfDzP|9a zFKAVY`p%kP&Nz$+hf2;L>dw}q8$=JQ1U52X$o|E+tNB8K#$JXp!BcLA2s7{{h*DgTVr(ouM$>P6M2=D+-XRJ&UevIzxh`Z5Q!g3xL4sN9mc^j{yN6EdSS|}My&Tmo}EwV=(>4wl(4Ut zUdcpr{=D>D`N}^68hj}zIMA9%*Ie1eSLVypsSIFq|1e69|Y2_jjajb}mfrYM4 z&F|5m_#(5U@M62Y50-s>>1%Wk-8pO}wP+!t6~hW?ioS4`-EoJ*%#%!x*W0~N-pvG(tJ^^2a*Uh8dM@KskY22*b4egl1?vySX3NHnX#l|T*kNPwzkA3jy`t@B<+22IM zE3ct0ot>(Oaz*%5ECgadT2M0lIw4AOByZG`6mLK7P+{=e9DJ3;kWw>T$S@ImV|CDc$>zrPM8qY_5}mw= z6<*{X-}tr@^7Xd2Z)AHt=l2ddVs6&F&z_D~!WZd?I2L$W#1};u{G@}}23AvG=@8OC zges4{K&xy}ctIAz$i$G!F*aXbI1o-yPgl9Sn_3suc5|k-7EswtPUDxJ##CsH(%~b>i*z9 z_BHqtKwUn5TC9)KJ?r{Vj)pXSCM1bXbBg`knnz#_G3r`}jaL(vH?-_t+H9@L_=49@ zTo&L^a!~*-cWxcMIJ#9q4*1%-bAz$~&d7D1Jc62Z<*+9+rzj%5!0H%sEr=Y_ha3}@ z>NP32fkdSc^t z(i?Iom?5lM@k{hLx$oO>vd&^c3sZ?Tu5^qlBhmd!t4NfqJCMhbQFg9p;O}YFQ<* z3$mTOn?rdFF%5;}%Z)HEcyPXyj7wtXnKxeoFx<)!djwk-G6JhOM_HFdy~EF+zoOqz z_Qg-BBceuj_`*tqNYjyc;;bcK!3*X4I7#^iFCWbq?Dv(iK`-%dU;gbce+gdN{`^-} z71nt1d`^g7N>Le<%F{Wm;q~A7dT%u5!GhN)!m(0=g~C_g$O16U%E{-NuPjt6z8vs& z$PfjY{2f7^`(Yq_aot;HT;WU=#PH%r7wNqYt0w_ zwa^Zf!PkwCxjVRtGSP)^jWu893lZ`_XDd5*%yjX^fiOMSq7HdF8NS37a=C1gW|KU9 z(&R(*_IEfsUme8owQ>2v_UTHCFY773HfjPaqbVbCt%Hf83#oS)|Kg?wWu^jq|&Zm0KrexB@R9K;jG$$s$m{s;mVocF@N<)dS zq-hX|r)`m0uiYQ~?*E4`KKDF5{e|g}*d)HTIbERBMrRP#loO@x^*nHry}1^LaFRF) zuk;cVxdX$7$G#pSp zL{;?pN+!Y>gnjv2-}>gSUe@%%RZ0tJp{xq|vOmZ3yL^Q8iFV(xO{w_`UM6jQ7`BQY zqRGJ4`iH?wgw2{`^ZAkSuh4~rx*~?=D^{fQ1eih>O;sCJ&w7cZ#;Z)Q0kgUhqTGzy zEv;ZU)govz8!x0amJvk|zwm`GkipUZg{nbNLua0qys`J_-u1J!I7&$xU>1336&?~< zS1O0{pcsFZXE~Iyi=&AhAtWiXkthee`Nw$Jrtaa}Ps|tDhe$QB5edi9_HFQBE!yqN zz(l5otO=UPjjB##zM&W^>X1Sk;;gt)jKg>Zu-$___z_=)5kJ9vT^j;h(27Kq_)^8w z@Z}hwSmB^|ub^tY7M;UPt|9XUV5OZ9rl5Fy+Rq{E>GMMgydK|w z3{Bk=ORr2mie*4>BV}0er@KujP=ECmZ zdT{jMz5zp54|bXS+D6)8S!JWn@CaZD*!M0fi5C`RyaInt1zVJ6O zS4&smOWnphROZ-ybZ}X{&kfOn@m%AdodoESFp>ZVhMFh65Ww&y@g-t-EB9x(mYu^- zq5zwU!SHp7jn}uhR|B!H6<!VPEfIE{uNrqZfBqBeJdC>o;}_A^~rf@Pa6I?Cm)`iFEOAnMAm&? zsNPy}b!PL-1sYsJQ9)-LW27d_LwH_v$0z0b7F`ABolEG>rOR;1f5zSxpX~4j8XJUB zh&w7i-<1eNf+Pd<(FTF!bQi)A- zHri^A>?w2I>JF>B-I4S}6(>G~mNmoCtH6#|^SA!(`5|fZ=;BeOzo?*V)px_AD&CP)C#5Lb!7`hy zX8U=G2{3$M^YbbeH!#ld`KptS;Qiq6}*MmS?6&_}tO z_DHvPW9Mqp8^Ij(FQXkzI8&^i0qA*gsN_o}WY%&%_zImIsIY9*I(ePGJMrNG)gW$4_^E^Ayd-v{9o)>B= zXmDD5t?vX&Tirq%P#IUIi@6k$r`at`E~bQf;6h4;au?A@PTFckh;btM@PvA6@wK%F z33tkWJU7g|@#PPQFJ`&UoOy%hl@FX_I!hIK1&fj|IHBf?pnfX26<%7rjBeMN59|J; z-92n?D|~Usd|j!GE2SXXzZ9})oMJ+~wz>H-OU;+B7kmZ9xKj9%n3dbx+Nl?->Ztfa z=ReF}=qTf}@~;Q*g|M&3_dx>t5?=wV=X5(tA5A&F!E5Gg067EJ^*5rqzKt|x^cVGA zrxy*r)>D>dyyO>(MkJ&Wtw$+B*q|V%39$Yaan&wZj|s1qFDFkkxMgDNeEkBxejdK+ zRHLuE==t5ug;m)oCYNCdFVgBSm=azBii=ENxrc~kWb(CWQ^9R?>J%21@mW?tYu8v^ zdIj?-35$Ez|G?Ki|Be$uzjUcUscd*6F(Abl>+_$ycHs@`(8IoLDYOPO2OR1INFbdxDSk%tF&2VgM@my;Pi!)Y1}HCqjr#Hl}v z=Br6r0ETkzTXWVT?dJBsnHr(huEK z)LwjLdJBZ~^a@Km*aiM0I1au{SiQ8z-*)MIeT<<^_Gi8}!dJG-6kpZoRh0Ith-TC* zE%@rIys!B(WO*0S%sa~H*ZLgJPdC)0V+c$;Y;? zs7<3zy%=~ZqiArZg1*xXvlVu;FeQ8;mBMe3V^7M;h-SVzidZvFE`&HnQ%g-%eiPf! zVaeA}+!|m`Oc&y9h1bLvfXSyKdJ|<}#1X~UC$=cdc0*+kGo%_^aYi(>1f@KP8(H9- zLTw`ySZghnNzanYiX(QCRl!x_T#i=C9N63b2fohkZ(l-{w*)QXi}(wD#A=?oh&963 zIetY&Vpy|w;Wi^GfvB~WDG{J5qkJDW4PY{|6<^@BiTKMeX%<_#QhcDr7ehPog=Z91 z2CLX}24vC+(F%(hu4K-;QchP6P}gvREqGbO_aKO{=_N0(Mnpb03iNCIepbU=-P(Wg z;sL_ED0YL?E!1>THM*#0wB&34d}lIf!IuEbOjy&ks5d(Ewc1Oi6R>z@{M8jTX2PSe zlaftv5Rm>OUjb|mY4Gg3(i|sA@M2wm=++<7jx+$9`9dqcR6L538x?LcUvv+@e}lJ3N+F=CA#GuFnOoDEow z(kQ9#vEv?G;S=EO_#@$hwrF7s?dYS`5+8C1I@|@_R{$2@5)q zw6v`5bGD{?`VrpZ#Zv5I1li*!?JFj`TB{s)m&=ZtlC+FohyI$eR^OY0jyjxFmE7|0 ze0_n!y+bu$!dTdqQOdra-TXdf*%Wo~X69MrzZt%0Qr#vTaexo67C3JJX`H&=Ct|3Uc*;)TU`Q#KY&Sa*t@e|d{Ib6JGq4~G%DRV?@tP43%(YB zbq1ooS+GRGYsr_>HCm=ichWn3vd-7|6+y+_wZ(i_WWEefm#vwP;cJQ1g0C4cf1Mn$ z0ob3+7t6nzFBP1B@ccm)&fBTQDmU-2rvpHM(K$Y)=M)#TeL1<%2G)FW(|mEk%XBKa z!x2Dv%AktL=F6SK;;TECSl$1`*Ct_kg7ZcU8~T8}D9K!BO0>%z3pN!5Axfwiypk^p zFGOE*h`)gmSml4z&)kA9PeD`);+@-Dbq9Fh3)L#MzNk5u!bmj zby@A!A_YH_V;dWRYm1)Z##Kzvzn5oCk{vPpD!%R`8(2G7TgS0{wHAQAyZLgAvvH4G!uUoggr9<&`_2}TiXub+QCbFE)Q3jVS_QtMz zBeF3J&3HLPU)?wML^rzc_}};4nRp?$2!pay;NGRnbPknEtTKn*zp|os;tR4$oJTUphWP@o z7B^zac=dFc`9e5Y`Kh8Du%CGVSF7Xhoui|pJ9lo~y#M@e07I^k9RusC z9El>%cr6`F3Si<-aSRA6%B;$#Fvr}Ps~?!58;51c_m$F z!WUM=bdAH_P{x%0X0NXi;fSoQ)bYlx=v4B{FI=e+nTy`g%M@Q&n2M-E?*2Y}5!~3S zIVkwbELcW<2+V}nhWWxo%ooCQqI4HW+}^}|YR0RbEA6n<>Q1HrQ-yr^x~$yex>M9w z7FCH+_1y=9ugop4BJU^6 z*9GB4z^?{gpn~`C+lnvu5JkB9sq?>UO- zS>|L36Sxy#;VT9PcJO7U1X!A?Ggb2NjCb}XE7s&^jaSe#UtN?#&Q*L>cUGOlEdo9o zC|1w80J{~wm~G0~D}1H)` zzGk{+O?<7|bGB0&4cOEgS83*(t9)sK{bT3Z*Ml`qZ0pi|{Y89{e;B?ZM!^(kE55E? zy7A_l*Ub!{JSLPbY@hnr?y2tTX((2sEks+QNjjk^(@w90FXYIfvJM^GkQAJEAfFDX zz|`#5iTMHpE$gp1dM&Gz70J3T@Hf9fe$=MdS5sl$Nrn4P#qyp>W0RMv|G}RCp0II^ z#mTrBHTrn_6LS%^1O|0LfIfP4K$Myh6h%p%5evh$~i0JMa3SPa#-ON{SA&F?L zf98G5c&y^`VM#5wr=ghR98+D>OpMKmSk02}w11^J<7JtzT)NR@wTy&b3>}L&q6c-2 z7iRWa&Z5WW>*=BVOXcU`sR7H(@=?uvRR<4tpacuMePI*6%449x_LUmhvZd^O!k1Vh zJ44qrtW%(-5QhS4G=AGxvhN*S43l8s<*s243Kw?iDyJcWSPFqS z;DCacIf($L?W@VkaZ0FPC(L&R?|IJ}z*JR1Exu^O+NC?hWcK#LS64y^gAsisJvSMMp8mrU|uU_00}oL;o#O}p2^U;bQ{^=iwAFSCgb~{B{N$Esi_^Lw9cXkOKjtvoMbz9G=k z+0y%XXYi`EDYbC2tSNkPq3DNulYAAZ7ga)0WwzsAPCh(&ev~5V;!A*m7fg}jTYT{& z&%A+wv0F>wQ^3|VvuLP80BCYGRzfUtgSR) z*PQAroCa=cSJ9iaIS%LYfNaz_T<|41>e!1d7a3G!^NKI}hd9~btD+n5Wx&E0{lmkL z%zUk90S?iUrJR(n4^Dikx#X+8t<`*WG498!;CP1(dAiZZ7}@cBHA#|4nhi{EocJR7?{EpRhov#hD3gEB_D3; zr+cEnMe;{LCjTh-lKHxdv|ON8lJSD`y~3CsD+;fD&a;)gvz9W6cR0u|N2Xsby0MV5g5`OH_x@U1K!S>r2=2BkhWRg2wZXKA=57aa?ir(WNP(}$~^W|)TM0dWSnK6>>ov;kC1S^Oa=UE2DKi=rFyvrjm0*8b< zy<83df*Q!mqyg{Y(kst6q&D}!Es;lu?CY)Pw6+wiZ~|Q6XpfA?>Vv^o>SkZ&p(wq| zZ#x6f!49Bkq`blAdTOHiq7OL|>RW10S_dj`j-javIGmq1Y89E69vtoO+s2pza|%aX ztfT@n(qYhQWfUfkrMBj*Qp%ddyjPvHSH0U3`ODC>1xt^P)1lZ+*8ot9^X`H# zMGdLnYr_j)yg})QHV>JW`8qYS?vq6Szw!lJlKY0}jHbf9Tf*cp=CtiR5 zXR5zQM^XLP8;E}lJS@yW%=BMmbf#MPXE88}ij-K%9BjtsE3ff~ zYtLIyyuSPB(LwQb0AEVsFj1U5_~J@AQYP$LUG_w?xYC)E0Rsk3YqQSX4>Vp&nX70@ z39(5^#1dVt&Z{wLUD7fY@T#)DcR4>O|I!jj(RH5(nl{~wHK{m;`3hjp433!jiUQBT zCMg^Lv6I+)^fg~RGX_H|PZ?w_C%GrS5Gv+Cd%UoT!9u*|Y*Nj+`8BtF^q(PIK10;xB(Y|pZT4eZwW;-<~3 z`Em=bS72N6m7i$ygRdCqYK#|1qVUxkB+OfRAw#zyrGe=L#3smC3TfS1;MF#@RP*H> zYwPEjulE#Rl)@HYq-|Ku*O??liLdpDyj$fx4!WKRxTG`DvqzIg@h@%s54oKPJX;jM6{+3 z5b>Omc+3I3-YngNGG2_%9_%UJy`>K@UD8znMF^uySbQNIjP{k{Oa7%o_}*@vgX(m& zx>}o)dyN+|Wv!Ie?yjO`K9v*Ym6mo)l3Iw!kl#gAb^p;L{L6cSxqryc+KO>#G=@@8 zssU>S5jV!_=Rjv0DykMLzWO`o*akN&*pd>tKc*lY%``fdM5h5*`&ie(j%Lc1r4D;S z*t_I4fZ--u0vD~9Kg^P_RKEHbacA!uSyYDcN)Xh-Dor4m6tWm*3ki|zlFi62*~VfU zg^&S@Z6c(ZprzebfnnS2B!v?3Uq~T>ov^Z4Sqm20TKjvS=Q;Dvb=L27eKxuG+&h!6 z&HVD5^Pcy-=l6fs6!Xu%d$GE|dk|k2DR}t);y}Z%T9r6cL8pD%UE!7XD^j7(~&}AAwf{V>MLUDgV0h`bto~aeaWR%2>2# zsa)G>>I3V7SRzn4Mws;~j>>zwSm!RH9kg0o72CG65$i&{c4{Yc$fB5VHGVSGH7$q1L|xYsGX`!Mw;gRPWiGvVpBOcUy}-p$aF<9$leWUY_Fiq z-@#V%)jnjvCQvxU*cA42r*w(1VO=_GX@c6Ow(n|PCkV| zV!K`1=HCc$e1%sQVd&yZ9>v#@RXNh4{lz#RD5e2N^525!rT7wNgku)MF7dZZ9 z_o@KmAO8IA;%7hqE?a$lsEw9|7ofq{QmMU3drw}22LFKwOHd6%E_fX>nh9T?OEO<8 z@#S1Zhv3qy)WWRHd6};rd5M>U{hPzDY+*?c5x&mw73ySYm6u!yY&?MSOu?c+@}P?Q z3C~O7YkyHK9uQy0k6t{T9dJjCg)-I?;E-R3Ey`8RZ;EO87oq`7jKS1HE^W~o8 zL_|B73?_i(WILl1xwT5A`D*)`z=d49O-kV#o^^V4p!n#54lOxdB>C2kQ$MV7ZA|ID z`*3&95aI1l)It1duTPnluGaaZ@p_-lPGj_OwZoMf%gurU;Vb3i(BKP=)8^E+ctYEK zKi_O6bkS7hsTwV9#U_R7hBr=YMg^no;a47T{rNxs`Okkqe|$~u#wDR8wjq-2Vi(H= z1F-#F`%Y5ccd#iNRO*46DNi=Low+1hPN84$bRA!2lB?XzJ6|4qEu}vha^w2=_}Yc% z|J@;2IhguKWHHb~tk2et`n;fqFt86$LQ9XMR}zdxj(AYDGFifMZ(&Flp1jd~Ln}tV?rOj=5T%8CN%@UXtGv3PBFpcMfrm{n=2H<7V(e6TZeRY|8?# z(*5f6=RZGXK@+YeymG?72ykTot^^|h1EiFp3nuR3(HiM{6lefeCcv+5)n!VI!aq|(4nqd& z!`;G1Q*eCag^$KpWo+>`ZWd^q)knm-I3Nz^vnSN>yn-)0Gszkf7a&x-A5{_i=1Zqm z`iAD~J2cFSZuQLbc9v9pD^H%l=AYesRaL9g+SnNzt+@og$>r+cmN~JL2YM>+R(BM= z`9QA)#&9qfNeeyV%i6*#5{u5N`XTX==1Glzh*mUupuU&*zP?xhLsPz_u?dmRW?_4q zg^ZDcThJP6z!JyLJ$;=pyH)ddnjajhf>^L>{Ta4U^$+j=eD~_r>ige$e|AEJp$n}7 zGhe66MWLb?Ux=9P=%f_EBEc)D^e~soFEU>^+(3(V=%clRbk|+P8gFH?nU=(fufw+H z|B=2Bz?6D-H9O2I;Mu(sle%=+g0EUUi$U6y+!b zQ`k_Ac$LlusoI>J#L;l6gQy2}8NM>hJT2!Nwzl;*MG^y9W%U!zte)nNUoa!cuyk30 zj)$|0o8<>wj2xZUH@6JB2_Zhz-YUgc>cDUEHH9l0i;o4^8v-W18s+2a=`pFJ{acgH zjaTVoIU8`*1*Cc>J>jtFTsZiZG|9qdZCZ z5Rm!Y#1>zeNTpNMUd~F6`p<@7wGEj0dNQA7Hh^*7*f%My3Iu*zmtd_BO|8}EPIe06Moo3CnjTGgAvYdc&1 zAMw@NcDD&%8zDqmsxqGnjKj_*{`J$3MACs^TH<;-3bWP-Z`#*{rtKgKVDVP}lFJ*> z;RY|n;YY9T?-uv3=$#|ddWmdMpRLm8FHRQcKic1sJ;h^oRCGf)(7Q{fpuqF;L<1MM zlCtjOAO=`klPKq_nul(|SLynAMtI{t<%=l22N>{GCDjyuQRv_Ea&y-(bV9NLQ%zIu zDT?U{JQO3-h!B}CE<{=eVlNM$F}>tvmGljj+iT;3G-Ko`E?^2~ki(_VlWu6Q~tJ@>`(3id6xrqZ?G$~8f zP;CIV_P#KW01UbW6*6CTuV4P*9=v{3`99}0VAl$v*GZy3C4Xai{v&G6lLR{!{%cbd z^OZmS?%a))%L%U&6BkpaXz+zxnUw2MbxNHc68rU0R$^ZzMe`~>(Hkq-Wf z&z-#GP9Wbw0yTB%QDVOH`eyw7avY%#v=hL}+BDmz=!geu)Py88{>ofMWImzwRf2?J z%cV>ik(oC^CB8a{$bB_}S3A?T24veIMUTF!gjQ_{{hi{AWECog+!E^K@K7QsQpK5QA?2I9lEghVGp);qH3D8yeg0mPHtntdU)s3C>y7-~ctU!Z$aE@*~$H4v@ zzP_j)VgYsmUn6Bw$UBAK>5=E~1=zWkO-o!CPMLuyqQaUxum=cVhc9BQ`^Q0-D zrz?yGukh8pwT(4izH0oo>UK1D#aDbQiu1X^mCD{r#!F<~mv^C8e|U9|gqQhRz}HRr z7kbP4$t`>-WT9|jGUjO{T+ho*OxTs=V=^SEP!V1BGA=WUI|yGr4k|{Ui?ckJ0T{`L z|G5gV3;I7en93P~*yyqbbA?^9iYG&)bP$9kAHKIZwzk%X_zgq>G^6Fahj zg{fSKG9FXbd;<1R#S0$1!kn@4fw!_Rq>Ix*SVHeZDL5r@v9*^Gd?D;h<>kKj>}ZeE z)2imkde+sFB3P($CvUQ+;LVa%m%Lq+fuSlb#k?4ij;Q(SbdB)!wq#hW;Y7aJ(nv9E z?4rrsau=%_tIW8SwJL+6jKieRk!Lqs6wy3~-u!_#Y%nU6%L*tz8}}?LFN+k)@CY-vTJ@D#oG{Ak{p&2b1#L z!@27JA{WX}u%F3VK7nV!>OY7WU2p;&;%{gIG4uODwzOFa9&Z4h_0krSDp^Q%b!4ab2NhnDc_ZlRWD4!#jTrV-z6GgzlV2O<1%G`6MrR?h9@@55*@j|w&PNw1onjDScR{&OG?MTc{o~Y6` z|BZot=~B{`%HhkSD58}~FcIN#sAOvKwFh538|da&gD)iK9elkEUzO{76~46o3zkww z3Z?x*@5B!cQ1eBcPu)VDqIeoU2VbVA`I^?VnesLEduYC%!q;*AnY%uQFBL1sx+nvL z#Mje#mE1C41UTM$Yn3+?=CFTt;WjJ&)rs(Lr7eHj;>)V$pz81P<#Av0CBTAOkHGX# z;7$4J00`|!?e6lW6F3EIJyGr3;VaEvcmi3$>({_lo>l*3V0Yr{ULq8BUr9m%EPTCM zJcKXsVlHw4a{HCiGyvmNd{uXGS9mEhV89$ltZWQ96$c*npL`ku3>iu!zGPt1jL&Mm zoJRZ~55Ib?O8pT0g{E5eeD@$jD1Ql0$uS;rLUOs(eC}EW`Dx5o)lQr*fl#;gT=|zD zPne!Q;=EFz&}lhX>??*gF63Y`tW(#emxNL_RYsUui)EQfR1{BwORXHEtYl7?v62lf zjlZ70_}-)EwFIL4t7;Rg(81xH6fP2yPhUKNG?K{%UzhLSDuo_L@`}h5vX<2BeH?;U zf`@?falE47Wo^gt)0lptsMDfo(`s&vS7w+$HWr&OW~zcy4qa3T#HrC zojC7^pkI4lv;sbe$4p9%U5cSmya0}`y^ji)`zw;8{(HcjC-vgl ze8)S`DlAAJPyzYF+5loc!+Euq1-_DZth%GODo;S)?=RVczk9>18J49$i;Y z_n4}%cp2N5%_tjQ+XzA%d*GpZ#Rto+)>mVBn1@`y z9^JwWyjZh(@0`^01#%h?7xZ#~3i-gj1wkc-U?g#T|LZrzJW^C`WX>nvX9J2`xiW`V zC6Cx!GT>+8D}jN{?UlJp>$nzb6RMtkD zL)X>~yuifQQ}}XR)Og(<9^O`!jVcpGOq=IuY3YzwV#C*Y_}X38tg`033N&8WWm@>p z24EbDFC?hk*ygKM{N=X!5=$H>@kAFT4PMQc_uH%O+#g@#)ubpte#E@n(V8#BvVbf2 zDl3Jrhj+@V|HfO?kwXKv%@^(BOOk(CjaTy}0DbA_M!|NAuPA(>o|M|ql&?^ehkUig z7q@~H2REX8EEqrkcw%}_=;_3JoNBDx;$;J-< zag?6%m*ROOAy!;6cme*gI=YmYCohlhaY@d*3r_K_p73&33#D+aW$AVWUMdDmB(mgf z1vLZ{V2jZMr7EY2%Ck3Y z^%BYHeNsQ)BmUd3k4tls`{^AL^mz325!&0+=C>zR07pH<3T(xI1e4W#Nj@o$DsELo zc0aH)3D*i=X}+Brm@k{vC?yv=mA7jxwnSIbfJH(quKg?WPPX%(DW&X?kgoou7!oWJ$10nV6=lTxYhF9F6Z^D~kV*GO&9 zl`YVVs*yP5Tq)TaEx>ZBA|1#!G|uo994k?(u|jeyqc-?bSyNR4xj3b`fb5G;@o2Y# z8`AFMBdz3~Jyt#AN58p#j+YTUJUhF5Sbk7^|}txHhwQllXKW1uo~N z(kjN#xuvLeh7tU$avQ66HxInL7CZ=Dt^k14UGg3dE+UPynT=!{8N#>~@hTX zZs8@qkZy!kX50{a!T;K1IZo*045pEbEBLz4&}$64gjaCO`ipp1ok`-jAt!Bh$5Rxr z$Xb5tHr&w^OaTf!y!YW4<>o7$L{4iNFXW)( z`#d$86t>x~_&b}G?RJ|=MkEj+o!FA`NLPiM|Lus!nk zvYnAvxoF}#eMZkLS3hoVuIT(HFt9It1-@1lo}m08_Js`CJ^>ZJLw8cS#H5IS&KQUt z6<{oV#=@#jFIf(^{$}-DzEeJun7!xZe~Fm>LfPFxaHL5qfIVxo5@S`|w=kh?@mSE} zpRfv%9EvXi#mSY|_@@e@EhlUM%Ef8b)#I(Q`sce&h5@eM{N^`QQ>_rv;SBq__8&4v zm5jfX)%_a49Ny?q#uTpbl}D5(xF*K9wH&jTf>`s_7Kbz*YY35ZuD1Eo(R{6|!qKEX zVNQ5$^VKOI9CXs9)H7Vp%P6*fVduiMevLxcA0)_1>QmNGlza6GCiA5ggdn#tUOZ;N z62TXn$<7Nuyw(ojs|ZOIYvmWg-U!bxpiNPBgn?b}&O~6>vGEA(Iv>F7(w;LxG_wm> z2=8Mx{?RAmiy_#T=W|szIN}>~mabQ!@nx^a-e2^CiDK~mAA;7rbj39`j)ie91CugA zrfnV;FOyWp&S-4he*;jwMLhtk-GbbPBF!ypm2(UXYU=J_N%Y`a%@-$!^0^CO;Y)bA z&zO2{(%ID&o5H4a<;9b$g|WL z9bRcXW!a$T|bnp~D+_^N_uN#S@o`~H)Y2Ret( z3M~F*2JFn^A)8sswZTa?#YFTPE!|Hx701LCM^~`;st+4gf3rT>;Y4SC@I1t(L|r#}tAxLWgNmJ+Jhu8kQ-gfANECu#!Pn~i8PHA61tZkVqk zO2nkv84qZy@|jAk!Iy?MC_6F}Ayl5BEDTWhTn!i-WBR(PU?5%ulmjI>>Jy1XsS}ui z8wU2;Lj5<7_q-CVOw$#GcU?>yl=KZBGU~rQc&W)R#C;f>d3ua**8d;XSB5Y2a>v{D z2dt7dk&J(7iW^~Iqp&XyRh38uQ&7@IvfSs2e`*YABCI|f&W6NOW|b?)N~t5%*r{8v zLiq4zrOeTTnh?RiN{$8$(I%!g%9bq(85|m(;NseO#sR2ByZLHu ztk2|Be03p2DUTFiZ&aE;)&*B1W>`{G-iXPp0L-ohUY!Spav{cit%oA+%fR*#P$5kz zXDNvVUrJ(dYQ}-*jvFst$|`Abj3cW0OObzZmqa6)%Cq@~i5+ z1+WSqB2!j=!&v}jR@p{3Zt~A>>KOWAdYh8?vO?5__^RT(SflyU7hqnQF5~;t_XXL> z>SYCTDukryq2U5Dl?o?@Sf^e6P#pMvF9H~NX~}=&2*g&xpm7Kf&DXZXrPXwXuiTmr z$EH>}cGHv^w6Vf-iWf{p;cGj>*t-__fW%d@8jE4PO9s|)4Fp~~nzG?p_vanF2tzb2 zTAOW;){~CF2bPV&mji@@uV^gQz|AxR<{VyBkYGOwZd~tsp(I^DHM;O9fE8Z)K*tRD z?A&yrYHq18_9q35@fYa|)l0HL7S-B>)-~w$vb(BWb9QdW>ME#4g$k{s=d`*ddS7u3 z9+_#W^})I_hf4XZ9;j_^aE^23v1pP)rLtK5Jb(sY zv=vvBc@dX~5(Z|cPi_~Cot4>Tu`qayXQR2*%-MlZ7C zBRvH3Mh?9JC*@4xs^|(|;1#ZPx}%e**!+*|UuZL^VU%(^59FNI0PLI&CP(owO2D8o z?UiC`nP0B1Aj-;PoQtOTsoVCZm$W4)pE z#FRYUu6y6^H3ENaX$_Yof173*a_VCC3dw_&0fVjfFC(TyjldG3xSvo2HqDri61QpP zq3$1sulSATzdQ>h2{fd_Pl-f5SGgFxE3?Gi8fz@o%5aT_Q=>crawQJc?fv9@0oa$9 z#3)<*6(<|2dWHwoKb#G|W;5EDSOIoZBCdgbY2SSSJJfE@e6#pASRn>DG&rx8XP5FS z?+J9q8~>ETF~JKGAjL=(D&ot%!gv_nLP08pP2h3nqWI#Pu~;>-eM3C+n@Oy{Kv#^u zn9ZB<#{^yPi6-Vw2yeg_7bTpWOhjV!JJbx29vs{ zlo#%18K5h(eR9Bnu^WbiegKd!&**c#<3=p+J|VusjP_@XhF zQaejIoUUJAXV!gJ(nj`vEjfUQr^Tn5uSqA6cbQY9XBsyIp0r524_~J(^L1)QRYLg5 zNQ>eN-`uJLyK`6!iKc5hg!uNO9}uChQ5dF%0B=??8z#Y2SgI0yfhf@nhvHk!*ITLS zY9=O{Zi$i^vA=!#Fe;mwMJ$ue?ywy3||eM2y>QICwpYu_Fq&Ilr0N^S5&v` zTm&~<_)?6mO^H*ZgM^pfBrfY9DD#YU1V80?$6m_N1Puq0C!XO4nKNy&qC7%}0k8d_ zrnT%&nf|H~P{Dby4wO6>fU&RXwtAm#nwg&8-ps?Vy)v(-KRBvC-LpqjrhqRprS@P@ zK}5ysNB7X>%;3w?VoM5tZ)TT~d$v47hK6oi0VZA8Uaam28nE>Z1Ez^A^CsnSg*w8Z z!Qzm9=GZFbW`6Va;B`?OT&$Qa(cDTc_));AlA@SjCaNJ_yND}J&chhb`tTK3+6K%w8c*bpZG@Vyk7&~=yA>PT;)~<9ww@*rGhccTzASbcOhA51 zq6;3>Gqiujr@Gg-ZnkgLq4^rp^E7WJzT!)RF9=cP_5#A|Dgj5*uCdOIcK}h{!=z*s zMtV%<)m%DSqPU}^=*W(vho5)|1~k^T4 zNd~VP^v&7-CHt2tah^Vd=9Y`D`tkQ>`Ez%CEC)LjU(1I|lltK$l|m~_Z>F}lOjghV z^}-cl@-e`gFU9?dOD0KbBGa=yZPt8$bcJ&xrojC+P2Ag-$7zMw=sm9S+T@GlD7bcC zDx{!myPN0MXimZzIq2Mg`5EGiex3Nz@aRxZgI-E0B*>c+o4ngToKyxW6iLDhQ;L;k z=8R*H!(dO54M$MQzV`1FJ^bVjc0>5$h#(rO@EIbqL2qeB!jRlc+e^cnLL9a)X*u{p zO5^~lh3XF@Cr85<&jGN?<%6)XGUd!+_zo6&+lO$YkybBbrl}63P>el|ky~4ulpSWX zAcZeUHlpyV#Nv~A)#f?i*C46O?Va9dI-z6D=I<0?jDA^QN(Ew%z#xoD*MVu82BmW= zV%<`AV+5@#z8k@|TtT#LSQOi&a;t zV%2=-kDW$;3|*3wIgl+ZtvUBJQK6(4N%mC%j>YY~LU7>4(S(uL8+F%Elgy4}w5qMU z;AOrLa7}`Ujo2ywlpdu*1678O)GSwz0ySm^4tJD!qr5}mRau9g%db@c3hZb*M8j9p z%MW12&x!cC!g-O^R}K{GuVUVua0CD^uA%wZc~Ab;Q4>TT*Dt z3DkLt<_q=S6znriH6O@A;1$KW?vdd7rDWepH!!M)w?qoN6HFIDOfoLgNCb-8ZayM57qGE6a_+dJO%(T@#j!74^JkSKkYQL`SR*Q zj?h&D{WV`o%_G;Nh9lUfjD60UFLZ(mGiJkNW#-FvbZWrN7p+i}WBBqi zm5w2nm-X}Fa!A>|KVI{7p_&1>SAEHy{n{LA@bw(NDz|wDiLbpHiaoFJhwBQde;B?# zJk;mg`*U5;f2hV8)aZ@1i7dme_x1Y&Ckol?G1t~Va1Yr025nEo<~`t#;DxXf_AS-mmpWv%?E-hFX8FHN58?}`U>Z0r* zmoUh=_7pW=3RHkaM#mP=r6?c@VUnk-F}jRno~GO^o|0du&1cfp?=2&>gO5SB_NFIP9^TyS-H242Ni zmR3gHKSZ1y+z>>=oU%#Lh#8tL&i22r^DKRg;~OfzQEm8wu~X%2+&)lQhtT|jKVe?; z<=??xO-#79i2uMGRW%aD7Kt#zpZdg=5w`TURP0>35f_~13vR0U>V=XmVcF_zjfDCW z>YMuA;V_)|(U6{jp$DqSeDO zTV48(utmU8y;)Td7ko(J1TMb7w)o1az|v*Lo(f+j^QF3S>%QjTt4>PJD89VXUyh}4VLZ!x z-9eY|D%;{;<8?pD-R+!sqZhuCWth8(*Zbhd24CP6zUukazg!Hy5^&GHdE(2BT{noU z(Pwfgx0Je$nlG5r0}A5fbIli@j_Agx=c~&F%t7ah0Ed=pFu@FFg%v%d>M*isr0Uyv z(z{lHF(#31)p@0jemR-UEJ!(ajDsGy%JR^~hcDc_Y^yTp z>v4RoG7&W=!QQc_utj}zc6umh2|rP@rLctf+9U|&l(Qb+lDmb?rkGg!BwsXIXCV8OB$Il~ydATSaK;=@%971hwrbkd?ECtKI)E!8+Iy~Gs+v(JTE~o* z@MRs~^ZHLg_Ai(4zT@1j=6jv@Hx8rslKopbtY=v0LC7y;a z=D}*ChFgAFPLx5vvG{+kf+sWia-=M=JsoPqNiD6t;tK=2sZU212YcEr4!j2X;UqRG>Re4`8!-OCwHD$q<2(pPeYN%QP)#mxS znw@eL*m;ZS^?%DUhS1uCD^6?6h(6kZaUS1aswCVeRr zU&=?4{@fe&qdH$c{?&Y8V_cgreMIuKo` z??*Gb!YUI`VGW3aEDp5mv|7|==L{fUsnlKhSxQK)mfGbU|B@JvohYBfh1!sC317j> z5>r`asfLSVC%QPsV2OF8c>Ms3&ryUCo4=vv&MP|gU_=Iu>LVw;m&9KF9V>FHIt|BM zf>&iFlGOo#RWOy|*%iY}I=Qudjt~eIQBVt4imLO<)zfTb6S81)V{|2+T0yP-3pOSj zJ51(}yC&O|E~@Fm9(+kf7ANziZ%}&U`QsldfFZO7Y9G*_?OW;>M)sk)zYt$iRvo+P z=NdB*5i$mBJU(d3x-Zn|(NaS_#5)ba=y5235g!s~oH7l@QIx6a?x8a6J;?dZ8+;i+<29B< z=P@~$N|SQy^u6|y;=3&5_p6wRv*RTNIv8`)bT%B;%j7D2{p?UqL^a?!5vC{4u-UD?-d-_Bx79BK!7$-froSC<96$}q~Wn3Snr;@C1pr3ERA{l8R(U~~o< zef=O|LomZUsTmDlsFF7%POQBKt<@djj9S8cd$@!w{!?}|bFUf-v}|BZF#}jleZg1F zGb7I8tLL&ta$zgj48Gho!GnzVRWgf(CO;K7$GBrYJz)ocoe@Fge^mrg$P%$NA0tuYq-Agz~$FK(DG z4)jZ4D?vq3Stj{EoBV3P$n-6w03513>VhjSWMNkT_QZJMW2)oha{H@8SK(0Ze9LFI(a6=#$La2Huz`_;27K+w!jU>wJ(qpiehh2J9tCfEYVk(39zBclu zqv5nD;NpLoApB7llzR1-2VT4tZ`k+Iv4_X}Qv6>*|6zVagyio2?n5n82|BI6&Gjw+ z!Y``9u?ZS?^eL>a5w)HCfi{P6GuUk1EnUtvph0oA+LsK9!t zcWkUeh4*);-78Ry<_2}#j9-~A(X+p1$`Ivy5Gl3QG{f3)nERvCcmadv!6YqLxgax zA2?|Elr-NttYKl5LC<>~RBz)JzR-#!b8cZ^PU+R(uP(X;U$;C={}4INS4y+!l2U$+ zqou5l@P%@QIk)_@PVChbnXXQ2!#yrtUi4;#tNMQ&zQC!N+HqYQTBs5PB5poX&eYga zddJCWs)o2+E$%+NzGNRu`hL<#I%+z)hsbqjVbF+bA7?l8)=XKO#Oi%Rpd~kovT{;@ z1u>-!4*gI~e>u^Wug$PaKt1q|XcSqim3QYFdbOqt-YOQXE2p<_(57m<2?`EqOi${u zsjZ7ryBP;bd@l;ejSxG9a4@=+=P6+vK>e2!~i(*At3 z`L!2c)rl;`>XRKV|7XGZ=`7e2x<@Yc@)W+9XvV>qVudz?Hs?(djkM!-M%`^M!rY+r#RWvW{!U z-f+3jYvo3Hjn}TLH}daVl{hN3xn}TWVl`UkHw0fKNwEp{Ywr@Pjm`@&A+ROST7@s2 zrhIwt*lKLk)#^KDwE0rtJqt?gUlYJMA-d>kuC&c9NCDS_*g}SDu~5*RiLMG^ z=w)so7zP}S{W{uVk{cDEXhtF?40Y6^>&)BbQZ9O^vJwtl=LVUt^Hd>C4Gu^et4v@h z!pXqQoelY*T4Ul%N-Y2yR7B%v@VKxJ`Ba|04L6}8~uCMRS`FG}{WbqdIZ7qc)! zO+y=e6^!2b>tcB)zA84mqk58>TjZM1#qln)$F=+J&KL^Ao=lEsC=b-RGaTnnm#e$7 zFTZB3x8DjC+sdku<|>`aY6LyhcunIY-6s^Pz8$_aCu|j8i5kkQ=#)xHi)1zdmTKMF zn@ir`s4Iwhp$`wp#&svQ^c(B=pU)ZvIhSHTW2#qql#67!3lxrK$h9;4LNH@i11a9j zm)IySB<`O#$PH%!yAs3-M_M*1A>qk){YHqO_p6Oe;-TmRV@tyxZ26!%e%+I z*Z+9*)rp8j7kE_b zyJP5aHIGfx2o>PVGRW`+Jb6+gh^=#Vd=~rmICXmLkKVk%$w0LtWAv3cxYB49RztKB z>p-B=UBoh|l5*r3ch%F6U7NWotiab}n5&qH9Bxi<{&Og^V0;f`A4-o@+4g9jMPRey zOM5aYXQhx*4dNYAms5L$R$Y4mU35nE?7rqbG!(?|Q~KY9r;F0lU_Vzp&r+DLD9tlShY;Ug-_anIY; zdv467+vzO zYys4FzZ%Wlxq?RY~M#xmZv4rVB5=!pQx-f#9_r{5aak262cxYQ(() zpzEQj9!&!89P{A9Hxi`JqkhQqrHlOq4S&8wE0Z9FM$(~Ui5nY#xwv6rRYjv|R>T6> zL|+97YP{4&A$&m~HZR_Aca7l+ww!k2!$!b^Pd(|gMqoA^F1 z*4+;Cby9rYm@nBF3snLb=%pmR8d2lr>ElhlU{OcM7Yi*1XNE6wRn~mbJuj9NrXPGss{Tlz=ZM|i;VXb)ThqSbKj2G%D&{#x(!Iw6* zbWqzrWyMgvV7W7xUuMEFd@c4@q(r^0IhXK-Xuz0vDJrhGrG~@!G+K!uTCT2bL(?Pm z4toQy7kp;h7t_qo`4xJ_4`ktAzkwXheyPgH5fc!VRjHp%KdBJY7An`3^b3&m{Z#-Q zgJUz#+TR{#D!{N#;@IL#rw$x?$klxLnsp%>G_~?@R*)co8dSMxTJi}CuS{~0${%&N zkOkZI-|0NG%D_Ckso-Y?pHM*(zTEUVuX$bRGH7&)hG7XyfaLK3#{*u{0gc;PpF~S| zsnV?YLU+7a1g%4d!P@;!ZqbUPxtFMgDhKCC3y3dxDfYOplx>@x zchOTc1i+5zp?K`QN5w=x1IRv4bfXy{I!SD2&DxL1keZtPdtl&gc%VqH4xKvixs z`4PTeRx0qrNe!~&U$5&gs|bS?(*#{b7|m8k?X{!ja531?L|3&tz~~AAWNzSFHS%CX z*cVUt`L$^BW3Sd!O0uw|7BUS1U#tqykIRi&{Q_vweSj}66#w;KLTv@i5bRClp%*kX zA<2iAUFjKIM+2|i01+iobuoZ^vPf77u0SgL_Mvo&9|cuzRd<|U00SZ7Na zFP+0z24qvdxC36|>-185J$=mg<=CP5ij(nQTtl$x_g%r)e%V>opHKPu$4BOi5>oJ$ zUuXR#Toz!j-7%w&D83pmhGLdeb3ewH&ahQ)j_~*Gq~BY1u&$9&7mmhjX25vyLFP($ zMc)x$lrg{Jz4EGW9*kFLNo+7=3Vk0fJ*R``NFY04LR zxye_-=FjIr-juHc(q)t=Rq--?lhJ`o+-Ubb+|zs&%{5fc;B4@vZ9I;-p?WIZa*|byN zUx)*LW$j+xyU2K5=#cn@(J^NP5lh!b976Yof;%?1AlSt zcb)P?9n*bOP!JhJJ>Y!P(KVFSkD~7ZP;dpZFsgOQajOuELU6V8q}rFb;whEW2u2A_ z^0_lRB<-WL>hEYJW_W-$b9{i%Ae$!gYSom}jNhm#Hy2=D^T*}ES6P|zd4+=k7<`c; zm0_5szL;b+U*3bye5vJ#QSgGd?%ik0ctXS<&_f+^S%Vv1WRXa2)Zof}g{>MCRRx z;HqLA2wSeC=vG$5vJE6XBlM#a4@v7la}_TK8TQN}?=!tMm49mQds zD@NOVW%3@miWIBFs(UCAK(7>TB)E*$WgUc5_JCN^C3ap2GmA%>ub}0%U#RkX8G@Wp z&ZgE=*MepEQoTds^AH1O#BXTn2w%s0Nt(Id-BS=TySFKy#y{L`b&XkrLt%tk70oNW zv5^Uxt!l^9OxPRo73{2@`RaJ0EA>K<2@7YLVjJkam2DEzcweM4=IYMj`^%H6^*UEM z6ltaW^40DN&PH!eEe*TUO|q1Q>F00MZ=fsPN@1j(9fO_43hdYpWmL{h`H_KGUCHClYIzFHqeD9HBot^dN_4HXr>bgG z6OEcef2^9RT2YCzT>P;D9kiS*Rb$N+4rT`@jS|3OLCAnLJzaoa{uO+r5o6?FIAd|* zZ6syr1WfX*5XKXbpBKv#UUn|N9cGXh^binb8FIv}s-4c)fk9gjo0LP~T_ceyTy%~2gXAjlhDM+xtfehPOf=T2FRd$dUL3l|v#22b z%VcQ;u#(659J7eo6U~(tRZmf3w()`_^;y6xqigWui9Di7rNw8CZuBgeMqpMIkD6u6 z@9?!N&%Vtnu!VknTFFez;8}dB%W-hG8Y8gM4@FqfmcqVqF^tO%0{3w$_@V#DDWWaz z25~Yl;U&HPNd>Rq6s<4bkLw(@u9%|&9tKO8`3zR#EO_BtD0r=VhfG8e zhG&cgU%*v-c_SZAnJHnsb+3Y66Vl=;!peO*Q|5<+h307wWpI|DN#0Wm%j_tTZxn2L zDQTPjZu40DO9=Ds2i9YVgyDNOTOHX&ZSs91zRtY}MT26c=lQkPdxSAYDO;;w<2CY# zSxSwKS@O4a+AY4yAr__2n7c7eL_DtPSJB1FkEhBXa?pjNvkY2F*H~{jqlI;gyJ1I99)2hXGEVRn!X6?@~ zKCTC=qjbOqUo=LsUzwhqsjvnjG-am~itr`tGGES0 z9DLzlpBt|pf)S!8x?swlKAbuqOB6YP^;Ho?3%0Wt}E%9&4HSAG_q>C+ZpBgr}j#-E`16EMQH9yS0=Dx&#H?d&t&fXg9{ zFw|4bn;NJ+F<;LT@=#Cl_<)(O3R~2BssX6^yqcA)0dL}q?>i+Bu{uR=c{$? z_9?zb$C$3}&4mk%hOa1|@;mq|A#3agAH-tJ9yd%4BL!i654-eox`N@I}jw^vw1*_<}cu*9|GCX>!?6)&h|- z2y&ImEBWAje5WI3KH8W$l_UkRJ^wY3TRkjSO6AxubCvNKrV*UX;LC9i^t>d#5`e2O ztXP$oO_;Bl`0`8kvrm3a*Me0)3BGVKt+$*ffdhpvxfvRfQzg>FSI>RHm;Q?GTrq8R zc`3f242dtvfN5Bh;D+#mHv3mw)DtuTtRCY|{L4K^MA|&Ra%Q}WCVLied7~Qa%T=ME zt>R2b^NuqOyJ!`T6>6-QeqJ?;9R>0o&RN0N>HDJO7ZoY*y%~f|B8t83o#Km0#-18EQ(u2rRp@BUyN*^F23xztHU!Yfl$=du)C zuV=!Vugn^&>nw8;Y(8shEP#!i4*Qu_0bv`v;!Aac>c+kv?i%&_h*TIIQ_gF?eklX1 z{a0#+88^;uU*((*QWpL@NCu|r^9S{a`8u8zR8FL?!I(;IsI29+_?pE8`E37>=wT-! zK6afOO@SfjAfhTkuLKigC1nasHNf?o?Rv-Pe0Q$ETg`moVkNtn@}+EJm&WU&M2r0d2oowh6e?67+ z#v@7Y{qp~fuOuQ?7DxD^O>|nXMO0CZl$;A@qjSNxugS0cic=7X9D3qG7?k6O2)+=; zCCHEfgQ+0pRs+^*-p=3)xg!1dsEK_wCx$*h;J;sm7|d5~>_v!%{u_DsjB1r_ z`DdyK6oWF+$Hy{bLfVHNju)}EnnDB@^>^lm-I&FT`KqQ8d|e>7;uW1*D7adlVQvwn zukBdDOG{SNIeaU&Eakq$I>u8S4FUh^Kkwh)7#n)hT^v)Rez@bYe?`-nr_~V+d-gL!_V$!&$ zISSJv&y7Q^M)$Qjz4#h+KD^+t;s79&!YMqn_8zU|Ud4wipnb(E0eVs^YkfAgF~^3I_&F z5yUVlWQZieWMCJ!v9M7P2P^~`!DfOM7Irocjv_WzNWM?7*m%G!96f)64rK1A-^B2W4M z?2pu`!~I6N%HKRFm%<{5s+>~O{HO~QX9ZK^UtcFNSl?E_;w8)~3t%SAWxg6lZn=rb z^0K^OZeg#0mn3zQ_?kt;(X8b`O}bq-*&JWJ0GJ9#rtI7HW75?h@e}#(7qjU4dW9NQ zLW3O*cSj>zMvZ}sva(X7pP{J_Vldh8@RYt(&pgs{mmKiOAp$O}_#4s9t^<>2Kd;j> zwW!?av!goboom=TK~i_w!WXdn&&U)&UON3HatXUF+y7K>(&Io>s3={06=(Lv7*X2L zuo5Rig%vdH2d&nd1@7A9Gngcjh==YHlU2?NaaqKml|Gg zW-dp{BIX2>Q9;Us;vVcAFL^Iqy=nypOIB%4rP0A^r6S6BL-pZ|oLx^TpE@ z6QWi2_a?rYkYRb;%^KDQUlnHt*Il2`m+%_pCLGrx4_TdX!Pa59P|-9KVC73gNzydx zg`0{oWMU31A5WBjK?2n3JLB=BxUPpV)Qzk;2F*M?zAicFjK0H&}_e z%|(7e`7%|VpvP7$Yqb--ax=R-@s$vBD^u#*?`=YgD2{d~VB0QKtR+R2tr7FfsNWj~ zU1xP#zW#UKjj3T<_!=DpmJ7tMbc<-5K%Td@viMt>oyq3UZK!-f*m|$>`g#uq6;WFB z7!u>~@9{EIY=KBeo`pCqipf^NQ?B8K(v}#BFB)!W@+C~X29Z_@3}3o$xt~c4#2J$> zt_09(s+zZon42#|_MunTkcx)A#5MW&_{+*y0?SrM@Ku=#xvbT!m72d1l#mb?SA5%m z#-aZjaWjqApHL?(b06ccX-tKlIRLYS|)TBwLG*h8EwWziW=wozegwPpKXnuk?j z@A|!iV97;f>X9&W1AW$CVlA=fgu~eHRadi4QqEWvUS(igt0{OYUi7_;5-VDT3(?^5 zF_0NH_-f7uLxgTo;_CwKrRt2$B93LRU4E7(^GopJ5WZrLw+jQwylAfUIT(Mz$WHMT zOjj5CbA10Y4?FeHIb;+%xOK?iX!hWgUTDCopF&qBUdGGS$VrK>d`c1I z&!L#DxsIKjak}%27u1jUKH698pP#x?S8N-~TC@+o?%jYFyx2`n_@*}vcOY+wlX(@) z=)xo5l3cQGZ&>|6OldNH2LS_0%PA*joLhbzc(G^ zG-uzw5@3mPoz66u^vRy1=kBmG2i}ZARA!C`b_&NsN_tKW_e=P5O z=X>3XqstZ*uXf+qd+ue`+{;rEg*{9D+wch0J`_|9E{iU%J6VY}4Ylcv%U~5R2$Be| zK=p*LkJV{tzD}02Tq8%#h0%@|e=gkG)|)eu*gl*{uG)bwwzd$<*I67Km|38gyT0){ zCJRx>jEr6DAK)@zttjDNb(B38NLY*Su-4(|0+j{9I2C81`^#Od{AMcoN!5~i$NA@U zeglT7h@qMSO4w;XnB>JbBIe^#HV;;9FXU{{wWQ5%5pC-k z3=&9oYqOY1Rrun)V5i?e6{_%%`;g(>u=z-)S5OyQXhI;SrW*3C5VZ# z5%v<~0V@_`B*)}W#(Q(i+B(}K&hc`&t1VVr!IVsT28qKmZm3yzf(WN2>WS`L^cNn) zV)QrTJbc&x+&m0mbE~kWo!pas82#J1Wt-9u{gtkeHWAr${hIY1jbv|v7l476%tT*# zCaahgt)~*gri#k&^@*>2Y~*p+&w<)k$le(-?X=;_1U}Y;N-a)(ipQ3u!lYX3iySk|qeYQjDo=yQ7?K=Z6O( z$SZ}pPTPi|cvX0VTQ8F?yol8ll3RgBttR*Ldi^1?qRf|$TA<}6j*|lq77^a7(S&54 zw3gT@=p+mPgT()&_W6F~yVjwxxXefy3ytmuzc~T>5hXBRNDRYfs}AvOEB*~~sp%!M z(1gotJ;a};bSVqaEUJ|_t=t@U#Fc&TZZSM>q4mCa6N6$Jyf>Zie?R*=6kEzapQV|X z=@gBP5}2ZIadjB4I_~)pYndR2NaA|`=JxXyQ`Tvi(W-}j$b^_u5qw`Q&J+(Ky z3tRg2d^SPg$$zLp;>FMvzL2nnuBt0T>q<(>S$=~2JU0^3GvG^suAQz1-=Ad;+CDQW zY>drT3$N`(lVL#`>Yw=16QjCDLGMu<@_fZS%(tB%%DAGLjzE%>IF@v1vkw~mWIYqnD z9=n}`0gDBnnHoDZATxtNb=Kp1Mt@vW=cvW=P+v^Jp76Dq_*x(dGi+0M$(KJ9_a0Rh zQu&GkV|lt;5!KucZE78cE|0|1M;`M9eCDe%@x|_Qs#)gg4mrm-rKjEtm zYaVFTa+Fr^N*FjDI-x77uYB3^V$UwM-d+E(eDSb_cw?V^Zrg0|Wq_%Ep7?TmfCFDu zTtgU@uk98xUX`yd1v^XiVcLqCF7R^qHAgtZm+p@<@pTry{8m;6n9~2bbN(Ro%uYoI zNk(KYY_{8Yik&hWd=W`R70kiOh)>qKzvF@s8UW`FerBJ;dCgG&djFyTm z!RtEfF<)O^dS-?myIT0>n`B;mRytYD`(f-jrrkp(gU}Qwoe($69}AN!<H3! z-}6vkiGnR;Dak)C{dEgp`|!mpwgFSVn0`tc1!X5=<&eqEO6T8mG`S^~=&yJW&DY-& zCT<37J!3&_(WIAD5`G)BE7$(!X0x3&zf(Xh&$0$5V0g(dsV4T^*)$bTv&o4niNPsf z0Jd_JUwbq*x~@yt&-yTL!(zMo>}v^hO`=0reWit)TY@6-)SEA;)8Y_*j!-1!xm8@d zJp}PKZX+D;#k2KSPRQ{UOdx7jymp!2*LyMeY7ydLnjcqnVyrn=JvKTgWZOxVnn}mX zD_`@uqBHQN9zjqx3Eze(z@3LQ&*(ATk5ZT_SDw;6lsg)hjy z`51T|$g&R83A^aO?j^>{*GC}>oXQs`Y)V@AlU2rb=T{V5DyePj3 z(9IH?>D}sn|8Vm?iz(y3Hj~nl|Ln#?&PXvan&hyUr5cJ}<5oH)5F~dCFQA37s*X@H z?-`%_VwITy9(QS;MdxA?@zpdGBxA?>n}8BWVnY3VQb+MzvzTw64a~bO^RI8eR)e*c z@n=_6)g}Cg#4pcQ>4zWw+0TCV189^x{^0?-)GZ0bM1ZKe`yjX>2OSmJ$r3_}Ty}b? zF4>4PFjKB*iqOg1q2^>Z6cPP#`EFf)kd*Ae(bfz?oLcCRvfsY$@gNH?$$2~+;js&0 za4Co?L>8oOY`UL0#O$nmrOD`Bm);`!PyNj350HJ+=mJ0H;qvQy1?x9#$_%8UN`;Cue}vE`>zu+w=a{7R4npSXzoC+@)OaB8~l0T>SIjM$}{6k{DdMNIRrmzP)AhuqlVOTIQID%3p0 z4|B%V=G=jEdu(l-OBS9|=(uU~dcmXdSNZaXz`$s^sG*fiqBL_%ejAwuDJDr-$>0d_ zpxL{lU;MxeW&NA)|MHhV`|Rfl?tJg_4^;LeDw9l0nwj`oa}v7tvthZqjgScATEjet zusnd+^c(dSk(f$IrX*TBo9jJHYOhf<#6T;nx)1L>$6j%+OI7FHvKy7><6{><`f8(KHwf#3JB2Ux)AMJqifj1# zIG^cE>F(_k#g!rdp}mJ3hA(F&mam%VzC`_(#lp0uk&FeNG5Gr6{sF#{0guPxz!(4A z$FSlBk{d)OUj_NiZ@%@-Z~o@8HWRJCKuQfYJh;5ZouNp)3#<$J6;H1HcibJ*rXrFSN;>e)_d`F`f>AhH0~d%$s6m9#HMgf zge_mrCIV(Fco+fcN`Hu-z5CgCH^vl9Z#YgS3s1JO8SnfnKc5=BTPz z!bx@zRlEYAlIA7+5g+@;$3AoW@Me9_rIh)`$M2mA&kt4I0amp)r@#eGTTcyZ5AwBA zyuhZO0s9aKGZm)!8E0p!mEGe}VMzao1Ra(LS)@zBW|!!>6^@&Yu;omELx~BOXe&_s zkP}d6FWThpx7AfkyAfNe8tXu{;t4VPcS^5%rkBLUdJsK}g0JYWDzV^&u)ohR^RxBN zT_@M5y>(iKl3+fq56f|tylJwxQbQ9ql1C3A4ZF8>_&+cF`iD_4yxmyWih@an)m;<3 zwz}MvKV|pER=#98wv?e52S;ooz|T$j(t`Zq>&u3yreSHjnTBkeCgruQ_^m5^ znOB!5FJE460NPau%cUF}nu763Po|9TY010r{dhU&YcW%hi@(XrObo@;fHJQL8$$~( zy{8_^0!P|Nb#Zmg-=Hbiq@=V0Ua11SAEDJ8=#nP`vrvD8|FDPMofiQDE{moh)>pGS zj!#{NG8A*C?@jy6I%G`+5gW7X+5f!o>mNGl#n;?pE;TE#UwzMHu|W>Au<~V;3RvXz$CUZ%CLHj! zUBK7%^+!GeUv`#d7GA!%PmlSz@iJe{?RE30=7lFfK2LC@riL75jGEE0n)vd?p~=qb zT3x*5UPoUEFyV!Sw%<+S4mID#HvG(MCYLw#+uz?QC1`S&nJ-&-I}B@)U>&B3<)w;Q zr7A%UukFIVKZ2!gM^?V(48#{fsQ9OoqSVwonaEn1r+oF#4_;j@RaKGvytopd@+FVX znenQPEE?zfCfSNEuwxrO6=Xy~`bVeOj)mjJmlh!xVUny<&Wk+4o*!0C`;4{ehWO&k z#KG4}vcZ?=o~GgJ$SUhGUr70CqJUlWO2Zj^9XA%1+{I_+-57wamUYsv;#=4%{F3Y_ zSuT9sGTbm|lzVD-n5JNwzqgi7QRnRjZkob@5&)>Dc)=GUz=GA2+Lh=uRyEonSF~oN zxbkvwOlIJMi{L|gd73ljl1R&i+{>(?By~L7NzJB<0GKVOQ3kZAuyps8aCNzro~-z* z%a<=t;LB~}F$X_@69cxa$o}w$zx?GdfBMU>BJlOIAOGxUuV4T8=Rg1Xk6(Z9?*2Y; zRCRsYJIwP+2DH~ewZHFZuS7z~7Is(63MbS^7r_+VstZAkxppsqA zY|mxOX@vVIQTDJdf_h14Rf{2>Ba=q}g!zy8@Te+gUP`17BC zjV8ZuLt|2%_c(#p)?Mo?NT`B8CU<+`mDon6Un~Dk!s&~yg`3@>boIuV2bY$U~D+U&oDB6cNn?x7V1a3UMgcCswjtu6N*VmWXr2$F4%6F zA6oL3$(LNZrCL>!*;H_a%Tmml#QEBX;VbHk_bEbOq|?pi<@I*PTctlGt5cryY7SO& zyg$ZkK8VW-9j#gJT*eAMX2~-&4@aVJFV3uYj*%w&(0nZc%+BMj<&f8BzV7eS@5VK> z$E%ArLS))cnTHivHWuyFX>`J?QohoR)O=mLaksKYog5EfU$p3D`ZlVQv4V}U_lvKEqU*kkVCA~L67S*Q>vtmS4}Z`I!DY|G-}u=t;p>OryA_@<;(cFAUZ39l zcg6yS6>E21J;AD6n()`oEyeV$2zZ?ckG3ataemk@{3Yg0=N=qGzh7v=!q}G zWWE?TNvx@3S)l(pIRu_`F$f%qm;OM3Ly_ee4(9~Ht-+S?w3NkiScXUq zh)0wL(6lpwIyj$IArz~4pF&uoOHOG-!7LSg%HMVS`LB;u!_K&V^_Ra8QkMU))yuDc z`SbUG;XA*%*iqt+bbi6tokH@6^E0zV5dY$N#;E2Ja3AEOX8u@`@wAXK!8l9`tu5Tf z6>9j4`kkLAjUJK!t9k#3N7#k@4};0{ zxpOy`E^e)$;r51kR6@+~#lHYHlI6W0sC`>*0RXe(0|x=&vx^&Y>}8}$d1d9o#t!jp zSk5xxvZTGuS={m*>%ZA^Phv@Rvf^PY<_)OtfkfkDK zoEpe4e)-F9{^rm7b>Tu1?Yi5C(A`wMlnnQH+&FE%IMH}_X6MN$TzRrHJU3-8@ts~k zag|nijr3fO$3e<-5U@%JL(gZVcg%*Lo6}jDS=93I1&(nGbhdjxe4@!T=Dp)|{PcG zu21JCH{7<^&5Bnr+dY%Q%6}m5ey^@w)P&wW>o0|A7Ajq4IPt~DWz}XiCcc!VaOfeq z-rWMu=TlzkD&}eORnK9BptF6Ai1=gY!VPi`F%;$CQ0ZJQM9a)K(h>t7Px+d6=^=*h ztglD%Y$TIoPc382_oUbz&29y8=gn zDJMO73u$e@=||l4*c=+BIef|dE??38{2)<9CfZU%>3g+kv59EH6xTrcLM@_R|Gh)V z3*#21;j4gEcZDzL`ePKE_}UX%y?NMaxhb!LQ&zZNgs%<)_c7Fl*GszS(cZhGYG+z#B1Fu z+;|23tEOts&Va8kr+?RvhW7b-v z%DN3B#7rfXb!_CtAU+Efigh!NFmMp?tcaz$AJW3tS^45*$|RpkQS&07QBkE)i%_RI z|58f7;bq1ciZAu7gseGGRl^m_o;pBU^KEq&U;n8)WTYQA62RK+sw^dc1G=>7xsUHv zv9sGV_G*6Z2MAwP-`r`!liEU5I5|p|kwnV$T?!j*Hy7`H$Fr3zeSXF}7Vpq5mf$?T z9BsB<2VJcrc1`_F5qmoH^}clvV4YY^XnB`|3QXw>=@Z#Mym|9*d!Z1s%qVxjUeGRnLrsM1Qg@ySCNH^yzfedX3<4pN??T@v&ytu?aFc z^#=1$sl(;%>NaP!uY~Q;Fuqj^$RmIm+zM9LSUHC%2r~E~n9I9L3lhSnsB#YCgHF;v9suGQL zYT|1ZvNSt~vhWqjdMbmmr7no_H9NG})9UWwD}CP|=yibNa!13Y?|$PKufa>I>#Lu6 zv)xvCu@Yl^XGid*C|8uBeCpwAT#2M?hOd?Rnw2jG<*S-&czOH}X~_ zb^XO!hOaDwW=(ItMyuZPrCr|-H%j2+HCcnNdHI4V^X2%w-MR3^S7K8DsgQW;pTX)8 zUshx0OF)&cPE!9k*^03b5j8<9UuMPL8^s4~DbFhA%S-C@JxfHhD$ELuw6@Q@_nCS( zBGg*;GF*;CQ^}m^5W6}%Qm)jpKyCNrg~Jz@5YBqVHP&xH=hh+SuQSU++3LzGlK?Exxu7YVwW1m*-(W`{p;l3SQs%>My_g=k2%~kA=j;*Q-{vw_%xA z2)$l98P8&+Lsm*@NQcNkuHH+>~@WP+mEvxuE z%iz~z4L0+okvtB>-8Yt-#M4I}L_%W)OlG6j1#nMhL}_MgEG+X?xk0=OM#T%hAZwDG zy%k@)UtG2=xscw}Dz3G*=gz_qUDiduX?u=fQD7(iH4tkuc3ob+iF+O|a#2sI=+=rU zGiLsE!>9h{;j^Rj#y7tC)o;)kl(vQ2x(q{C%kWK@y0*7c=1VT6ktt=7LK?|iu3uLC8#=3Ai!_3SReQ8m2kn3^I9#g7;?)3d(X7Rk$mrB8$x%VLiri2cBNz7Md z(VWD=7aD%%zMSUk-g3t!Y7a-UH=HYf@(=hzOO!B9d|m#;i-&Fa;*Ku_VwiIE>h9*Z zS}1U76fn)p%@+ftS6lG1-%C3Oh051LwdGkBd*VwU)>FP7-cZg)lN)@7bl&*JSHJoT zn(pG@q(yhMmlT$w$4FPX=THi=GaWJBS*r*cWoXTR|2w|WqcIpv{g}4BXx%@eu-IhY zY3Ec-2Q3BB!4zJaFKKOe|AZ-_7DCOJS4Buc3*e-@g~!ZV3P8qe)p)UIay#+0S|Y0$ z5li^8N$NHM%0+}PUUf9slPtu#IKs4s5 z8fjFk(KAYX-8_4~1X%8i0JbqgWAfEPisY@ZGhGP9^!$B_nYx&;!LZ{U<{*F}O*(8B z`ZfpncJPXv7_ZcZJ$O>5AL#b+DOEXrB?H1On(;HO;u|zzBXc9xQ|BL?LF#Ot|CTM^ znpAR_B~(UcLvpY?!%1I`@Wn)#1i>rHZ{B?VQ!I!~(~Z|O7T8q@$f2D?8*wRBo>3iZ;W?#G_zEm<>3x%dkh|O}nnW&1OQwi2(`fbDY7U81Gfe~9OaTRYR8A*Qpo>Ogn{J9DTXx% z!obzDuw*2DkR29{>0;X%SLG{z6mOzV{*4P?8MNO!R=UY)_$pe}UbdU5Jn9GTWC!?q z0bhs4(n^E8+mT%UY=d8qJC5eF!pJ7Ycj4>1lP{z_k3`kV&JA5Wo-K$kdk2(?M`-@i z3-LqPVCbYBe51X}S6uY$GlZ|CKA;TK-sIM$9A0B!CW^squK9MdXX2`8N==eCbcH*} z3SME&gIOX$r}1z&BGe+-hE!&a{K`d-8~t>D|8Vmu667sZ``_N(cb-lj0id_M(i2+MN6(~j_RtIFBy%pu`f>ap<{N>+@&E+iKIiLs~2GwId?$7nTcmz z)-9=2{+17_<{Vbv`|R-|(U&GCd=O9gY9_}>yG&c3wCb3p2g}44Yn!TK?t`21WpJHVLxo$l9S3}5Ft+5Q14d2;b<w5j+!R_#`rGg|MEJzLbB-?3OiYp)l^D_!5``9ewe!r^Y3)NZ z626v?_`1^Fm5tO_GN+b0&cus9PK8RHqU#T+-!ma`S&5EDJmqT$Mq&9%iOQ`#%kZ^h z{+y!bc8zjVM^2buW+>O7DP2iGFnAmysaT2DBP=cDLE(8Pvu zd6;xr)Gq^1>syXlkANdzK$+xpn_arX<6&m2e0N;*$ERm6H;eUFO{AEDv7!3p5byH( z3J98%pH1_`7hn2NQhRv6cA6F#unoqO-Y;hG%)s&{Nrv&K{mB1eQ_<=6a1E}u@<_U< zI5Pt|^aQOx1B?F5mM~a*>eOC80@LCGXH%ot7yV_PoCi4Q z6u9=(dlDAhP${ValKJf=YqE@rrlJBXD>8%9gjWp2gq{Ix?~8b{#=<@7mU-co%fs0diC848NA- zmS!+Kx3o^T5x!pStzu*XhQI#h%d6AP$tPG#NOEJkTtu3M=u$Cqgh6`rL0n&HI>1|! z$tmV5?x7`RJ-#m~?JF9-YcP!F3sSl&WA$Y;BBh52vpQu|nemF-nyxjE*chtL>Kuz> zFbD-n#J$Q?>Hr~gtDLfh$h8Y5#O;YM%gB?;lFeP~P(b;4NwkgfOV->fevX&<=9P?X zf#BMGp51ygJAe5I4@-5o;0u8+zO34`G|~Fv#KJ;FTKGY?lQ7G!mcI*069|iruRAD1 z+uUkMgmw7Lo%2(>oA>e2sxy)25a=(!lIbnH(gCNXIu>-8qB862i)hn!!-Rc%*)(4f zUu;c~ZyJ-=Fy4$+8e7+DWYjjAp-S(x{Bg3G1Q-mpwFa#Uaf7GE_)8o_Lp$Q<&&oI@ z5!yyHADr-Fuu^bCvAL^|g@0n9M^oc9(l$+}?Sxh&WUX$B)gsH>-IDpywOehd#f{X6 z1<)XmTlhkkcU>O;liQ0E_go2IMF-s+pTLVbA(##|(| zj0WshbD$5=AwWk<=SLyF&<&W{`E^M`6y>aArnFmu`L}_T)fPvD3kj$_;qj4&pFLg*VXXXpA)U$@wOIVZv*c@|%X!-j1 z^rFgJZkpGFI2d1FJ5cdy%H?gm_(E*^6;92>trr378sI*gndA4k>DhxQCDB*0id7JophiWZ{ z6KsR}%0!*(L_oos3Vvz~SA!iRU}eVGO30G>#OFRIRRv#8;7uDu^)h2OYAZPwWZ)Gq z2g-7r#nqOX?PXb4WewD4z%dQSFxCwe<;!dts@5`V$XluXZj)uUSFggCr0WQn@AhEUp}(rNrp1Vk#TU-Qx57F9 zxYjZ$pUVy6d)&s7%fa;*OMgCg)2kUrOPL|7rXqxWuPMGMpv*WpF%VK3dl7WwrR>8U zB-IbQszVL&6*JOdEUP*=QtDp5J``)lr=hES#a8^So76rk-w0st&}5En^sU!G#l_cE zReTZDZOGi6ivHlzZO3`O(10{Gh^YKcPMrM+rl>#i;)#AKC}T(*l@0qhAVM z@yRfDqna*f5x`;`nl4C_v6vm`$^Yjj=d0v6%n^Gsfgo;=d{VZpLf9pQU|`dCq4TxO z@))JiOAnqUss>J96k(9HC|~*Zg)%O?+_^r9gqPEn{zdpIUG;8g5NlgT!R^V%!Wa2e zc@xc7Iu>L?&`yYL5iml^$(9RW$8Q^7Ou-heiZWkUv2ix?ByQxv>ssQDg=`EMO|``r zOo5g>+;(x$i{kU9%Q!`vFyAx4))m8qmy)C8Jm9lOJ-I-&C3J1{KddmNBO+lVJy^IP zT2|TWK}i};wBQNVKN4aF1*2FVh)^YA#XM@_$? zVXb_QTL(Q>59W299#`vGX?4n`d=#M-$+ER}W$^7aU(Hw7ixE@;EcT%cUIzI~QCWEm z^5Dx*0G7?YdQv0YpA_p>XT4gm(qZ*Be$gR2J!R`{?_Y?nkbU zujB z%%wpYil`u~N>zm7>o9NAjr(-iNXUo=di|i8aAB4oyy`$iJo7)s_8M7~Nrr0E_qxs+ zNRW8Ti6|@IA;gyhUe?-*JCN7HIDfkgMHCnJ9TU^gpqnCZTda+E8kYMK1CV0p5ww|9 z9cw4Gc(t_7@(p$AfK4W1b5t)8HRrITB37c7QsxV(ff&AUAC5vWpH{WI`8s+<|CW)i zrjNy;$w8HQvJCLHvBTX_pR&rEw&vB6eHZZM z-n6?aFLho2IFs1z$;aqw*rmM@;l;lRxtxkzs2B*#3vX5f*~aToKh1IHH#`tgyATk3~%Zd+6P z#cXrQCH6L%hhDYFWnS{jNt)cbk?~tOEE%4a8J#Xw=?sjz%RNb#nRI2z*tq36Vd=c9 zbgg8(0H?W@@JZU&5kKO%eMOViNXR0};)@x$E{cYh8_pTEm2z&_pc)!M(!S=N-C!}& zUQ-aDY-aPIc0OGe<#5=}mPR zYn3hvN9(w_xo0HZF~V10aHm|1qQ3@+!#ytWc}C_>{7CfIR0J1_R{;!3K+`;3XBI6j z#W7q3sHAw6Eh(`E^LSG;DQ`N*X!+5e7-P|(qpYdK+r>P~IlfbRFLSUOiQ3=OE)2e| zck550(px%!oU@H5Ygq^4XjoCcvf?klX0`yYx5qg@H4CsicUkj+xz~xB&d!d#oX!;F zO^!wK=~dogiK9a`^VH{`ux4 zns|mawNpic8t23p-(p+wNXs^)VWMYmwSE1TfQ!LttaussZ~3~kyZvMUR)L~UxfJRO zUZD#;r|dZRvT(B8rJ-_Wb!loM&Hc)JVYOlkGVC0zZAKsS^~r~u@bwDT(0uKMExra@ zvlJMNmaOe~Za16mhQvm1KKu3rzaIGz(|exFRv*Hp?qIrC?|hTlCh;%>|Tp^_=BSBTZuJmjZIdq=Ckq;+1?rzOv zmF-sXO7dlFmI{^CS7%}D;EUDYPFBY%xC~%1IenQ$440ZpTFRF(rn4Jw@x#OOZOitr ze26v>uLanZJw{yuY-heQ=aPNYb%MoLbEMdI@uIcs-k$cLKWSIC!B>q#68{|j6k&X{ zgxwIoo0WK6BHov;6y4P#>TF$nnVp4){T6Y~1b;-&*)PT4gP}u$m!&fz!m7c}X^gq+Ia=yRQqeJmm%x z$x_PzW{sXiU6Y~z=8LWO82j8auTPYn#H|ym;7XExLivEDSF7YWL?<1ifiM0Sz`94g zOcG2ql{2>{%m(vdRZNT* zvatl&XzWn3;)Sg*i=B7SJ%mx z?L(7hu%f&Wb2vFe>h$mcfIxr0{lNv#=Gf7H_=2i_ej7v^Fo~QbyEew+H7+d4#xTwU znD`N2Eu!G52;(#gU>C@g7#hA3q~MlBTJjOGzb*t;{dKQlVas5ve$6K;QNiNj%}XS? zaf^KT4zVgW?&Icjc!rCep!@ur=eQ=(e_|n?JLX{v!+gayOQsE?lc464R^ck#l7W~; zwkt-=!tU_FPJAKZt8rz74C1}Mapv_)F7(0LqUoXqKvwq`?nIFkyb2!tEX>y;PBX;Q z`p!GzAFxxv`pOd@h6>UeuUxb?{tgN(Jw8%AX%RdIIeeklvN(x)7BH3%(HtI`ua?Mb z<%E@t!DYp-ij6WY;!cQm<@Y~!X^a71Jj0=6q?FB#7vfE&$7nBL_cUy2%gqwUU!-Vh zcdNoa#w@0Bp_A2T*CLRpW<_}EM-b{fk>WCn(R6|r)rO+P6>{FS#UrQ|gD%ByyiisL zn-B-0rB3_(4Sab)?(NY!GXNVbzBA=xwn>v~j!_%ZI}!q2CuAkOc^lQ2EyM&NW4(v0 zXsxXAaEr2muRNl~8I`^fzTD=_XJ}PH_%DEEeIoZhgDwku@uj}Gr=;uoRk^LsvA1HCRsWJ$b9GTU(;pWK6qiqdw`V8hJBm)Dv*b`E0C z;#)wAaZs8fO(S51$sN%@_z zt+9-tY9_Z~RFLIDLR^LIh7YrkBj6Rj*dO>>Dz~6sB4Xs1~ZZ^}?XUL223 zz5>fQr3d1q!`R&2o*ejk1z!2w&)p-AgGQ6LI{~(cc$$zTn$5)t4c^{L^UxOJ)_i4N zT-n6WE56u4)uLIx>5_FEzK~;D)mVe!q_+lhgTv1oFKtTK_a5Mj=fNX)8tCN<=C~TII-58EHD?VnY;Rj)fkfnZn z6arGKu`3H3FKf1}M;r@smS-0*8IJMT%RG!Tv(cn_%xn7@|03o{T%Zg0k(jmmyO8k3 z3M!VWF^@8y$A75zMS!7_Fy>kTfnL&BRv{O(2&4EY9d!4(us4wl_)<_4{Hg-m^{`PI zNb702d7T=Z)sSDLqQD{bMwgQx#k=O9S2ih9DPs3Ta4=dR%zU-Q@@YFRXZo?o?HtZV z*;n~mTwLBfJiK|9OX~e+QReroTEK*)VT*YaT*6D*TAq0%tL+g1%aRX__d5xL-Nk1= zmMmXzlHbsL#Ylv&huog*oziE>k9QoT?V-9>@WCn1rsavN5j!nx3d1boq0?4-@%32D zSe2GVfX(M_%`W}bWx8V^3b?Rjm~eQw@D|j%AivfC&!k6-tkcs8ktTDsB&YJyqPTnLoZVcX3!feLsof)c2hllXPsugHbN@59)wi}Uk!ExyF zNo}3?%iB-v`GFa*!NWF5UG0bRf!BbEjUTG=iaC6MW2Nam#8X~}A{SG=b`^hCLS+T)g%j%kI;HX=1BqhbASa-sd`&&yA58MZxut8Ksx=>MOOEjMz^!gws zuB+F19yS{mT3rl=tf8ER9c`T(dIu;3n3x}FT*|Ur9Q;o zVB|-+4@dZlRE=>qr|!01jr-&ym$!VbtwD2t=FavtuiHVC3F8oP%J-IG>fY>RDD7@e)ZAWDriY`sRBAd#ECjqTH zhcB6X<_jrb*k93D<;!Uv?7f;ux@bnRHM><}hRPRI#6v&DlsLAd;Y*s6)Boyd!NniG z^d0dj#NlD%$9S<}i{P1$2roSdUg9e=iSp%~Bi8{dL4s;U$F~MqkNGm}J=--;%9jtq z)#O6-vr~?F;463`;p;|P>;$p)!X(^o%a?G|$l(^w!k07M6oBEZSyI$XpGu_3QJgsh z)*Ov%Lv``hIoMOaN|*jM&g^sR@CIcs7YeM^ z%hf6A=TukDPC+jNw%1$AMkZnW^Dz^1e9Ym43`09LzO4QLSj}-DN`2X0;p5kA0b!S7 zb)mz4nU+ZAyK!2KA4%=Qbd&As!HA|YSH?+Vb}Wf9MK~E9kqmSmiuDLTSTykUp}Oc{ zON1FqBW2@IgTmzk<|7U29}$I#@-BMyb0^4xwU{-~AUI@E>jbu{+*%ji95P{~Z za`2kg3PQRb7!tlJu?P7dypqSE6kqt_g%K*)xK7o<%tkdNb#d6-HD_rbx!1a3^aFfL zo%4^TU=2+6t{BkdCskLZtOEjHlJEpk2%F?e&G>TQ`Qh^c%=RHz!PXl@YgQtBNOc}_#JHpZ^pqOH*{!xX7mIHgH-qLy$iA|D0`^Hw4O z3Spbwbj(+PLz!k(RL08waFU`}U%K*JKv~= z+>j|mA~{dz;WXuukvJABLV=B?z(#vEeKicWzJV_=|JbLmj|qXDc6IH?v#sqoz&SO7qz|Fcgt1)CHa zQ7NS0O?s=U+<9op_$n<;BV2X~-`h;P0P8VdY@sWh1uZK%>3q@ z8AX7rHACO?zPFk$0FzHig?WoHy|tGf{k1z%Kv_!bQQG`|pe2zFX$Q!DeSiPvd!J=B zNS1@NU!JwT;A<}h#+yqUhLcMfQPE%cv72OC_0>vN6|5}m=3qO5w(5q2dSjeR66-5# z!`9I;qDHCj@cI?yOJ~s?DUlL1eA%EOhMZc*YA&`Ii5k{(7~#k2q?^yb@a&6S)^&l~ z{w^yaD=_{n#&*#+_%$+%y|_tw9MonU3#9N3?JL*U?N@DO(Y{jlX3t&mUx8qG_b~KC z$)%Gtz$<0qGRiNqoQ?IB1J1S*gV*-K#*%Ao}teY#{{leM`;qPN)?UgVjL^#S! z&0|~t)J^X<6s96w0xWz*-kiYKYV-2thHsc*n0Mic7EWw4hLFjj<|*X~DeqQq44yP-^QS~-=k(QK5hXk*_3Oe?zT zrQ{qy7-3rSB}9=<2PZ*>2?$mYSK;?#AEL3wbj;A!vtf_{*lAI^Ul^ab+x2KV413?0 zShcCy<4oI#h_5pa(j+xnf?w2tMJpv;7|CAcsflx}#7Y8QH`ogbh}^mk579~ZvY)VW zi^Qh9WX}onC3ll!UrF*-3yv(lB<;okw%hQ^x51XEuv@EiTZQZuW?e{E-kUOg_qgY8 zS7gL(*VIqU`EzR^CikvdEN~%d~!hz|Vi9Y@By z%i$r2M)C^eX}@C*%| zTW{*@nxH>gR)$14l@6w{@5GlaU3ud_Ew6k;CZAgyC>9pzrnGrz6nptWNN97mmFr>9 z4^wS9Pp=8bN5fBa#_h&3bdqMcywws}iQcCngG1TsGR zrG8WTJA1@lm^Z}VrbM2C>C5T!@Km3Cy4@kM8983x;G4g=Q5X94(Ol_Pb0x-wuQnZT zP12Gx?$CNCd+6@Xd){v6##9QX+8d{%HT>aKIdKgtoJ@gb(*A>z zk3A-0YnH$Fu#IOU_DeIlWq)dORm=v-;X8aub$T@-#v*{iEq!g=3=Wx4oQZYNixW;Qr}|rR%2U| zIy6lbl2aV_2)~9M8<@$3OS;Qg88am5?sdHvs8I-1kkVASD49dXGEc&oPi{DBrSrxp zw*?D3xg^0%(xz>T+BjX{ebzPIH6Vk->sYeU)>*zj$|1b%{CbFg@f~Sx*`%B_Y)ooY zl1~!_py$H9mYVz1TR-_4KE!%#o9e6dFMAH*M+=9n`iJ}GMI6k4)$viMJu@vd*xlVj zTiPUV!+xvq^)XMvJ;cW`_{uU#=Iiv3Q=R^u!o2?VVHhrZ^RI8N`Bf1QTHfo2Ai#Xp zR&07N)?fHy-G-zc4gX=lLi}vb@nqvzY2H$D0+S?Pu)dfbhZQ}>9e-NQe>w5RL7X#j z!jCh>jg#q4uo#~HG*<1rvsI6dBgS2bMJT{7CcrMllww{m)hKiLswWY;v<+$YX%S|=@Np@Mk8tqvBTOTbHDarC>s4sg(L|mOTMcy{iYb?QI90Lw!soO^ zaH|XhRw?A=VXw8e8L4y8*hGJsFZEKcr?)$@{In&#?Z7ytR82aw{t90*4_*7C zyd~!~3oJb-z8Yv&B8vuZZZAX^AAI<-%8Gr+M_+A*pRN5<6m9V`WUFmE-AwIo$_D~1 zNmDmgNs{OVIs&&rPYVTmP4ryc6+sccB5-5dg*r+BWvUDq8j7K$Pfye6})F=GtH9WR%OXB@8jI(0>_dq?E%zL);mzpZ5{|8UWwySrD%JNRm;m)t{I zy)vmZPG=qqC5*h@UHKa69I(Y#`QnypkJSZuRg4#MJ@|6JOEjj_5M2J#RyS(eb>M3$ ziH3@~w=he(+{#z4SmjRufESoGkPg+(|Aw!$1c)hWJp;$ta*{#RDkBDy`pU3;wYqK0!n`>&TVqqaGV4rLziBXEA8|Pl!lqNO^2K)I zOS^6b82{pSlsG}ke)yQ{o zMUZ(@M~BTsVw-kvkh!6G0PVT#*g#~sh_AYtnYc$>53|#pOG%_L4uQ?>R~+b1>O&g- zscG#XFN+R0iO($q7SS{8>PbX2FguAJrw=wlAxi2*CIhj0%-c@M45`=DJtSI8h8x;T z>hwy49g07@8!vhaB2+&ii7^2>n`oux{}p@z6GW}6z}O%@ zC-~NKZk>oPmapM9F@<5al1{+8C^52EIQ2bmedO!0y!(BqB{k8F-MzI(G4N~=wS-@A zi(?|D<-j~EOO!d3F|=^Pehr0{op`7l?TO8Pf9ASHl89rwiV;grwKv47@nl(vP4wh= z-1bwv>~Wj-HXTVWc3rX-%l428l{_ccp>P}oYY?KCtj6l#XiHB!`)iXH zf~p{7SZ}4FVXyKJlZfYK;Ypb4`~;LFKP*7D9bJCfv|LxyhnMp9)n3 zBE}8_ad)YEtlDet9_cRzUjDn%HTBzt{jDvk{AVr>^QGvX-U1oLmh$ClH>KI5+Gcws zT$L}QHU!0`IA;0MbONzc|9+K)a^j0| z`5J4P8K>~Yx$<>bgduz(=}>sZ+gHAB)X5dVfD0uikS4wa*b~0|{$ru}R18G(#RDz- z8hl+Qy<7jn7l-C+7QSWyD}AKW6TEx{CuhfGi+G2DczmfoR%(H{8!P8_IV!7Dgzba1 zSMXZD@BbjM{5KZjexDnc`-|3Rx+`DuKKO29`xu${ica?wtSdA_mTDwC`H}*IFYQk< z{dz2(y6~ZPMS)bRIGAeQstT4>0m~BCYN{%a8d^v+K-Z0HR#MXtQ-tCcy@`K0MJk1r zT@$F2FP;|t1&Df>v-PMTSp?w+D$_-$Ktk@m!uQADP;%f?u1+_fxT|##hkbOEX z$*kh#+|Vem@THcmw!{t4jX6T7wyQ}9UJ)OOFANEvvl}sdG4fc0tLm?KcCFWtIP!&Ung&<2Ldl0p!cH&E9jdF2a%7ng3pmt<1Fk`=2GamUMddo!2K z1}?|ot+i`q;E-eYYcESTkd0W=rjmdQXJ}^0D}HFcd;|9E6;63PlBT!_3_+)u4+rjm zbK-@40%NT5*!-suF$nx~Dwfef)zl8`-~*{MIz|EXVAbsx3YXmid4|f9m%S=QMQb>O zJ?D0%HR&*Q6te0}5wp#DEDU(-M2LL6=LrE$rce0@(V@7njl z@xsYhX8?mQEgZSzm!T|}_+qB-eNx(+mtmrWz5c=awO}f7qQrISvcv-syoXd@Z$0?Br`y94b^@z6M_A>!X_!n%@j@*jO>K?VPs% z-)0SUH88PxJ#~^*We-_w7%in}7?2l&H_*U%9f2CMr2;DON=f~v;foLld>s(74`06E zZr|$%V93K^Q+zM;Ersa$&<&?|D8dLFTyqj%sC<1-|Bzfn8Lw@=vJRHp8n%7fDDKqW zK4XG})`9wA)J|-GL(J^`!NG!-#0*1G7n-?rqM^~%j~+Zz>L%*+2Vw37047JD);WCP zi068yM;XGL)^U&5iu#&4<~+-E!&wD0#P=3mC`;KO5Wd<~d2PS=GkM2B^A*7sg-qys zMv8x&a>+sx0 zenbN(k2)TRjWosVB`2P2FAki1_+UtDW6-h_zW8hw{R1O}cy>faeHGY5?vss)m21$D zE_08I+AKcv9Of!Bh%vWgk9f%6G&ME{Quhq9sVj~AR|J@YtHhR+yE$!BBJu%>WO-6( zdmlM|m;io&v-wgM+j(=PL|Ril+J&_Ct7(V_-R$0f2h@V&v6*z@hi){Av}D642Zk|X zV(hsr5mJuS&Pra)YMHErwg6n54XMSL3NnNjX~H)oEh?IPDa4_C4e_-sUu4$!im`md zrKZo<ZS2+vJOj_-Ey71P>eNa@IyY!17hJ3YZSqSX6r@>y$m}!q=y|W!B7>0SjND zzU-s$m7=uCSA&g%FEx|tuFRntd!NY{c}rfgj~bVseDywe%wXd*;vE*ZwEmSf5>?`@vLNY*lHT^hSF-2FGFVO*g-$M__kB2K^W9HA z`Q&4T=;a)oQ>M9c4abv@pFZK0S8l#`x0XmIo#E?^lR+pbT)k34JnVrVbim+@|dPD(7OdNcn)3AW_<7P6(Av=k;`zcq6Yozh_Sg;$( z##V#!^)VxlR3swTai*jsomsE-<5MWGF;d*ntIDR#C`l<$=8%A4LLh=l*O`7HlQx4O zwO~@4i>5-)wJD(HOzLdYZoc-ipHO4-?IV>s=I})e$+;Nz+OHOm~{F zXZ}_DMS>lZubUV;oH6=4f+WpFixr?H-qEw)4m1C%lh}6j8rXn&XO-s{yg_2WKA|xH zp<$+At23Urvj5>$5BP+U&6s4q)a%feE5S960V!D;)db9IPtHa!UmEvuA=9Z(NOLn@ z?+q8ga%LT@Ifs+4#63_GqFQ?5pCb<;&7on94-!PY}BeK6GhJn2{$LaK4atU5E00v4B5B8kmigRdAaqAJGA ztc^^LWQV2;VphUrxZn%S;0pe`n;9#JXtXF^~lwg{3bPFJ}_Tls(AGR zTvU9gu88GpaMXAI>Y$M6>5{I;EQe>+Q!Ef&cT(+&s*lZAI?xt0jF=b-Oan2l0$cza zaY2*}-jNB_K0Sl47{YEF7`|r8hVM2*O1CQcl*#8cU)udr4>lT7z8X$n>r&VlFWkV+ zZXHB2Un}vIXrg7ymAu63;#Ew`SEC$0imwBSlaSYygMICe z@xs%E^E2)w^t|*-sXD(dUe9k%P0HU0abyLZUL4MxL2D1$fTi`Tn39>ZM}H>1uF@-e z_=r3F9)XnfLuOwO74O=|O|YmankQSA&U~$naWQM>(1}-f2$a@{Q9Ank<#+ zdTdZ)*lfqv%T;YB$ig#a$lk(|7Xt^Y-XbO}#mk(`)<)Kp?|!N}lzdB1n-b)Z5%auh zNRM)GfiB2|FDXAn`Dzo6Lio~cEv#jCg%Mv|^1!Gob-w!qjD+6C37^?Dgemgm6Q)Se zUF-y41GCo zF7V6g*>QgC(0q!Rv02zM{`Lmyp$-kwGeCOPYFR8+%xX%XrPJCq+$%E<9(w(`N%K5? zLCS@r14;UQFkD1U!1x-!uXuM%AqUP5(KIBF zbii?KUIxnM$EcJYsu#2n^YgvsJFNkP7hhaId37As@OTPUM^SXOwPE<{Gvi9uiZKGQ z=F^i4Jc1y8FyNN2?r(%N_o@@IssVdFT0FHMW|9y?mwK}pu*p~KS87zWM*;c%s|$K3 zdq#*9J>v)H^h=#x-oN{Q@5c5IMJcnimD`!^z-E-Nr{*CRHes0?sFiqUM?%VfNLN@w zTN(v`7ava%Sc$I;80wZCuJWbv3}$$0Qoh{Jw`qIvvLFeAMthjUu9?kf$Vg3>;v&LV z{lk=8ayVR1xT@hN62EV+>jHKl-Zy?YTd~f(VuKp9Z0Xo{8+spnl}2}uIYjmi1r;#5 zf*=K@S-L>&ea$IMpv#5{jh7v}Db2`u8WwA2&?mSNgO%#M@)f!qMC@{NTQ|(2v!&G@ zYAP{iiY=rZ->`IYaK35_^|*@w_U3{;tng&di7Z~cZVDuyeDtmRIsM1pz5nROlvMuh zG{oj?K$b&@@a1dxsZ0}**6zow%hI=FzDDQBU4r!Gi#&pd0*uekK7N>_-lrBLRMHrH z#>gz4G+Iz~l;E7)rzCj9ruFsgsm|c5fel8YFg9Xg?pYYA=no`yuUpH;&nENm%R0*8?Y*U5<25<`22Nee#eqGSjSSo4$?Uv2QURBoty@gWx} zsj?Dn1?rzqzAVBV<_n{BMWvD^3s>5ZvE`o8nPtA-zQ4(nuaPEIfLPM(Mn%JZHGUYD z+>bun?J)~$g#m84_==Mbg1bwA;_vTF4u)jONHp$RKGCi`(u%m=cgBsh4>xP^_U*?DB$vH{RxN=m=llG$nkw{Bm1`Ztp>opvu=q`iPYMvb@f1 zip*D5nfC|?`iGR3@MS&dRg>qN=i%-yhoP&DB2Q)Cix)B~+Zl$e%?03+-bi+tqn^AVXpdkT}OPoMb(g4*6o7*LGq13%=44JDY)b z^@~{MTo`LY3d%v)>2s9e1UB8?J#bqhQWupfHX1;P8sBG$-1j-rE zN8+{KXh@`B9>Nx4WxXmpO_#EcakR6`Jw0$I9)`j z3{%XU$W!|A($UXW*CaP&pXrZ2$cgfC*srlJ5#WV$7`z@6rAP4)Ig2dK&>U2>a1hUq9*vc4rTNz7 zA(Y5v_CdYL3(MOEOj#W9_`nM#Qs4MI@_LtdP2qVX=s{WL#*P>!GJw$?+i)S_#YtlU zSGe>U>lF*e%e1nWXrw$%>CSo%ckc?KI#}9vbuk+FdYfYIG;+}1?~c4cFl^4h6|S(QAp$TV7RZ8CG9ym?(hXlW zU?}zhSI~To4gxP>$hi3sTgT8cZ;9wzFL$)4oGMH4m6jabYoueFFEmSIbRw2G`07t< zn}keH?U(QhOtZgQS%Smk{HIcphPwtNHlciON8;!691`v%Vtg% zuY4U%yar%h|5CApZC4~`Bz#%?WxIfom9MsuGFUs#mRS8_qYN9u>T>0dL{!#2#g0?y6Hkb0%hqtcDP+N0PAO)n1;FA}pRE6fhnA z?sRXIf607>FK#I;%ek$cJtfOW_6)D-unCxkF<+6-HDfI@Y0+i7 z#qA9P&Dik{Ede6TAjc#E<6Awy5x>KB|C(rOSW5#ypJw*l%5sXu7vx0SseY*AZa>LSHSGiR;iB0n_jm!qSR{ zf5?{0_r%K}klUN4On`bSm0L;NttMaR1F*}ig9$x-{mJw%iL4yejG+YT_tF6|eA#+& z#V2~Kd^2vHnJ*?0PUjF|0LB(8Zp9Y=LqC^*K`O26&uNNi(yp0W+7UpdK%B-lduCJ zVLRcO_PT~8MHEYzWWI{lQa#z)he{nu3|MvE7<{=xrmH%ha#%wyV*6^;%t;JAsEF4O zzEJttgcXR`+;0vgLi~)i#2+Nqkh19TN+AuIs4@4r#@Wp?P`4@0%sHIp1k02#_YwH=Y;A>AldZyoFkj20g{Gw8gq zi7Ga{vCS8NrSh_TNyRIB7+b#UIS(ge)rL06_A67Q%#ExTHUroW&fpHF7QnLj6})1= zCS{dIO+DP^Yc^mrN5*+JL`><5C~{*gj$p(g(L%V?&}^++h_3lMop_D?gg9*udIbU{ ztBHgDK8!+3V<6jnkzO?bi>GM3>Pv>Fd`DX|C;P&e|F-w1%@SV@A(}4-ID(lc=Bfzm zDn6i5ba{b4B)(u9z9_G-!0Y<@&IdI4T2H}R?PZEmKsj3VW>B+M_}r>Pd;ykH=rkEy zp+t4bwc6KGvNXf=KP+Km=XwR1yAt+rOu-VID_wjxjOTycU>C{qWdxOp8`IW&-=t4@ z8_WWhd|-AFW+m6T9MX5TJ;bu5P$8eaUh@UPPd-hiVLJh|k^Ejv7UCEi>aM$;d!;{C zc7kb_tZt-IKUR1Jv>;Nx#FI{uhOl7S#LUVqv1hzuzRDM4nJ*zU+x%*q%P4>i8@Df> z3|RQuA3q4`IFKYQycYqN2#UBl`MQU$%-0nod5r0JqpHj27Zgwf7kG)Ub|4d9mv=uj zyZ{Ur(GWSgu(Pf*Hib8kBn~A*JCUq`+%&n<_LS`gy8tkt@&|&ghBu_s>{~CeLfHB+ z5)t`m=HZqeEYb>FeqVD8QO(`D=Y{IV#O(ZF96N1n8=E3$hsYO6yH$k zhKdtvs>LP{_lYiZ)i@&N47A`2Ge%USc){2AltRy|Bw-cy*SThihlo9)!}lLb-o{^v zA}WmNX4h%oF!@4s(RL1p4cNIKTNbc(xEqr%ZSF*jLp_ok<1kpFtV>|wOI&U9|Db%$&ZLevhObP{)X`o+(;=P#V9^F&Ra%3ZC}`^RHIVHmi6hw< zGIf7NUSal&{gwFQyunvo^x7|eAVvAI3)lu<CG!qJQ^V@8TPWPzGO6nc)1=!I2a5MF)=T zjAkvzK3xq_w3)oE6ORcm=PSnkuNxR9=#k3hZ9PIsMQmteocy5UC8Ov}iuF2k|9k&A zQ(hUKkh^hsw2K^56hqW(VAHdd&hsBp8hnsxaZoyXh0Ei zYAZ=<@a1B)(Nzk*yyWcMDa8;s`2r)t8&|It&A7aLC4K(+EAjQ^4Q_V$uS~u6J*o5?0mLEN`!Ixr z#N3E0q@2aC@+|i<9zD*St7z+mi{>&hDk{L=wuH$B~sKnVK z>BLEYoC&{hqN;Oh2kYSr{}3@ZOUG;_ zBO>MW+*1w*X3P6BL)V)h@RGO)U!Mcmi?>8J-hT)M%l{ZKreSx^qb@k7E2O8k_v{S3 zZn0PRI=f&>+rI?AeuIYF$V^UfO_?rEor)Q-k@;P|1XG9#Qz#^L4R>Zr)P{5iNiR!T zEQ;ANOM@w1){rB>_grhqZkFg};)m7XYf2mKX|LGqKHGE<$(YYPUU#%|@np6y zW|Zh>w=XL@gEgMH&XLkIELQl$J|ldEt5k#~S69E{450y?SlF$uby#L_7N>wvPXr4K zRxd?Z9&M9R3v#vTWOf6?0Q+x=+9X>OEodUXkz0N%P1A_)h_9>B+{SdJMF1c~B2K&Z!&btNJca9ep4TocID5NC7hQ)t9^q zQo3LTT8P6j>tN2k9|bKg{;F5VQ3_Bx`!1S%0hl$`x6@0pe4QDv`>rbSgbTvVmjTPe zuhU$1@-_Bg4qs;pRf1Rf`q0v%{{CW^r(m6Xftf#3Wtj}bb~^Tm;H>sV_ohaXzxeDp zxf=tp$aZWfp$;EMlSJdyu7TMHNF&q5m^?npYx6eVz5=!mOp&rPtoWL{^Bq<=iM%?9 zeTl7N20WhQJA5{V zm`$4!>bD07Ut(w$LlchR$a1QMPD?oRH*W4OVoN#pM=;WnSl?{PBtW z%VdP;&=Piwu}oODP}yx7yx6jLn3X6Mj9i-sv`Vnz?^o0dpAN<^F(}of07@6~- zDWq|PBq-%UV^2=Vc}C)^ ztuXbz-`w;=_^ST}Q;N*b4pX9Km)pD{CxVzMSn;ainrq7GosE2*MKNOaN$$1A1}QUT zzduH7RMwEW?1n{(&A0|Lv$o`KIF@+QJ)5|;yqjb)3{PZ9!kGi~%|2U20JbV&#mm;t z+p3ItmWH)oLt~dC^Mx2TtPzqj87^Sw!E9kER-fe;Z~WnAM~Io1tCk>)4;6!@#i-W5 zF17B3+4{mR;@cbD3HvLVu)BA>_t&Ud@rWB}i?8hVP`t8!vpTP7TOF6L;AJuLICHU& z!xwmouiCE>98A3KRFoYIzIb8U4%p9Xe(k~DnG zq#{t9MF}d4FPuY}uM6>Yz2@r!URVAbk_qE?7^*gOVNJeFRyV=yU+l=sl!%!Fa6#9W zf7r1O4^cDeo}!jpG60-ZGNx@n%7>e(ZY!XbT#MUqwA078(~b_=lm?BgXVq~W85|6KCyUb~S&^s5T}=HK zUk8soUR^=vP_Q37ngphed@tP&}1#y;v5ApuA`YgHTV)>XpnWDH_B8v zD|Lr5O2`u3k~)eRr;Akj+id9-p&h-vrPq%f-gxoDXD@`;7q9rZyv6IUI*IJTr-~i0 zsuinz)ooVtV2l^ix+MZVJwVgSaAX3f{9ldsV>JNdO~*px{N4>f}? zF%N1_m>{*C6k3eXxPyQ%6^~bVLou+&$>Go~ryyGO2skGNs;z=oBR7%_ zXTzurdMHxEepN}EU*{4p;}w>#v)7Hx(+vW(11(%x*@FA(;++LtSTFIV`PZ9^7eD-5 z?qPx(A6!YwKP3Tn2fz>nm9L%fWy!4wUnqdBTSqK&YyV;SGGJ9vD`43M0>Bj1nD#3R zUK@O&^2NDr;Qg9*ibnW)$$4ZRqTuH4*vUA+EtG=@T-=K33Qw~Qhi+Qp%dOhF_B9o} zguCM_v$00`!lY&=&330p`7!S=+B}M{vTN8PGREPnO%*{`x=6;M zf-3S1UlCnE4R+XGO-(a4o82S|8JQ)n$aSMcnO51vhIAABy8TIY^=Ev6m-Ye^Uso@F zF23HqMelAWUw=zBVc-?vE=tr`I=}>8jc_bguEG(GoiLl-kr0R4-IS>*=t};SUOJw6 zCFPfBJtH}R!K>-#>xEr^AelO4@X_dk60fvFB$Q#KYQW?y9&%UJ>Tv)XDm$swDT*gUj%8G4{9*8MaA;nmq3wx_*ffvhcY}KdnR?;vi z^2ofIFQ#Tq)$r1V>qeI6wNmBa1jJ<1nxVL^M|lz96>`iPb00(D%hIWYl`oAwQh1|_ z%V%y3wtLpRx2?^A6V)hQy$oN!`N7rY=bvA`dyj4-^Z#Hu?4zqIyVp?GDJ}L3imv(W zds^H@MnsspKRUPMwI9ht{A??QV{_#C=6z*yH+h40Wv3}^&Q!}O9L=eX3)UQ?ga^3c z*Yn;E%Up-n!o8!!SPamfLc+hl&vS+PyqYkQc*9#2Riv%)iNVcc?pPA_#dd*G$}dFSCN_7wwyp~_f*1+Rt( z;fbYP_n`ZO7HHX6~Xh`eA0p<$k9EoeR8v2V0{h3v#N4l6Sw<#T)DD z-KDZN1lWh1GyhLHi67x4PU|JW612Ao^D=a0s6toLe-|=f5M;i#^-Kplj{G|{UwXkk z6<+|>auvB@CNC;qD!H09_FkWT@RAzkm*oq<%9q!}4&ZCuV~hv~e07_>_VBf+xU@Oj zYIDPP$u~`M(;6>E;fvB{)1^hN)_|=;9L|7+D=b)2j1FDCBD0+3h458*H2I2vs#QD) zxCGo-eNJ{%SVMv4g(SW%0W8rC-Q4D@D5^nxOUWi+;>%4i+n?Eh;OBo&4vrpUB1ZaC=TP;^&||rWe>v(CVDZ3TaDk-(ad-KMiO6T#QYqlzrY?U%6TttNt(L zTc<3`2F#~4IjsF^Bev6xZfyIG!rLuuBLKt=X(UbsBBUF(U)xRK?0hnCj3ayLpzMC1 zU@>&P7FXg6u6#fyiCf`|Vz0MMzQ{WK^39tMrM8p?ukb1+)5o*`Nrut8e+T2{UY{6`XUkz7C*ICNvE)d zcWA^oVXin(_b+i=+b_tfu0Fcu>z}U;lT4R|moLc9DTIY0Nw$hpA{^`a7<-F7{P>g4 zwhL8i&1P9xf*gh=#8`c?B>}0M|9Ft;*{R(qMfS7MynrvW#SxnXX#q?F%Q1R4q&Hwp zzeHEt1O%(8@)baRww+rzuf#!mj;QJKOI%djxMj_yn+0%UOk^Wl-qv8*>$P)fzU=$P zD0^y#cm`D1RU45*;Ng@`PZ7*TojMgXp6NZAIqMp@gcvu%-QbI1`HJsZzS2=@9jd<; zW8-br9^w1gs!X~VqBC=c{lX#q@=KBRCAxZl8=3!?B8eBVVUc1iBeT*`|bu6BfFvB{*QSUY6aYYp+V7-5L8#?@I8B-A<~9&} z<_iTEx4Wr?nu*DGD1qC2ahZ@uZ>PZk<88hWeG(HZ$rrV`=*W=7iiNM`Qkz))zU7FmJC|zm0c#v*W<_c4j26B;R~(vKWdT#Sk%%L*`_QG zO4%}5bD^53;XUWEB=@f8Q0t9iJ&vVAhp!E zE@R?rlQ$72_YlI~UsASA1oQ6g!tz(k`jwnVZ7UX6o`GHh_Ak8Ew%`8xXa5(?IobgQvQ4aJMBJvBbcE3<%_Gq*WAlw&%%$h-6|j%BSQGtF!(|kubs}g zIC^BHW^Y7c<;+IcSsE|%t3D~zA7%zh;sxlZW>Ie+fw#w85dHV5CsjBgq0kewu!i& zB9>8IPrj}MmOf?2F4Z*Z)!p04*S{|1B&KV?J4fu#24LHtS!)t9)gjamLCxY80<~heMaanhqi(J||!LVEQ$7u?$`r zhOctz?;>p&FY}cK-8v~&-`HXHei3D{Up1S2j|b+)*mar9yu~VKWWp3)6gViUPX&xa z2&j_rq50Q|6F9nuMm$4|S6Kru@nz2)k8x966|Zf+kj`FZt`f~Ucc*PLHT6~(?~$`N zzSIHiUhvlW^FQ9b#p|mjblhnbSY7hG4YqmWc#jQV(c}xTYOp3;>*?42)5+JsD}EGM z)k!>^e2KR5RSO{F(Pp9DadW^GhL?I*RgjEr3PB{YP`sR?dKqTxLLmTpSZARBuI%b zF{Ob%Q`DRhe-m>Dcu-ZYx*`_7;#qDBD%CFi9UqzoT$6iczKU0+c~&GN=B2MoK!zalYkEaWIn{_$Rg<6it$8A9G`qLi@?g)xHMmsSfXyHa_Tc^`E_W% z8Z2bM?WnBjep;mkFX%E}jH`Nw@U@cw2L}UI`&B&_ZY+^CtijVkZPvYL+w%Zsrd%ZE zFo!Y9$}#g7x2y7TT@V?XFIy6|VoP_7?n=%@;u~Bh!?!q9 z9`#1Q2zi2L6)~rC=reegF5VWAF`iw-6x^^c7}GTYgDml-fT2cj#TF2a#EiQ+%Vp?^v<8isCEkpG?wZ{gWCnjvIWjwPpAMsLx<3lCM}lG4c4ADh57x z=aOm5`0(ZmE&~ZHu^cuxL2EY_DuS=sXVlAIp3eyH(M=X+kCZ@E!vp<%>AWTNg>YDPj0!}kW$^CQS zL3Twf35ICR*X~XhmvIOirI#PLGh9Qb(+|E}58Z%%_!4rA%od*tSJ+hQvX2NCQEt}! zL@;7q;J}H7Tl;<;R0-HXpE*Nq1fL*$1MY*b;-cSU@Z!0kWsS(;%qL7Rzv&wf2VhV& z5$hTlT9;L3`?2ta_`C8~o*5feTtU(_GL9I$z5Mwf{_yc1KKaSde*L@K$=AP~F{M48 zt|j4>bW)VYu;|1`E}a2zcH|;UKJ;18G6pb;z~IY(@kTx3^v27Pwve^r$e2T;+?kHC z@U;wJ2U?-!?4UbHEHX{X)C;_1y;$-}CwffNOxe&Q@TI7tCtx*Khl~#!Gn{iSER)uU zZ7Si9hf+RC_)omK9jYakMxWo4W=k3`C3|&WKCOi5Le`3jRu{gMCuSrdDZ3KIc5#O! z%{5edJm|H`zesjkC3up&VKkFEW#}>uipw6Hi$|^_l}4lM-lhSoGw%eO^Zm^>QpTz$v@gD*?1KKJ zcp0Wl#Ncb)bfbK^;F+dUst|E}+-Xuye5W`hUf#lZf!i+RIJ={Kff6^iLiDX`1}fk* zN$TvjVG5m}AHJR(aFv402U5|~B3COytM0z+tPEUU<2A#EDiZKz`BKiIX+S`Ro^)FW z)$MSpJ-;>^w9Rc^if^mszeHD5Jg znOuzumHL6B?6S*8Vox=TNbVu#O}L4m8lgohM8FFaa+iUtm{rDHz66S6i|giX047|h zXTgFQtmb0GUcr}$qBdF{WW)BRY>)H~pCqUB@{n2s9Eh*ePQ<#<+>Y^q^;WW})ExC%JZ3go5gky`;4zGW4KHeb9umN58%2SP(i%_h z#Vhgk;_fY8|6#edIe{ZQaow8fKU9S5XW2oH*lnH&|Qnb zF2C&@TMssZ8)b+)0Ss;MwQl6W9rIO-RV!7(!0zoe5sV2~re0UV>#cf-V!UoW!~eX# z&W0=a4%w_whx+$&OPs?!EZGXchJ#qX0BrDe6uv&2{^5up8X+m2qucW~9+rlZ_f<$E zPahXJWyIDU*yvudb^sg9C|?C^lP{O3sN=7jX8;G^IV;BQVtaoia+qduTi5_ib_>c} zH`&frC@G1|3)TOd=slMabFb_-4S7b#R{EhalP4%gFLsH0#*G0Zh83JOyvj2T)=YS+ z57@Hij?wXWY%1}@<5Yvme8q5a&as3wSg5;!3KcYZ^j==xxiww?d9@GeT>$F_iHRaQ z2ab=8Nq`L4(u+5(Pid^fgzalOp8P0an}Ee^HESawv)qw?)y_&tUD{SU&t3ZCqS^Kk zlgJ(qlFKHAQu#ujNV546@I%-!f(e!0AY}ti%+kb;%3l!WS4ZoUKRUE80Jekvf+G4Ie&N0SWb{4&6kt zo@1`AB?y}Ng)lXzTpBCc@Tz?2Q$0jUmH*b)Z}Ivs3Bb-9LqyGNGh-SXF6E1Q*Vyny zB^c+{TypdhYN6WXEB&NqwNr-5h5#=EIQUxm+{D@@;d0t}oSi=~W)ffl9j0oea1<~n zL`}kYrsiMWG!Iio)r&2f8`e|?7`QBK7l?%~J`}rWYQ_y`{5}w03BwQv=hz)#+cUNH znImNJKZxbhuOXeQ&6Ob%U;LBuR+HFIA1hy|a8-qgk>_Pw_r+6zJT`Alf*R7r(9jse)wW&eJbhfQju-}2HsJ~Vjv2M^5`^N8ao4{;7r>1q*} z-o@K@RJ-QKW(7IqaV5MOQdD2U1m<_M(IT(_gL`G$9R#r1A^@h8Gq2z}VC8YO66hXt zgy_BFFfv=Zh0N1>+V$xJ)Wt5Hc_;x!@Bi9viOuy#+$mP&E2KO@X~?EHpk2WDhi1#? zZl?=fldnbzV}h>TVzkASXfsixA^NG{IQQkd6j1v2*Cdz1J)Sg zYzO9b6-!As?D$Z^HuZG>0GyZW ztrv~g@6DG~1Ln1^=FQ{H>Gmkd#2*Y(G##Lmz>cpW%Zc(fU+Zpb{*<^Oz|0pT_rt+r zV%5f5fF4eKeqF=1&O~9r!7C9`rdU9M5}fxaX}e9#+$gh@{i;F2M>k(~_X1d5^;)p0 z$ro~KQUo>C^)_FqP}woG?%c)<{|6$Fco)FXHGD z@iXFW+mz|;dKUkdvT~-TzX-gLFvAt=>w5uTI}Xw}vA){oOWdVXJ=X{-EdjQBPgzw^ z3Z}ANE>dm>)6|8zF-Llkwlhb_BgOtZKllN=xAd*xq_UZ_n4cwJqm7t-e1bTE6!p0Y6!9v0$7R|E)m_?%9jAE61YE_bF-fNm&%{-?cnP&hiK%>U;4)6>&|V= z@PDF)>ZMs;WXXQD-}8#92e3kOuf5N@k!ASO)zc~68k_J*Cy@}VS7q6m8b!kr$K?Kj zfVS4_MtjQ2Km(~}LsfbJ;t~UKtHdmV0ha6+c(DtMx;ua#mgSd@fC@PT8d+orRa2=JNt?q*Bs7bpkES2c;)LnzIu5> zu~n-!=BUPKY#uA~#leo?P1D5QTr(X?mWEDVRkn-gNPjDCE!!5oNvgb#u z)#}bE8rtHPuNdR-)u`a)3u)37F}4Bor1aQ)`62UF!IuSIDaQqvb58A$6@oG#Ip$JL%+DXG;A;qmFj-7F%GVS|i|Lp7Vpv0E zc{JTco&8wbXlD-v#&+ZW#NN5HNLK`5*hCQ2z{o@}Fjxf9Kt$MG)CoirV?jnR*klBg zT};hP6hzES4Ftiz;14h`5dVaMv9Zs4>8TlScmr?eo!vft&W!7ApRcN`tEwL+BCkk? z9JscGDrnfR;FP$0!uQxSJ}Wh9~=1O&7GduY2fC|KxQHRa~1? z-=omkCzeb2_SamZ`ikd;m7;5F9r`y2z##0K5_U`=APt8LO2BHmaai!B;2@+e9jRhq z?nmj2n7sOE`UDJL?c+wV%H!#m_~beP1-^_}`$WlVwMl?rO9(NbIkU;B8u=>$4BjA0 zfaxZY!bS~Y$OcQg=AR*3&5YT}hOa~z7h_I_YHyJg1{5;}uyGh3>n6S|(cp}Dfn?2* zm5dhT7^9Efg9atQ0bbD^{KPLz7QK%`uXKM2TRjuP9^%(v23O}g`h{Ca{_oQiUJhR? zPuo4i?hsiVwP2(lz6xLOn6Cmhd|jBYGqrBz46qc}x6O1a?)mk`4bxkxT^3)+eC6y0 z;T67|&>Oy1-zjPM$~Alen`Y}6OU2>ym%vVX$v>Vby&r=fd_f_M*y=}(++#^TFC zP<-IwD~&?SSF@d%l`rt~aSTZ+ybNDllB;H5evYrb+==j27e0JJ)bPd4Px*>ph`!#8 z*WaqF!cMlCbLq@o{L=5HxrndA7d3@YXR2n^)jRYKDqlPhN>O`sdK$hOEqJ`=pFiVT z6%i%3ZRH?xkhx>=2*O+l#>4bXWClS>L9F3(8ZSZqw=$I>lSN`x$7uM>S2%&9m17KE zk6SzvUoQgJD9uIeDTXuzIoU=|RVnlcEwR9N`9dJqLVi6mT8_o1Kf?{d4Pc^9=woI) zPI1FJ1WYFw#Us>c@nHw%qk4np=uC}pkPWqk=3(mZepSu43#GaY$Z#@KU6BjIETwSj3F~$EDuUR~BD;u*qi`eQSZx{3fyL6tc0fVpN1xU^){APk3kR{5b+O#`l zw=nwR=lSZWBIRw%>mMOjVKrbk{*HrqY|D4ObFyzUe4RkA>Pzo_jf=>8NO5SGVw~-s z#J4>^;mb8E=(x|UiY=YI1q~ReCeV99hUl#E*lHw|)&aftORDvVMg zj|^FhPMm0wIjJDttfpwv)Z{Ux{Om~lzeS|FOUsLC5#f}8mLm_czg+a8$s6qHkg$)*Lgj-Z7Ba^v_`EH^?<_c6G`X6}x0gY0bn!%zR>e5EF`Vh6#Yn00K0 z`7$qf*Wyd=o=+*Cb5ACLoHpx8GQzE2&S?qR3d8u&-~p^7ha1h053F8ve7y zDlBe^j91g?(`@$I2Q`N;#CW0VOKMaWUr9`?`SO{}&VbT{iTDntu$sR^O&Z7LsDfv?5nkE@B9r=*k#i{}GMcV~%Aq?iz3|8#0wU+>&i!uPjc74T7_<{*|b$(SVzS5@( zpdd&%KP3YFPg1|H#tgWc$S+;XhVKUm_eaR5zBh2S08IcIqV) zkY~IczB&z=H+N0sFkZvgIXwmpdLjt3SsStjuZOn!oG%@IBfze5P;Aa$ zcAmZX(n*(2Eh1wYYQ9O8>X2nkz8ZhG40gb%$4T&=Hps8!?RfT-wa3;gR7-kGmM&z81-D2kds zsPERkot3F8!ch~p zd;f#mw)FLwtW{`|W9Wo>N9=hpe6_!lY3fE;CcM*<4K&Bdf`ArYcwpiSi4C`EqjxsT zu!m*8#8mR4@D|lRG@UcJ(w_~o)VWmIhvus%&*pe@yPf<*vD^fb6e~AZW8}Ak6!R3@ z5Q@iq;TB(V7%NY`(0lx_6DKuZ0gMNBvV&J$Mfi!$Vv<=gTb^YDhQ8dK;^hRwb9|ypQY>8~$$7_fMVBCJR3VZe@o!`d+E#HfX-jK})Q*s?|r zAgpS|O3oD4iY%vyr?^DrCalEPf-5JTcheXpbnzr2xpyZk#(iv9BO10%`jJPJ-ppbT z@kSFhMlrA%{Z9*D;G`hC{*3V2vG(gEa&Cxxc_GqVIZZ7(S)i3J)ElvBo)m$R* zn%lmoh1cd9{*#4|SiXK#wQ|>fH^(DX$`>@9@FljQV@5~4!Qf@Ucy7L;H3?s>3duoR zEpH|s2wtFLM{!PC9=;f?CnErLIIw~GWBCizf>iiRxgtay#wB6axkp9tw0Ptb>V z+fFKcwH>l1xosU}QlC&COq{-x;mcsfHzXhaXZiY=@%*tgb6LABm-ino6|LO03c?HZ z{c0*j#L#@zfF06l69up`RlGW1*|7tYa6=clxvu5tMpQF^V^iwA!GRK>9woEMD>0*` zba(v5wwfO!M*l;}sEIF0u=dzwYyB-P#V>pOro)prHv!D$Rx9{f1oQNYUA_uqc|&_>rkUJ#bw3Fk`P z>?!fPRGJS<4Gw)6zyKtvP{4#iI%3r;Vy?ol8nAShYQLps%_eRiy%`-XnPG5Xk-}!8 zc^u~YRy$-nD-pCBN`x#h(&(glq`;$dd)?;HW{c6b(S$YE2{D<&*?TcxqMtUZ&?KVL z5UNT&vvOwZMN&*AQi1Z zSi)lF>+Yc1i#zc(1}xdTs4n7It-6fPNrW%sRe@IrE{m^5@3B;ft2VFTNf%Ux*`E)+u_*LpEgAOqK!t#>j>aN`*9SX7;zX9RZ6{^+lCHps-1J;vFE_S=qd;O@awL-V4{Dqj{T zHUER)2J$m?$-#iZm#FfQ>PBp8sB6B2bjdoFWY;mY<&u|pJmWK6xSvGqTYTX{5-d~~ zVbW|IH%3^Ps*^hhJQDao2|+qNs=7g^yU7zb9GS1J0l>dV_=uCXo%MuI2IDtn4mnqb z#yhHL4pvqtExBBL^@wKO6q*(|Pmh>-kdPn_P(Rl|gicDu)>lrJ2HKu4&)*e;R zRlK;Q1BeDK`W9b}beObOAVZg;9O6qP$d(^qOW(q40mf_iS_GM|gf!;a@O3+U&F}6^ir624rf?AC`dWUXB>U#1AKbVbJ_BV@C5QNvwttM!Lg4kk`C zMeqf%puZ5y9vI&!f39?fr#Nv7d5F<^GBRMu)8bXjm!}LX%gX=7k?7iISL|!suhI0_ z*y0-hS|#DP9^%DC0Fwpl2H4%FD=g@o!rtl+)td)LP$QEBHS(4hQ%gZ~=i?1c~0*TcbpK`SX=S( z_;kf-VHN38O8^$UP%MNeu@7r~=1VZlB%97Xs@X&dtQFy~gGkYrdqwd%gNB~r26@p1 z$IlC>m8s>BNo$lPlU=^rG*r{4k!Dw#H~Lw**OnG!ZJ}^9N5m5=h>=piY=bp;>6ZCm zx9VCXlZ6|;uXkwU6{I+8sCiMMi<6Wed~h>f|6buEre@-@N0+7w-pLyLdenY}u3XI5 z#1q#EMwo)8Doz$s!}ImK0BqK1=p+JSz`T8hi%6Asq%{^jXrDJkNQQ=tb}Ib=#qg^`Ndp_?iZ5vu`|YxUA(TCa4hwx>ku7A5KIJXt#aEaDs)`uug;Jn>-hT+GoF2`+pZO9U^Lsxwiqf)g4IeJwkT3Xp z_uY5*;;Z78bVCWu8sOMk0Q?ukDvbUc@AKz!kL{q2{RQ(ymr?TtUZV-tzjneGLjgM; z$Tv3Y=XC-BO7bt?^ly8_2N@vL(`47NF`<7$%k&Oq5I|#_op%ygDqZeRj1#p znlI@HMcXa=x$0zb$H)5Q3Om<5 z;p^QKI#*c>u;w62G=5S^WVV%cq@Mjk=H35Vd^H^ks+hKEXcl9LiU98tRB+Y9%vM0d z_XxJcm7s}2(0GK*t=rzG^_|0kNTaiVchORvg)Y6z?FLrj&#+Y8l2m{aDPme&f53t8mS>^YPAB&VWrCu!_NadY;VJ zvyhWgFi>h@p>u(IERlQeUb{;+Q%TgeQ-QVm+emZ3X3ic;FOkA@CA{>i{kllyO2an*_2A66xK^d%LU5qE}Ak*P)ueN z_oyvv((oyC4PVT9lHRb@#>1!a&ZD);7`VoMS<_OXX&dv_Mfgg7ef!|}E4MkPoLj5m z4EUn9a^+tW8IwW*KsuF}Jo|{@#O^bk0{o9Lzu70vrELsY^Y4 zp|%pcdF{EUu|fbddP6#Tgn_9M!%>e5%Q3~JOKPxV6=K3)I2&Znv-3Z-SPll zOi(tvO4Au!(=qWvsz)X@~Ocjbb!agP~;Qt1@VS zg>1z_+`APkuPxi~zbh4m-KNhh&f*sdfC;b?cJ3$K&lT|!0e&m6+FN;_5>tCwi#LSIeZJlA&Q^`>!+ z7<47LSQ#k*Yg96DRe}3Lif;&BeW64G!Nu@=ywcvKS$Rc!)ahDub?BH_Vv^;NZC4sX z39FkMCV|gZ>)lMYmDhh<_bQGk^95a>eDVn@)vTzBYdG8mM5+RU?kX{ z6zIiOl>Ri+Pebx}%!5iez5*^jxXQrH*XA1j&!m*!)ldvyku{jTy>q_yysUlr3Rf`3 zm;El#s+VZja7ypFa4Tz;!e$+HjBI%rxqnVpE}17qTo}zSr8Ri@Ei6LDS_%W! zbcgzgm2NO%X@X(Co`x@u_;OXrPHV4cm44{TBg7Y1Udhc6GhBx-q1VE$fvi8eagD6Lwj$;Ks|?tK zq?X^YA7;RkX7~1MuYG8~9B3QDJochrU~kr%F*Qr9)j+6+E#M#V!Zn8OZ?!DeTa^cL7OSDQX91>>dy#YDWx3kjTb#`-raBQq5ki>7e^7s z9=Jv6puS&!-kUFQJ*UNcc&gIfvBpb$ z0hrBI6MbXARtn-3!T(XJW|}A;-_@3D_zGU)MYC8hK$<^BJaOP6xlWl>;{Za_2)5<{ z*S)@ExSSKU-(15@W=w!VSou2B4VsOk5zpd;ou-;6U1IoJc*&fVF9ct-z7Aj4*8sNT z1zt$_tV1D^WEekij{P!bYQzX%)Y9a@lvI5Nu*M6=e)XSvER>B7a~!}LEdR^BFlLSS zG~UcGe8pTb4rF7$Y`1vPpKS{pZnCD8+nvwrx#{m_IZ6b3|F)SbeDgc2aK01DXTPcT ztQYW$5@7^7`o0UW9YD$Z6JR~QL8eTM9aE#yUjw@MMDu$q7!zMf*>KU?YnA@~BLBys z4W}_Nulv^MVfVAFpPT7}Q!g2uiW#pVEtj~3=(X1fY}~VH)A_dZ16qaUl$HJP(kya* zQx*Pb284C`IVLXqm;x$f%;2iM&=7Zr-R%=kD8!*~AXu5S^zQX>%SkzGv5IFr?XEJT zWb=jU9SSdHm>78A%B)ctBQ+b#(;%Y^*>*9yp<13bJ9oc6c^1Cl0!`B#>Kw0k4fTWD zi9?%y>Lxy>AJ2vu-|Yz+rg%6$Wv5^F zYQE>H{NU|ouTNo4B)+FDyO5c-Q{u}?iS&^z^qi%rVYM8^5md!5?A z8?4c)urem-YeqsCeoaCLW9QY7H0u4l-{n}F&hPhI|C&v|qAbIn5MR4eaUmISVep8Xyqd7g5c*LbwW6%{+Ocu8m zHY5AGA?Xx07G(ashVm7_5~6?P{U;8Qf{NGT>sp>7sZ-ZLq(D5fsT#iU2@O{Z%aRTy zx`J1=_IPctGWy-zPhewGoz@D9S9wB1Rd206EmV1~zn#Jw3L9?u8k>Ggu>L{v`EtOc z`7%_6C@N)OGfa)`QWS5Zh!g8bxPu>j3t!|+b!$w2r)y-F@fnt1z!tnv>rkwsRsYac zpG!m6I>ltwhxn#L>a}9NN(oD{5(zv0R4yp6&DCGC8ViH|sFTW|YYQ80`fWSTU(&zr zQh))5{jEU4gekAy2c&blaxDubYL}J~+Ww!9tJS+ODtx&@+exV9rh4e-W`&Ycu;cUs%<{7^{jA*%-Pkc zE}GDLs#eC7uUUFQNe$BE9ac9jH4YposZvPhPRd{RW6y9FWBHn?|2hcU!iJlEXDIQ@ z_gF6J_{MmNEl$xsm^NgMS2H@oQBcf1$~fI{o6V7|dIb#+5fH;yo0B?P4`PBZXKpRP z!LJGPZDn<&tKpXyU`0HYvs#&z)tkM$9N3!Ot+R@*lCmGKFtdC5r&8#<`vkj4455ICJ?87y+jaq?lg7rLdx{j8I6lV zBu_u52z{%TQTRHx4vj#FLDtADOt96pjM9Wq}Gr>VW2mKqP4tcuA#TWA%;0?4)6!iJmvoCzbz z?_!V&@ET}uDtHnbOWXyfaMEs{Q-ADvIT^gFayJ!T1K9Ajg$+0TNgJj>$JJH3vT|ee; zz(;KF!a@NW1sYT2>0ni+qFzmAo_;#(E|X==^}(%k=%&BINn~G`BfnK07W?H@PQHe( ztj^HDHGDazqjkl>BLl9Buh-COF0XOzuH_Q}tZS-LHgt8X zxd|TJkIu0f#6Imc<9Q+?w=n$R<{NJMt77#pTz=s;Q=rm5oDI~EoZ;IdutYRMRJ_OP z%6J{J&*g1o4QoUB(*3M@ct6f&o2J1RtwCIf5{0f&SZuBFnb`^@-EXcuKLuY5z-nr8^-u5W1Qg(rjZHt;RJ3mjR3E8jS;(b)!D7`;hbbyMT12Jhg9lg4B6P zgZ-{8*KpHcos^j9AM3C(^m`fSdTf4;0a0z8I#fc9MV@J-?`N69C8E=caHRb_vmkFVQ8uG~B}1>#sj{ zyAxkgFp8_0B#~(i?^%qJ@hU*ozSgP&ET#UAr5eRv%|_Q^bG5w@TK8{c{m|ao>O2(% zQB;wTa1kgx2n>#3E{47aDXs?F8y*2gLa?=;;~}oalfDKI!J55yduRv=|G%?JZ(ACQ zTA4X>=FDw=4#^T9FjIT2+4Y6PSEAVCJVd7C1jR4E^@*`EY{9Qb8eC8KQfLJB!xmD< zyLax~=3D(!GyKvIpS`nVabjeCA-c#ckalUUzZA=_qvvo4DXkQ;uC-gu&*WOgFhp3u zcQ;Z&(TAE7w8nT(FPBp4IO~<0o8Z(l`{jifJhETQvjxBI-oC#O+AOCC=@v1uD_(&$ z5l{5zV)sh})HDH<$7O-uD=rhg-YFTBTdh{}Ybe7!6Kc1t=N+*TU0~?7^+HL09I|QWQ^~W8Co5;V+_5v=Te{iI?s1{&5H~(vPnp) z*a(#lb~f1jT2kq7v(#f5<^sm$UUR5mWx>D|klbMw2wJtTEUDsGN{9}2D#1WS!=*ArP@l+3ZumHUMXwk}xB~oIxviuJgO*LBWA}0|Sg%=e z`Ar2bo}Aheqs&+&CG7fO^V>)W({2>SdhWfl?#>BZIb^DYVbLy6fw`!tB^cAPA4afc zvv4g4URu{>QML>DFHWtGwfaLZ!cnU330=BcvD4HIXM>q_lMkB92C8g&)Z(u2A{_xzxX0xvQ1;f<8QG>bj!}iO1ffifXbtvrB zWs*oDh<`lflRS)5yy%Y~^@E)fHh&hnc^E;)4NdDIdg%nF^{NO~S2fXRPN~VqWr<$F zeyzN&eocFnkY7Rf?BAgfW<;-xGhG>|F_v6tri$Tw#jlOY;hH-XdqJJ7vU?} zA|yA|jxn@Z&7VqDIxq!62x3PR%S}~GiW@KzM{>%#@SYVEEKAfvHa@|AQ@Zhxg4ORA`j%1NBq(XjGw!DNd;px8S)$-Bp1GwU#GZb&tzA4tqb{J3i2p+&Ienr z=I@}2_4GQG5f#H0PdXIxE9LppEAtV7+P;iIsv}+z%M#6I+8d!-==roeodJthJbCXe zFi>6?;#brfNUg2v@wnA3gw0=vnx@zbdv*2n>gwgPoR?n_ZI)NNV$K)7AD{h#QcQSn zSrKesNh5+OiXDVDs?|-*9}KIv?*^ahrEM<>ri8FVR`XY)9cQh=R7=dw!|=;P4|m3T zoF>%6bNm9uFSEFIxNeAt>r%QUa2c#}yFN&;id&zv3#*7)ZqM!R+~%)_V*M<^bo;RN zJX9OKWXSMqmS05`*KODEYjthD{Hg$U>DSKpAVM!?i1zF4XY_(CC~oxxwdQZ9vc!48 zi*jt8=hWjZM~;YDG02b{^KFqDhyOZkrwwzZAJ3N)64h3Q~OU z0%7xyQ6a1${C!?0foZShM#LY^tV9*=1s+rUrdP-RWhjbCBA z?JmORAEgQ%@7WBaRIe67*%6SU$PToF5UZ#}F5M*}XUgUsZ%Wd|F;M!sQz~|iQJ`TBc#Az&~G?A<%5Y{ z?$GUX#?8MEA#B>S7lvSR1-Keb>A)`$zbuXQieIpjAFi@%%mFZ^*QH<3IbrkPK$bW$ z01CrUj6LF6!|Pq3hap(Du)H>lM_|uX-8e@tsA=*pg``8?eTQ9uZ~iyP5^qhfND?cE z&0?3qzV5N-SR{`ZTl}(6VT@c`R^L=Yoxmt{Zr@EO6n1r&Zu6f~A#6HIu)Q1P=k!OZ z0a$xsTR@jFYkT+wX-FiYVx8VLKE<$VOq?(La+A}ca8)pVq15sC z>gvs#H&3sQD}!uyFT^`kFzBNSM};r+D!+(d z>&lmBzoxS5Mn|ruF*T-xTR8|0o#0pTr2IcAlvL28;W5%xsqE7!HQp7{0fKjsY@O6ayM@$g-!E$$86ZNuVIIe5KQ4K;L^o- zC>f`@*HGT|A(N*0qKYChY_pkt%e{AwRR_(9iecM&Ex%4vu92(PTTS!DXIL1+Mj`P$ z?;6F@LZ3OJ)#ZCU;Mca#^f%4d*X$|U(|n&{t|zkal3!szP1CJgofS6C z4_S-h(;=+KX==5a=0_@~oiXCrG<8zgG(R2$!?2q-y7j4Peh#fx(=<)fG)>bqP17_@ l(=<)fG)>bqP1F4Qd;qP}v+~3rei#4%002ovPDHLkV1iI?n>PRe diff --git a/JwtAuthentication.Identity/Assets/logo.png b/JwtAuthentication.Identity/Assets/logo.png index 2fa13d7401779c5a113d1a5edc2c8b5c2ad40ac7..02816870c0ca1b9e1bc9f313880bc96910280be7 100644 GIT binary patch literal 19815 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�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 SC5oN^0000bNn=KgovXEY*+KP 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%0A5ROakV*}qlU(Z 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 z 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 From 04e0a20ecf292e704ecd9a6e5386a56224babe2d Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Tue, 17 Jun 2025 22:40:46 +0500 Subject: [PATCH 32/49] Revert "chore: clear solution" This reverts commit ebbf90476da983d7e1b7fec1acf4d837bf2fa63a. --- AspNetCore.JwtAuthentication.sln | 168 ++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 5 deletions(-) diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index bbeb505..e1ce8a8 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -5,7 +5,60 @@ VisualStudioVersion = 17.0.31919.166 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Core", "JwtAuthentication.Core\JwtAuthentication.Core.csproj", "{5F9739DA-4676-4B13-BE6C-5F5194AFE812}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{FCB88633-BC91-4F64-8BA5-00C43608D012}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{330BB423-781B-4A8C-BBC9-2F95B5349B2A}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.BaseAuthentication", "Examples\Example.NetCore5.0.BaseAuthentication\Example.NetCore5.0.BaseAuthentication.csproj", "{36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.PermissionBasedAuthorization", "Examples\Example.NetCore5.0.PermissionBasedAuthorization\Example.NetCore5.0.PermissionBasedAuthorization.csproj", "{51E0C282-0942-4367-95EB-F248E80A5D6F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.WithCredentialsValidator", "Examples\Example.NetCore5.0.WithCredentialsValidator\Example.NetCore5.0.WithCredentialsValidator.csproj", "{E2BC2C97-161E-41E4-B224-DFC62AD56768}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.0.BaseAuthentication", "Examples\Example.NetCore3.0.BaseAuthentication\Example.NetCore3.0.BaseAuthentication.csproj", "{6AB1E6C4-563A-4447-8024-6C31C9A45141}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.1.BaseAuthentication", "Examples\Example.NetCore3.1.BaseAuthentication\Example.NetCore3.1.BaseAuthentication.csproj", "{43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.CookiesBasedAuthentication", "Examples\Example.NetCore5.0.CookiesBasedAuthentication\Example.NetCore5.0.CookiesBasedAuthentication.csproj", "{32E74378-AAF5-4CA6-8633-30997453E58A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore5.0.AuthenticationUsingIdentityUser\Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj", "{1DF1D001-0194-4CD8-82DD-40AF57FC1432}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore5.0.AuthenticationWithRefreshToken\Example.NetCore5.0.AuthenticationWithRefreshToken.csproj", "{12915347-991A-4EA0-983D-03121E1C527B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Examples\Tests\Tests.csproj", "{EF8EF2D5-9483-400E-B938-ADDB467BF300}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.BaseAuthentication", "Examples\Example.NetCore6.0.BaseAuthentication\Example.NetCore6.0.BaseAuthentication.csproj", "{DDA26737-950C-4B23-B66A-1733FB482A29}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore5.0", "NetCore5.0", "{7A925031-2656-4CEB-821A-D76739E0E5A2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore3.", "NetCore3.", "{614DB4C6-A4BE-4BBF-B385-C34985CA1FC3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore6.0", "NetCore6.0", "{4FF83CB3-A634-4D07-BEE0-B5391B86F071}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingIdentityUser\Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj", "{28707296-5273-471B-89FB-FA3D6C62CA67}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore6.0.AuthenticationWithRefreshToken\Example.NetCore6.0.AuthenticationWithRefreshToken.csproj", "{5AE1CC8C-80A2-46AF-A02E-BE129080F489}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.CookiesBasedAuthentication", "Examples\Example.NetCore6.0.CookiesBasedAuthentication\Example.NetCore6.0.CookiesBasedAuthentication.csproj", "{E3C800A0-012F-4440-BD78-813FE51F4830}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.PermissionBasedAuthorization", "Examples\Example.NetCore6.0.PermissionBasedAuthorization\Example.NetCore6.0.PermissionBasedAuthorization.csproj", "{421DEC55-2DF8-4DCB-B53D-ED59C15062A2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.WithCredentialsValidator", "Examples\Example.NetCore6.0.WithCredentialsValidator\Example.NetCore6.0.WithCredentialsValidator.csproj", "{2652FCF8-3604-435E-8963-92A4A365FA33}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj", "{C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore6.0.RefreshTokenWithConfidenceInterval\Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj", "{ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore5.0.RefreshTokenWithConfidenceInterval\Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -17,14 +70,119 @@ Global {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F9739DA-4676-4B13-BE6C-5F5194AFE812}.Release|Any CPU.Build.0 = Release|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FCB88633-BC91-4F64-8BA5-00C43608D012}.Release|Any CPU.Build.0 = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}.Release|Any CPU.Build.0 = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51E0C282-0942-4367-95EB-F248E80A5D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2BC2C97-161E-41E4-B224-DFC62AD56768}.Release|Any CPU.Build.0 = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AB1E6C4-563A-4447-8024-6C31C9A45141}.Release|Any CPU.Build.0 = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}.Release|Any CPU.Build.0 = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32E74378-AAF5-4CA6-8633-30997453E58A}.Release|Any CPU.Build.0 = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}.Release|Any CPU.Build.0 = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DF1D001-0194-4CD8-82DD-40AF57FC1432}.Release|Any CPU.Build.0 = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12915347-991A-4EA0-983D-03121E1C527B}.Release|Any CPU.Build.0 = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}.Release|Any CPU.Build.0 = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF8EF2D5-9483-400E-B938-ADDB467BF300}.Release|Any CPU.Build.0 = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDA26737-950C-4B23-B66A-1733FB482A29}.Release|Any CPU.Build.0 = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28707296-5273-471B-89FB-FA3D6C62CA67}.Release|Any CPU.Build.0 = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5AE1CC8C-80A2-46AF-A02E-BE129080F489}.Release|Any CPU.Build.0 = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3C800A0-012F-4440-BD78-813FE51F4830}.Release|Any CPU.Build.0 = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2}.Release|Any CPU.Build.0 = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}.Release|Any CPU.Build.0 = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2652FCF8-3604-435E-8963-92A4A365FA33}.Release|Any CPU.Build.0 = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}.Release|Any CPU.Build.0 = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}.Release|Any CPU.Build.0 = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0E28B79-7957-444F-B437-D2EEC072A6DE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {36F676C3-2C5F-4727-8BE2-8F759C2A3FBE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {51E0C282-0942-4367-95EB-F248E80A5D6F} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {E2BC2C97-161E-41E4-B224-DFC62AD56768} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {6AB1E6C4-563A-4447-8024-6C31C9A45141} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} + {43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC} = {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} + {32E74378-AAF5-4CA6-8633-30997453E58A} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {1DF1D001-0194-4CD8-82DD-40AF57FC1432} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {12915347-991A-4EA0-983D-03121E1C527B} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {8BF217FB-7AB4-4056-8186-2BDE9F3C99EC} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + {EF8EF2D5-9483-400E-B938-ADDB467BF300} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {DDA26737-950C-4B23-B66A-1733FB482A29} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {7A925031-2656-4CEB-821A-D76739E0E5A2} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {614DB4C6-A4BE-4BBF-B385-C34985CA1FC3} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {4FF83CB3-A634-4D07-BEE0-B5391B86F071} = {ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4} + {28707296-5273-471B-89FB-FA3D6C62CA67} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {5AE1CC8C-80A2-46AF-A02E-BE129080F489} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {E3C800A0-012F-4440-BD78-813FE51F4830} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {421DEC55-2DF8-4DCB-B53D-ED59C15062A2} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {2652FCF8-3604-435E-8963-92A4A365FA33} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {ABDD94F3-DF9E-47B2-813F-935C54C8DEA7} = {4FF83CB3-A634-4D07-BEE0-B5391B86F071} + {F0E28B79-7957-444F-B437-D2EEC072A6DE} = {7A925031-2656-4CEB-821A-D76739E0E5A2} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C2026BF9-DACC-4EA4-AF04-B8A590EA38BF} EndGlobalSection From 4a8805779024c675203372e08ff3a993b74cef20 Mon Sep 17 00:00:00 2001 From: Jymapas Date: Wed, 9 Jul 2025 23:37:27 +0500 Subject: [PATCH 33/49] chore(Assets): #67: add JWT text to icon --- JwtAuthentication.Core/Assets/logo.png | Bin 19815 -> 21351 bytes JwtAuthentication.Identity/Assets/logo.png | Bin 19815 -> 21351 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/JwtAuthentication.Core/Assets/logo.png b/JwtAuthentication.Core/Assets/logo.png index 02816870c0ca1b9e1bc9f313880bc96910280be7..50f52c07338ec3cc48b2b9e23cbceb62e8890c65 100644 GIT binary patch literal 21351 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�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
C&n3Bsb?sDA!PK=u6 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�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 SC5oN^0000 Date: Thu, 10 Jul 2025 09:33:49 +0500 Subject: [PATCH 34/49] chore: bump minor versions of packages --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 4e2c054..f7fc850 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 TourmalineCore.AspNetCore.JwtAuthentication.Core - 0.3.4 + 0.3.5 Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev Tourmaline Core JwtAuthentication diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index a3eab6b..1d9df67 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity - 0.1.1 + 0.1.2 Koval Maxim, Nikita Medvedev Tourmaline Core JwtAuthentication From 025c06bf417f64ad21db1e1f1ef6bf63054faae6 Mon Sep 17 00:00:00 2001 From: fpandyz <5389368+fpandyz@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:19:24 +0500 Subject: [PATCH 35/49] Update JwtAuthentication.Core/JwtAuthentication.Core.csproj --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index f7fc850..2f6dce1 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 TourmalineCore.AspNetCore.JwtAuthentication.Core 0.3.5 - Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev + Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov Tourmaline Core JwtAuthentication From 2e2dbee6d2aad0a7f5d03d5ebd138933f7535c40 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 11:23:47 +0500 Subject: [PATCH 36/49] chore: update readme --- JwtAuthentication.Core/README.md | 231 +++++++++++++++++-------------- 1 file changed, 127 insertions(+), 104 deletions(-) diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index 608ccdd..0af5fcc 100644 --- a/JwtAuthentication.Core/README.md +++ b/JwtAuthentication.Core/README.md @@ -1,55 +1,71 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core + ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). -We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. -This library contains middleware and authentication extensions. -With this library, you can very easily connect the JWT-based authentication to your project. -Also, this library allows to override the logic of username and password validation. -The library provides the ability to use a debug token to avoid the need to enter a username and password when the lifetime of the JWT expires. +We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing +the keys. This library contains middleware and authentication extensions. With +this library, you can very easily connect the JWT-based authentication to your +project. Also, this library allows to override the logic of username and +password validation. The library provides the ability to use a debug token to +avoid the need to enter a username and password when the lifetime of the JWT +expires. ## Installation -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) -TourmalineCore.AspNetCore.JwtAuthentication.Core is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). But also you can install latest stable version using **.NET CLI** -``` +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) +![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) +![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) + +TourmalineCore.AspNetCore.JwtAuthentication.Core is available on +[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). +But also you can install latest stable version using **.NET CLI**: + +```sh dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core ``` - ## Table of Content + + + - [TourmalineCore.AspNetCore.JwtAuthentication.Core](#tourmalinecoreaspnetcorejwtauthenticationcore) - * [Installation](#installation) - * [Table of Content](#table-of-content) + - [Installation](#installation) + - [Table of Content](#table-of-content) - [Authentication](#authentication) - * [Basic usage](#basic-usage) - * [Using cookie](#using-cookie) - * [Options](#options) - * [Routing](#routing) - * [Login request](#login-request) - * [Login validation](#login-validation) - * [Token usage](#token-usage) + - [Basic usage](#basic-usage) + - [Using cookie](#using-cookie) + - [Options](#options) + - [Routing](#routing) + - [Login request](#login-request) + - [Login validation](#login-validation) + - [Token usage](#token-usage) - [Authorization](#authorization) - [Callbacks](#callbacks) - * [Login](#login) - * [Logout](#logout) - * [Refresh](#refresh) + - [Login](#login) + - [Logout](#logout) + - [Refresh](#refresh) + + + +The sections below will provide basic examples of how to use the package. More +complete examples of applications for different versions of .NET can be found in +the “Examples” folder of the project. # Authentication ## Basic usage -To start using JWT-based authentication, need to use one method in the Startup.cs file. -In this case, the default options will be used. - -Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. +To start using JWT-based authentication, need to use one method in the +Program.cs file. In this case, the default options will be used. +Then, the token will be required in the request header of every authorized +endpoint, like this: `Authorization: Bearer {token}`. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; @@ -60,38 +76,32 @@ var configuration = builder.Configuration; var authenticationOptions = (configuration.GetSection(nameof(AuthenticationOptions)).Get()); builder.Services.AddJwtAuthentication(authenticationOptions); -... - var app = builder.Build(); app - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); -... - + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); ``` ## Using cookie -This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. +This package also allows you to store the received token in a cookie. To do that +you need to use Cookie login middleware instead of default login. After +successful login the token will be added to a cookie, that user will receive in +a response. Then they can use this cookie for the authentication instead of +writing the token to the Authentication header of every request. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; var builder = WebApplication.CreateBuilder(args); -... - var configuration = builder.Configuration; var environment = builder.Environment; var authenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get() -builder.Services - .AddJwtAuthentication(authenticationOptions); - -... +builder.Services.AddJwtAuthentication(authenticationOptions); var app = builder.Build(); @@ -104,110 +114,105 @@ app.UseCookieLoginMiddleware(new CookieAuthOptions app.UseJwtAuthentication(); app.UseAuthorization(); - -... - ``` ## Options -To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). - -| Name | Type | Default | Required | Description | -|-|-|-|-|-| -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | +To use package you need to pass `AuthenticationOptions` to the +`AddJwtAuthentication()`. +| Name | Type | Default | Required | Description | +| -------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... + var authenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); -builder - .services.AddJwtAuthentication(authenticationOptions); -... +builder.services.AddJwtAuthentication(authenticationOptions); ``` Minimum `appsettings.json` configuration: + ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` -For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). -Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can +generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 +PEM Format. ## Routing -The default route to the login endpoint is `/auth/login`. -You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: +The default route to the login endpoint is `/auth/login`. You can change it by +passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware +extension. Like this: ```cs -... - var app = builder.Build(); app .UseDefaultLoginMiddleware(new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); .UseJwtAuthentication(); -... ``` + **OR** like this if you are using cookie middleware: ```cs -... - var app = builder.Build(); app.UseCookieLoginMiddleware( - new CookieAuthOptions{ Key = "ExampleCookieName" }, + new CookieAuthOptions{ Key = "ExampleCookieName" }, new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); - ... ``` ## Login request -You can call the login endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the login/password in the JSON format in the request body. Like this: +You can call the login endpoint, you need to use the POST method, add to the +header `Content-Type: application/json` and pass the login/password in the JSON +format in the request body. Like this: + ```json { "login": "Admin", "password": "Admin" } ``` - + As a successful result it will return **Access Token Model** json: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Login validation By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. -You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. +You can provide your own implementation of the IUserCredentialsValidator +interface, in which implement your own logic for validation of the login and +password. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -224,24 +229,24 @@ public class UserCredentialsValidator : IUserCredentialsValidator ``` `Program.cs` + ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... var builder = WebApplication.CreateBuilder(args); -... + builder.services .AddJwtAuthentication(authenticationOptions) .AddUserCredentialValidator(); -... ``` ## Token usage -To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: +To enable token validation, you must add the `[Authorize]` attribute before the +controller or method, for example: For methods: + ```cs [Authorize] [HttpGet] @@ -252,6 +257,7 @@ public IEnumerable Get() ``` For controllers: + ```cs [Authorize] [ApiController] @@ -264,21 +270,24 @@ public class ExampleController : ControllerBase # Authorization -This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: +This library implements claims-based authorization. With this, claims are added +to the token payload and verified upon request. In order to use this mechanism, +you need: + +1. Create a class that implements the IUserClaimsProvider interface that will + return a list of the claims that you need. For example: -1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; public class UserClaimsProvider : IUserClaimsProvider { public const string ExampleClaimType = "ExamplePermission"; - + private const string FirstExampleClaimName = "CanUseExampleFirst"; private const string SecondExampleClaimName = "CanUseExampleSecond"; - + public Task> GetUserClaimsAsync(string login) { return Task.FromResult(new List @@ -290,23 +299,24 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the `Startup.cs`. - You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. +2. Connect this provider in the `Startup.cs`. You can pass the name of the claim + type you want to use as a parameter. `Default claim type = "Permission"`. + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; var builder = WebApplication.CreateBuilder(args); -... builder.services .AddJwtAuthentication(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); -... ``` The claims in the token will look like this: -``` + +```json { - "ExamplePermission": [ // instead "ExamplePermission" will be "Permission" when using the default option + "ExamplePermission": [ + // instead "ExamplePermission" will be "Permission" when using the default option "CanUseExampleFirst", "CanUseExampleSecond" ], @@ -314,7 +324,10 @@ The claims in the token will look like this: } ``` -3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: +3. To enable checking of permissions, you must add the `RequiresPermission` + attribute before the controller or method and pass as a parameter all + permissions that are needed , for example: + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -328,6 +341,7 @@ public IEnumerable Get() ``` For controllers: + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -341,17 +355,22 @@ public class ExampleController : ControllerBase } ``` -Thus, only those users who have the desired permission will have access to the controller or controller method. +Thus, only those users who have the desired permission will have access to the +controller or controller method. # Callbacks -The library provides the ability to transfer callbacks for a call at the beginning and end of the execution of the authentication, logout and refresh token functions. This feature can be used for logging, to calculate your system usage statistics, and so on. +The library provides the ability to transfer callbacks for a call at the +beginning and end of the execution of the authentication, logout and refresh +token functions. This feature can be used for logging, to calculate your system +usage statistics, and so on. ## Login To use callbacks for authentication, follow these steps: -1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: +1. Create a function that will take `LoginModel` as a parameter and return a + result of the Task type. For example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; @@ -375,8 +394,12 @@ app ## Logout -To call callbacks during logout, you need to follow the same steps as for login. Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function should take `LogoutModel` as a parameter +To call callbacks during logout, you need to follow the same steps as for login. +Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function +should take `LogoutModel` as a parameter ## Refresh -To call callbacks during refresh, you need to follow the same steps as for login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your function should take `RefreshModel` as a parameter \ No newline at end of file +To call callbacks during refresh, you need to follow the same steps as for +login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your +function should take `RefreshModel` as a parameter From e34af67f5662fd242767e8ee986f60ae5b981dbe Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 11:25:35 +0500 Subject: [PATCH 37/49] chore: update Authors metainfo --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 2f6dce1..4e3e707 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 TourmalineCore.AspNetCore.JwtAuthentication.Core 0.3.5 - Koval Maxim, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov Tourmaline Core JwtAuthentication diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index 1d9df67..c74121c 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity 0.1.2 - Koval Maxim, Nikita Medvedev + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov Tourmaline Core JwtAuthentication From ad13d263b3931d0cd79b3a91534a2ea4ba2b85b5 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 13:52:48 +0500 Subject: [PATCH 38/49] chore(Core): #65: add link to Examples folder in readme --- JwtAuthentication.Core/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index 0af5fcc..245f709 100644 --- a/JwtAuthentication.Core/README.md +++ b/JwtAuthentication.Core/README.md @@ -51,9 +51,10 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core -The sections below will provide basic examples of how to use the package. More -complete examples of applications for different versions of .NET can be found in -the “Examples” folder of the project. +The sections below will provide basic examples of how to use the package. +More complete examples of applications for different versions of .NET can be +found in +the “[Examples](Examples/)” folder of the project. # Authentication From 7ebff90c0e028d75a33f912f7889baef619260ec Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 14:00:15 +0500 Subject: [PATCH 39/49] chore(Core): #65: add link to Examples folder in usage-for-old-vesions --- JwtAuthentication.Core/Usage for old .NET.md | 220 +++++++++++-------- 1 file changed, 125 insertions(+), 95 deletions(-) diff --git a/JwtAuthentication.Core/Usage for old .NET.md b/JwtAuthentication.Core/Usage for old .NET.md index db710b2..35780d6 100644 --- a/JwtAuthentication.Core/Usage for old .NET.md +++ b/JwtAuthentication.Core/Usage for old .NET.md @@ -1,48 +1,65 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core + ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 6.0](README.md) or newer. -We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. -This library contains middleware and authentication extensions. -With this library, you can very easily connect the JWT-based authentication to your project. -Also, this library allows to override the logic of username and password validation. -The library provides the ability to use a debug token to avoid the need to enter a username and password when the lifetime of the JWT expires. +We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing +the keys. This library contains middleware and authentication extensions. With +this library, you can very easily connect the JWT-based authentication to your +project. Also, this library allows to override the logic of username and +password validation. The library provides the ability to use a debug token to +avoid the need to enter a username and password when the lifetime of the JWT +expires. # Installation -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) -TourmalineCore.AspNetCore.JwtAuthentication.Core is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). But also you can install latest stable version using **.NET CLI** -``` +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) +![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) +![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) + +TourmalineCore.AspNetCore.JwtAuthentication.Core is available on +[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). +But also you can install latest stable version using **.NET CLI** + +```sh dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core ``` # Table of Content - [Authentication](#authentication) -- [Basic Usage](#basic) -- [Cookie](#cookie) -- [Options](#options) -- [Routing](#routing) -- [Login Request Example](#login-request) -- [Login Validation](#login-validation) -- [Token Usage](#token-usage) + - [Basic Usage](#basic) + - [Cookie](#cookie) + - [Options](#options) + - [Routing](#routing) + - [Login Request Example](#login-request) + - [Login Validation](#login-validation) + - [Token Usage](#token-usage) - [Authorization](#authorization) - [Callbacks](#callbacks) + - [Login](#login) + - [Logout](#logout) + - [Refresh](#refresh) + +The sections below will provide basic examples of how to use the package. +More complete examples of applications for different versions of .NET can be +found in +the “[Examples](Examples/)” folder of the project. # Authentication ## Basic -To start using JWT-based authentication, need to use one method in the Startup.cs file. -In this case, the default options will be used. +To start using JWT-based authentication, need to use one method in the +`Startup.cs` file. In this case, the default options will be used. -Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. +Then, the token will be required in the request header of every authorized +endpoint, like this: `Authorization: Bearer {token}`. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; public class Startup @@ -54,30 +71,29 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services.AddJwtAuthentication(authenticationOptions); - ... } - public async void Configure(IApplicationBuilder app, IHostingEnvironment env) + public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { - ... app.UseDefaultLoginMiddleware() app.UseJwtAuthentication(); - ... } } ``` ## Cookie -This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. +This package also allows you to store the received token in a cookie. To do that +you need to use Cookie login middleware instead of default login. After +successful login the token will be added to a cookie, that user will receive in +a response. Then they can use this cookie for the authentication instead of +writing the token to the Authentication header of every request. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; public class Startup @@ -88,122 +104,118 @@ public class Startup { _configuration = configuration; } - - public void ConfigureServices(IServiceCollection services) + + public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services.AddJwtAuthentication(authenticationOptions); - ... } - public async void Configure(IApplicationBuilder app, IHostingEnvironment env) + public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { - ... app.UseCookieLoginMiddleware(new CookieAuthOptions{ Key = "ExampleCookieName" }); app.UseJwtAuthentication(); - ... } } ``` ## Options -To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). - -| Name | Type | Default | Required | Description | -|-|-|-|-|-| -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | +To use package you need to pass AuthenticationOptions to the +AddJwtAuthentication(). +| Name | Type | Default | Required | Description | +| -------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = _configuration.GetSection(nameof(AuthenticationOptions)).Get() services.AddJwtAuthentication(authenticationOptions); - ... } ``` Minimum `appsettings.json` configuration: + ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` -For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). -Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can +generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 +PEM Format. ## Routing -The default route to the login endpoint is `/auth/login`. -You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: +The default route to the login endpoint is `/auth/login`. You can change it by +passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware +extension. Like this: ```cs -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { - ... app.UseDefaultLoginMiddleware(new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); - ... } ``` + **OR** like this if you are using cookie middleware: ```cs -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { - ... app.UseCookieLoginMiddleware( - new CookieAuthOptions{ Key = "ExampleCookieName" }, + new CookieAuthOptions{ Key = "ExampleCookieName" }, new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); - ... } ``` ## Login request -You can call the login endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the login/password in the JSON format in the request body. Like this: +You can call the login endpoint, you need to use the POST method, add to the +header `Content-Type: application/json` and pass the login/password in the JSON +format in the request body. Like this: + ```json { "login": "Admin", "password": "Admin" } ``` - + As a successful result it will return **Access Token Model** json: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Login validation By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. -You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. +You can provide your own implementation of the IUserCredentialsValidator +interface, in which implement your own logic for validation of the login and +password. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -217,25 +229,25 @@ public class UserCredentialsValidator : IUserCredentialsValidator return Task.FromResult(login == Login && password == Password); } } - + public class Startup { - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { - ... services .AddJwtAuthentication(authenticationOptions) .AddUserCredentialValidator(); - ... } } ``` ## Token usage -To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: +To enable token validation, you must add the `[Authorize]` attribute before the +controller or method, for example: For methods: + ```cs [Authorize] [HttpGet] @@ -246,6 +258,7 @@ public IEnumerable Get() ``` For controllers: + ```cs [Authorize] [ApiController] @@ -258,21 +271,24 @@ public class ExampleController : ControllerBase # Authorization -This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: +This library implements claims-based authorization. With this, claims are added +to the token payload and verified upon request. In order to use this mechanism, +you need: + +1. Create a class that implements the IUserClaimsProvider interface that will + return a list of the claims that you need. For example: -1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; public class UserClaimsProvider : IUserClaimsProvider { public const string ExampleClaimType = "ExamplePermission"; - + private const string FirstExampleClaimName = "CanUseExampleFirst"; private const string SecondExampleClaimName = "CanUseExampleSecond"; - + public Task> GetUserClaimsAsync(string login) { return Task.FromResult(new List @@ -284,24 +300,25 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the `Startup.cs`. - You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. +2. Connect this provider in the `Startup.cs`. You can pass the name of the claim + type you want to use as a parameter. `Default claim type = "Permission"`. + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { - ... services.AddJwtAuthentication(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); - ... } ``` The claims in the token will look like this: -``` + +```json { - "ExamplePermission": [ // instead "ExamplePermission" will be "Permission" when using the default option + "ExamplePermission": [ + // instead "ExamplePermission" will be "Permission" when using the default option "CanUseExampleFirst", "CanUseExampleSecond" ], @@ -309,7 +326,10 @@ The claims in the token will look like this: } ``` -3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: +3. To enable checking of permissions, you must add the `RequiresPermission` + attribute before the controller or method and pass as a parameter all + permissions that are needed , for example: + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -323,6 +343,7 @@ public IEnumerable Get() ``` For controllers: + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -336,17 +357,22 @@ public class ExampleController : ControllerBase } ``` -Thus, only those users who have the desired permission will have access to the controller or controller method. +Thus, only those users who have the desired permission will have access to the +controller or controller method. # Callbacks -The library provides the ability to transfer callbacks for a call at the beginning and end of the execution of the authentication, logout and refresh token functions. This feature can be used for logging, to calculate your system usage statistics, and so on. +The library provides the ability to transfer callbacks for a call at the +beginning and end of the execution of the authentication, logout and refresh +token functions. This feature can be used for logging, to calculate your system +usage statistics, and so on. ## Login To use callbacks for authentication, follow these steps: -1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: +1. Create a function that will take `LoginModel` as a parameter and return a + result of the Task type. For example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; @@ -368,8 +394,12 @@ app ## Logout -To call callbacks during logout, you need to follow the same steps as for login. Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function should take `LogoutModel` as a parameter +To call callbacks during logout, you need to follow the same steps as for login. +Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function +should take `LogoutModel` as a parameter ## Refresh -To call callbacks during refresh, you need to follow the same steps as for login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your function should take `RefreshModel` as a parameter \ No newline at end of file +To call callbacks during refresh, you need to follow the same steps as for +login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your +function should take `RefreshModel` as a parameter From 7478bfb11a4d4df88687b601f4d96237b2a60a8d Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 14:38:42 +0500 Subject: [PATCH 40/49] chore(Identity): #65: update code examples in readme files --- JwtAuthentication.Identity/README.md | 328 +++++++++-------- .../Usage for old .NET.md | 344 ++++++++++-------- 2 files changed, 377 insertions(+), 295 deletions(-) diff --git a/JwtAuthentication.Identity/README.md b/JwtAuthentication.Identity/README.md index c601d58..1ca8436 100644 --- a/JwtAuthentication.Identity/README.md +++ b/JwtAuthentication.Identity/README.md @@ -1,51 +1,65 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity + ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). -This library contains middleware and authentication extensions. -With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. -Optionally, you can enable usage of Refresh token to provide additional level of security to your app. -Also, this library allows to easily implement registration and logout functionality. +This library contains middleware and authentication extensions. With this +library, you can very easily connect the JWT-based authentication to your +project with usage of EF Core and Identity to store users data. Optionally, you +can enable usage of Refresh token to provide additional level of security to +your app. Also, this library allows to easily implement registration and logout +functionality. -**NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) +**NOTE**: This package is an extension of +TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic +functionality of JWT-based authentication. You can find more info about this +package +[here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) ## Installation -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) -TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). But also you can install latest stable version using **.NET CLI** -``` +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) +![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) +![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) + +TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on +[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). +But also you can install latest stable version using **.NET CLI** + +```sh dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity ``` ## Table of Content - [TourmalineCore.AspNetCore.JwtAuthentication.Identity](#tourmalinecoreaspnetcorejwtauthenticationidentity) - * [Installation](#installation) - * [Table of Content](#table-of-content) + - [Installation](#installation) + - [Table of Content](#table-of-content) - [Basic usage](#basic-usage) - * [Generic ID feature](#generic-id-feature) + - [Generic ID feature](#generic-id-feature) - [Registration](#registration) - * [Registration request](#registration-request) - * [Registration Routing](#registration-routing) + - [Registration request](#registration-request) + - [Registration Routing](#registration-routing) - [Refresh token](#refresh-token) - * [Login request with a Refresh Token](#login-request-with-a-refresh-token) - * [Refresh Token Request](#refresh-token-request) - * [Refresh Token Options](#refresh-token-options) - * [Refresh Routing](#refresh-routing) - * [Refresh Confidence Interval](#refresh-confidence-interval) + - [Login request with a Refresh Token](#login-request-with-a-refresh-token) + - [Refresh Token Request](#refresh-token-request) + - [Refresh Token Options](#refresh-token-options) + - [Refresh Routing](#refresh-routing) + - [Refresh Confidence Interval](#refresh-confidence-interval) - [Logout](#logout) - * [Logout request](#logout-request) + - [Logout request](#logout-request) - [Authorization](#authorization) - # Basic usage -1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. +1. You will need to inherit your context from TourmalineDbContext, provided by + this package. It uses a generic parameter of user entity. This entity must + inherit from **IdentityUser** class of Microsoft.Identity package. + ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class AppDbContext : TourmalineDbContext @@ -58,8 +72,8 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: + ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -67,54 +81,51 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); builder. services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions); -... var app = builder.Build(); app .UseJwtAuthentication(); -... } ``` 3. Optionally you can add the default user to the database -```cs -... +```cs var app = builder.Build(); app .UseDefaultDbUser("Admin", "Admin"); -... ``` ## Generic ID feature -By default, the id for the user and the role identities is created by the string type in which the guid value is stored. +By default, the id for the user and the role identities is created by the string +type in which the guid value is stored. -But can also use your own ID type by passing a generic type key in the **TKey** parameter. +But can also use your own ID type by passing a generic type key in the **TKey** +parameter. For example, by creating a custom entity with its id long type. ```cs -... public class CustomUser : IdentityUser // where long is generic type { public string Name { get; set; } } ``` -Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. +Further, in methods where the generic user id type is involved, you must +explicitly specify the generic id type. + +> AppDbContext.cs -> AppDbContext.cs ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class AppDbContext : TourmalineDbContext @@ -129,14 +140,11 @@ public class AppDbContext : TourmalineDbContext > Program.cs ```cs -... var builder = WebApplication.CreateBuilder(args); builder.Services .AddJwtAuthenticationWithIdentity() -... - var app = builder.Build(); app.UseDefaultDbUser("Admin", "Admin"); @@ -150,18 +158,25 @@ app.UseRegistration(x => new CustomUser NormalizedUserName = x.Login, } ); - -... ``` # Registration -Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: -- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. -- **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. +Using Identity allows you to easily implement registration flow. To do that add +the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` +method to **Configure**. Both methods requires two generic parameters: + +- **User**: Entity representing the user of your app. It is must be inherited + from IdentityUser. +- **RegistrationRequestModel**: Model that will be passed to registration + endpoint. Basically, it contains only two properties necessary for basic + registration flow - login and password. You can use + **RegistrationRequestModel** class, provided by this package, or your own + model inherited from this class. In `UseRegistration` you will also need to + pass a mapping function, which will be used to convert + **RegistrationRequestModel** to **User** entity. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -169,7 +184,6 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); builder. @@ -177,7 +191,6 @@ builder. .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions) .AddRegistration(); -... var app = builder.Build(); @@ -187,29 +200,31 @@ app UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }); -... ``` ## Registration request -You can call the registration endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the JSON object representing chosen **RegistrationRequestModel** in the request body. Like this: +You can call the registration endpoint, you need to use the POST method, add to +the header `Content-Type: application/json` and pass the JSON object +representing chosen **RegistrationRequestModel** in the request body. Like this: + ```json -{ - "login": "Admin", - "password": "Admin" +{ + "login": "Admin", + "password": "Admin" } ``` -As a successful result it will return **Access Token Model**, so user will be automatically logged in. +As a successful result it will return **Access Token Model**, so user will be +automatically logged in. ## Registration Routing -The default route to the Registration endpoint is `/auth/register`. -You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: +The default route to the Registration endpoint is `/auth/register`. You can +change it by passing in a **RegistrationEndpointOptions** object to the +**UseRegistration** extension. Like this: ```cs -... - var app = builder.Build(); app.UseRegistration(requestModel => new CustomUser() @@ -218,18 +233,19 @@ app.UseRegistration(requestModel => new C NormalizedUserName = requestModel.Login, }, new RegistrationEndpointOptions() - { - RegistrationEndpointRoute = "/new-user" + { + RegistrationEndpointRoute = "/new-user" }); -... ``` # Refresh token -If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. +If you want to add another layer of security to your application, you can use +the refresh token. By using it you can reduce the lifetime of the access token, +but provide the ability to update it without re-login with an additional +long-live token stored in your database. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -237,28 +253,30 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); builder. services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); -... var app = builder.Build(); -... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware(); -... ``` + ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +Requesting login endpoint will be much the same, but you can optionally add a +**clientFingerPrint** parameter, that will be saved in the database with a +generated access token. If token has fingerprint, it can only be accessed by +providing the same fingerprint value. + +In addition to a access token login request will also return a **refresh token** +in the response. -In addition to a access token login request will also return a **refresh token** in the response. ```json { "login": "Admin", @@ -267,28 +285,32 @@ In addition to a access token login request will also return a **refresh token** } ``` -When you use a refresh token, its value will be added to every successful login response (**Access Token Model**), so it will look like this: +When you use a refresh token, its value will be added to every successful login +response (**Access Token Model**), so it will look like this: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - }, - "refreshToken": { - "value": "{{REFRESH_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + }, + "refreshToken": { + "value": "{{REFRESH_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Refresh Token Request -To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Refresh Token Endpoint, you need to use the POST method, add to the +header `Content-Type: application/json` and pass the token value (and optionally +fingerprint) in the JSON format in the request body. Like this: + ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -296,80 +318,84 @@ As a successful result it will return **Access Token Model**. ## Refresh Token Options -If you want to use your own values for options, then you need to pass RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This is inherit from basic AuthenticationOptions and share all the default parameters. +If you want to use your own values for options, then you need to pass +RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This +is inherit from basic AuthenticationOptions and share all the default +parameters. -To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). - -| Name | Type | Default | Required | Description | -|-|-|-|-|-| -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | -| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | +To use package you need to pass AuthenticationOptions to the +AddJwtAuthentication(). +| Name | Type | Default | Required | Description | +| --------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | +| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... var builder = WebApplication.CreateBuilder(args); -... var authenticationOptions = _configuration.GetSection("AuthenticationOptions").Get(); builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); -... ``` Minimum appsettings.json configuration: + ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` ## Refresh Routing -The default route to the refresh endpoint is `/auth/refresh`. -You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: +The default route to the refresh endpoint is `/auth/refresh`. You can change it +by passing in a **RefreshEndpointOptions** object to the +**UseRefreshTokenMiddleware** extension. Like this: ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; -... var app = builder.Build(); -... app .UseJwtAuthentication() .UseDefaultLoginMiddleware(); .UseRefreshTokenMiddleware(new RefreshEndpointOptions - { + { RefreshEndpointRoute = "/test/refresh", }); -... ``` ## Refresh Confidence Interval -Sometimes there may be situations when you send the same refresh requests which causes an unexpected user logout. +Sometimes there may be situations when you send the same refresh requests which +causes an unexpected user logout. This usually happens in the following cases: -1) You have opened several new tabs of your application almost at the same time -2) You worked in your application in different tabs and updated them almost at the same time -For example, you are working in your browser application, click on several links on a page that open other pages of the application in new tabs. -There may be a situation when you send the same refresh requests. What will happen in this case: +1. You have opened several new tabs of your application almost at the same time +2. You worked in your application in different tabs and updated them almost at + the same time -1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens -2) The authentication package will receive a second refresh request, but this refresh token is already expired and you will receive an error message +For example, you are working in your browser application, click on several links +on a page that open other pages of the application in new tabs. +There may be a situation when you send the same refresh requests. What will +happen in this case: + +1. The authentication package will receive a first refresh request, will expire + refresh token and send a new pair of tokens +1. The authentication package will receive a second refresh request, but this + refresh token is already expired and you will receive an error message ```mermaid sequenceDiagram @@ -382,20 +408,27 @@ sequenceDiagram Client->>Auth: POST auth/refresh {refreshTokenValue: "eea079d2-89e1-4cc6-a82c-31ac37d7996d" } note right of Auth: Token already expired! Auth-->>Client: Response 401 Unauthorized - end +end ``` -Yes, you can try to solve this problem on the client side. However, what if you can't do this or do not want to complicate the frontend? +Yes, you can try to solve this problem on the client side. However, what if you +can't do this or do not want to complicate the frontend? So how can the refresh confidence interval can help us? -The refresh confidence interval will allow you to correctly process refresh requests with potentially expired tokens if the interval between the current time and the token expiration time is less than the confidence interval time. +The refresh confidence interval will allow you to correctly process refresh +requests with potentially expired tokens if the interval between the current +time and the token expiration time is less than the confidence interval time. So in this case the requests processing will look like this: -1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens -2) The authentication package will receive a second refresh request. -If the token is already expired, we look at a refresh confidence interval. -We find the difference between the current application time and the token expiration time. -If this difference is greater than the confidence interval, you will receive an error message, if not, then we send a new pair of tokens. + +1. The authentication package will receive a first refresh request, will expire + refresh token and send a new pair of tokens +1. The authentication package will receive a second refresh request. + If the token is already expired, we look at a refresh confidence interval. + We find the difference between the current application time and the token + expiration time. + If this difference is greater than the confidence interval, you will receive + an error message, if not, then we send a new pair of tokens. ```mermaid sequenceDiagram @@ -414,13 +447,14 @@ sequenceDiagram else difference > refresh confidence interval rect rgb(240,128,128) Auth-->>Client: Response 401 Unauthorized - end end +end ``` Usage examples: You can set refresh confidence interval directly (in milliseconds) + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -435,8 +469,10 @@ builder.Services ``` You can also choose not to set a refresh confidence interval. -In this case, the refresh confidence interval will be set to 60,000 milliseconds. -With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. +In this case, the refresh confidence interval will be set to 60,000 +milliseconds. +With this value you can be sure that multiple requests will be handled correctly +and it is not large enough to constantly use expired tokens. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -452,40 +488,42 @@ builder.Services # Logout -If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: +If you are using the refresh token, you will probably want to have a possibility +to remove token's data from the database, when user requests it. This can be +achieved by implementing the Logout mechanism. You can simply enable it like +this: ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); -... + builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .AddLogout(); -... var app = builder.Build(); -... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware() .UseRefreshTokenLogoutMiddleware(); -... ``` ## Logout request -To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Logout Endpoint, you need to use the POST method, add to the header +`Content-Type: application/json` and pass the refresh token value (and +optionally fingerprint) in the JSON format in the request body. Like this: + ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -493,22 +531,28 @@ If it was successful, it will return `true` in a response body. # Authorization -The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements claims-based authorization. With this, claims are added to the token payload and verified upon request. The basic implementation of authorization can be seen in the documentation of the package TourmalineCore.AspNetCore.JwtAuthentication.Core. +The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements +claims-based authorization. With this, claims are added to the token payload and +verified upon request. The basic implementation of authorization can be seen in +the documentation of the package +TourmalineCore.AspNetCore.JwtAuthentication.Core. -The only difference in implementation will be in the second step when adding services. +The only difference in implementation will be in the second step when adding +services. + +Connect this provider in the Startup.cs. You can pass the name of the claim type +you want to use as a parameter. `Default claim type = "Permission"`. -Connect this provider in the Startup.cs. - You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); -... + builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); -... ``` -Please note that if you enable functionality for the refresh token, then `WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. +Please note that if you enable functionality for the refresh token, then +`WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. diff --git a/JwtAuthentication.Identity/Usage for old .NET.md b/JwtAuthentication.Identity/Usage for old .NET.md index 78fe3ce..0e075b0 100644 --- a/JwtAuthentication.Identity/Usage for old .NET.md +++ b/JwtAuthentication.Identity/Usage for old .NET.md @@ -1,21 +1,34 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity + ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET 6.0](README.md) or newer. -This library contains middleware and authentication extensions. -With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. -Optionally, you can enable usage of Refresh token to provide additional level of security to your app. -Also, this library allows to easily implement registration and logout functionality. +This library contains middleware and authentication extensions. With this +library, you can very easily connect the JWT-based authentication to your +project with usage of EF Core and Identity to store users data. Optionally, you +can enable usage of Refresh token to provide additional level of security to +your app. Also, this library allows to easily implement registration and logout +functionality. -**NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) +**NOTE**: This package is an extension of +TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic +functionality of JWT-based authentication. You can find more info about this +package +[here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) # Installation -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) -TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). But also you can install latest stable version using **.NET CLI** +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) +![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) +![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) + +TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on +[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). +But also you can install latest stable version using **.NET CLI** + ``` dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity ``` @@ -23,26 +36,27 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity # Table of Content - [Basic Usage](#basic-usage) - - [Generic ID feature](#generic-id-feature) + - [Generic ID feature](#generic-id-feature) - [Registration](#registration) - - [Registration Request](#registration-request) - - [Registration Routing](#registration-routing) + - [Registration Request](#registration-request) + - [Registration Routing](#registration-routing) - [Refresh](#refresh-token) - - [Login request with a Refresh Token](#Login-request-with-a-Refresh-Token) - - [Refresh Token Request](#Refresh-Token-Request) - - [Refresh Token Options](#Refresh-Token-Options) - - [Refresh Routing](#Refresh-Token-Options) - - [Refresh Confidence Interval](#refresh-confidence-interval) - - [Logout](#logout) - - [Logout Request](#logout-request) + - [Login request with a Refresh Token](#Login-request-with-a-Refresh-Token) + - [Refresh Token Request](#Refresh-Token-Request) + - [Refresh Token Options](#Refresh-Token-Options) + - [Refresh Routing](#Refresh-Token-Options) + - [Refresh Confidence Interval](#refresh-confidence-interval) + - [Logout](#logout) + - [Logout Request](#logout-request) - [Authorization](#authorization) - # Basic usage -1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. +1. You will need to inherit your context from TourmalineDbContext, provided by + this package. It uses a generic parameter of user entity. This entity must + inherit from **IdentityUser** class of Microsoft.Identity package. + ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class AppDbContext : TourmalineDbContext @@ -55,8 +69,8 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: + ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -69,43 +83,41 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions); - ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app.UseJwtAuthentication(); - ... } } ``` 3. Optionally you can add the default user to the database + ```cs public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app.UseDefaultDbUser("Admin", "Admin"); - ... } } ``` ## Generic ID feature -By default, the id for the user and the role identities is created by the string type in which the guid value is stored. +By default, the id for the user and the role identities is created by the string +type in which the guid value is stored. -But can also use your own ID type by passing a generic type key in the **TKey** parameter. +But can also use your own ID type by passing a generic type key in the **TKey** +parameter. For example, by creating a custom entity with its id long type. @@ -116,9 +128,11 @@ public class CustomUser : IdentityUser // where long is generic type } ``` -Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. +Further, in methods where the generic user id type is involved, you must +explicitly specify the generic id type. + +> Database context class -> Database context class ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -134,23 +148,14 @@ public class AppDbContext : TourmalineDbContext > Startup.cs ```cs -... public void ConfigureServices(IServiceCollection services) { - ... - services .AddJwtAuthenticationWithIdentity() - - ... } -... - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... - app.UseDefaultDbUser("Admin", "Admin"); app.UseDefaultLoginMiddleware() @@ -162,21 +167,26 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) NormalizedUserName = x.Login, } ); - - ... } - -... ``` # Registration -Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: -- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. -- **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. +Using Identity allows you to easily implement registration flow. To do that add +the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` +method to **Configure**. Both methods requires two generic parameters: + +- **User**: Entity representing the user of your app. It is must be inherited + from IdentityUser. +- **RegistrationRequestModel**: Model that will be passed to registration + endpoint. Basically, it contains only two properties necessary for basic + registration flow - login and password. You can use + **RegistrationRequestModel** class, provided by this package, or your own + model inherited from this class. In `UseRegistration` you will also need to + pass a mapping function, which will be used to convert + **RegistrationRequestModel** to **User** entity. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -189,70 +199,71 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions) .AddRegistration(); - ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app.UseRegistration(requestModel => new CustomUser() { UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }); - ... } } ``` ## Registration request -You can call the registration endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the JSON object representing chosen **RegistrationRequestModel** in the request body. Like this: +You can call the registration endpoint, you need to use the POST method, add to +the header `Content-Type: application/json` and pass the JSON object +representing chosen **RegistrationRequestModel** in the request body. Like this: + ```json -{ - "login": "Admin", - "password": "Admin" +{ + "login": "Admin", + "password": "Admin" } ``` -As a successful result it will return **Access Token Model**, so user will be automatically logged in. +As a successful result it will return **Access Token Model**, so user will be +automatically logged in. ## Registration Routing -The default route to the Registration endpoint is `/auth/register`. -You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: +The default route to the Registration endpoint is `/auth/register`. You can +change it by passing in a **RegistrationEndpointOptions** object to the +**UseRegistration** extension. Like this: ```cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app.UseRegistration(requestModel => new CustomUser() { UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }, new RegistrationEndpointOptions() - { - RegistrationEndpointRoute = "/new-user" + { + RegistrationEndpointRoute = "/new-user" }); - ... } ``` # Refresh token -If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. +If you want to add another layer of security to your application, you can use +the refresh token. By using it you can reduce the lifetime of the access token, +but provide the ability to update it without re-login with an additional +long-live token stored in your database. ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -265,32 +276,34 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); - ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware(); - ... } } ``` + ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +Requesting login endpoint will be much the same, but you can optionally add a +**clientFingerPrint** parameter, that will be saved in the database with a +generated access token. If token has fingerprint, it can only be accessed by +providing the same fingerprint value. + +In addition to a access token login request will also return a **refresh token** +in the response. -In addition to a access token login request will also return a **refresh token** in the response. ```json { "login": "Admin", @@ -299,28 +312,32 @@ In addition to a access token login request will also return a **refresh token** } ``` -When you use a refresh token, its value will be added to every successful login response (**Access Token Model**), so it will look like this: +When you use a refresh token, its value will be added to every successful login +response (**Access Token Model**), so it will look like this: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - }, - "refreshToken": { - "value": "{{REFRESH_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + }, + "refreshToken": { + "value": "{{REFRESH_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Refresh Token Request -To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Refresh Token Endpoint, you need to use the POST method, add to the +header `Content-Type: application/json` and pass the token value (and optionally +fingerprint) in the JSON format in the request body. Like this: + ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -328,84 +345,88 @@ As a successful result it will return **Access Token Model**. ## Refresh Token Options -If you want to use your own values for options, then you need to pass RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This is inherit from basic AuthenticationOptions and share all the default parameters. +If you want to use your own values for options, then you need to pass +RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This +is inherit from basic AuthenticationOptions and share all the default +parameters. -To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). - -| Name | Type | Default | Required | Description | -|-|-|-|-|-| -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | -| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | +To use package you need to pass AuthenticationOptions to the +AddJwtAuthentication(). +| Name | Type | Default | Required | Description | +| --------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | +| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { - ... var authenticationOptions = _configuration.GetSection("AuthenticationOptions").Get(); services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); - ... } ``` Minimum appsettings.json configuration: + ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` ## Refresh Routing -The default route to the refresh endpoint is `/auth/refresh`. -You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: +The default route to the refresh endpoint is `/auth/refresh`. You can change it +by passing in a **RefreshEndpointOptions** object to the +**UseRefreshTokenMiddleware** extension. Like this: ```cs -... using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; -... -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { - ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware(); .UseRefreshTokenMiddleware(new RefreshEndpointOptions - { + { RefreshEndpointRoute = "/test/refresh", }); - ... } ``` ## Refresh Confidence Interval -Sometimes there may be situations when you send the same refresh requests which causes an unexpected user logout. +Sometimes there may be situations when you send the same refresh requests which +causes an unexpected user logout. This usually happens in the following cases: -1) You have opened several new tabs of your application almost at the same time -2) You worked in your application in different tabs and updated them almost at the same time -For example, you are working in your browser application, click on several links on a page that open other pages of the application in new tabs. -There may be a situation when you send the same refresh requests. What will happen in this case: +1. You have opened several new tabs of your application almost at the same time +1. You worked in your application in different tabs and updated them almost at + the same time -1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens -2) The authentication package will receive a second refresh request, but this refresh token is already expired and you will receive an error message +For example, you are working in your browser application, click on several links +on a page that open other pages of the application in new tabs. +There may be a situation when you send the same refresh requests. What will +happen in this case: + +1. The authentication package will receive a first refresh request, will expire + refresh token and send a new pair of tokens +1. The authentication package will receive a second refresh request, but this + refresh token is already expired and you will receive an error message ```mermaid sequenceDiagram @@ -418,20 +439,27 @@ sequenceDiagram Client->>Auth: POST auth/refresh {refreshTokenValue: "eea079d2-89e1-4cc6-a82c-31ac37d7996d" } note right of Auth: Token already expired! Auth-->>Client: Response 401 Unauthorized - end +end ``` -Yes, you can try to solve this problem on the client side. However, what if you can't do this or do not want to complicate the frontend? +Yes, you can try to solve this problem on the client side. However, what if you +can't do this or do not want to complicate the frontend? So how can the refresh confidence interval can help us? -The refresh confidence interval will allow you to correctly process refresh requests with potentially expired tokens if the interval between the current time and the token expiration time is less than the confidence interval time. +The refresh confidence interval will allow you to correctly process refresh +requests with potentially expired tokens if the interval between the current +time and the token expiration time is less than the confidence interval time. So in this case the requests processing will look like this: -1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens -2) The authentication package will receive a second refresh request. -If the token is already expired, we look at a refresh confidence interval. -We find the difference between the current application time and the token expiration time. -If this difference is greater than the confidence interval, you will receive an error message, if not, then we send a new pair of tokens. + +1. The authentication package will receive a first refresh request, will expire + refresh token and send a new pair of tokens +1. The authentication package will receive a second refresh request. + If the token is already expired, we look at a refresh confidence interval. + We find the difference between the current application time and the token + expiration time. + If this difference is greater than the confidence interval, you will receive + an error message, if not, then we send a new pair of tokens. ```mermaid sequenceDiagram @@ -450,13 +478,14 @@ sequenceDiagram else difference > refresh confidence interval rect rgb(240,128,128) Auth-->>Client: Response 401 Unauthorized - end end +end ``` Usage examples: You can set refresh confidence interval directly (in milliseconds) + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -470,7 +499,7 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); const int refreshConfidenceIntervalInMilliseconds = 300_000; @@ -491,8 +520,10 @@ public class Startup ``` You can also choose not to set a refresh confidence interval. -In this case, the refresh confidence interval will be set to 60,000 milliseconds. -With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. +In this case, the refresh confidence interval will be set to 60,000 +milliseconds. +With this value you can be sure that multiple requests will be handled correctly +and it is not large enough to constantly use expired tokens. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -507,7 +538,7 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); @@ -529,7 +560,10 @@ public class Startup # Logout -If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: +If you are using the refresh token, you will probably want to have a possibility +to remove token's data from the database, when user requests it. This can be +achieved by implementing the Logout mechanism. You can simply enable it like +this: ```cs ... @@ -538,36 +572,35 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class Startup { - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { - ... services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .AddLogout(); - ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware() .UseRefreshTokenLogoutMiddleware(); - ... } } ``` ## Logout request -To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: +To call the Logout Endpoint, you need to use the POST method, add to the header +`Content-Type: application/json` and pass the refresh token value (and +optionally fingerprint) in the JSON format in the request body. Like this: + ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -575,23 +608,28 @@ If it was successful, it will return `true` in a response body. # Authorization -The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements claims-based authorization. With this, claims are added to the token payload and verified upon request. The basic implementation of authorization can be seen in the documentation of the package TourmalineCore.AspNetCore.JwtAuthentication.Core. +The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements +claims-based authorization. With this, claims are added to the token payload and +verified upon request. The basic implementation of authorization can be seen in +the documentation of the package +TourmalineCore.AspNetCore.JwtAuthentication.Core. -The only difference in implementation will be in the second step when adding services. +The only difference in implementation will be in the second step when adding +services. + +Connect this provider in the Startup.cs. You can pass the name of the claim type +you want to use as a parameter. `Default claim type = "Permission"`. -Connect this provider in the Startup.cs. - You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { - ... services.AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); - ... } ``` -Please note that if you enable functionality for the refresh token, then `WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. +Please note that if you enable functionality for the refresh token, then +`WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. From 2de738d703aad067b8b61b7bdabfb52aad67fe63 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 15:23:19 +0500 Subject: [PATCH 41/49] chore(Core): #65: fix path to Examples in readme --- JwtAuthentication.Core/README.md | 2 +- JwtAuthentication.Core/Usage for old .NET.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index 245f709..fb4e8dd 100644 --- a/JwtAuthentication.Core/README.md +++ b/JwtAuthentication.Core/README.md @@ -54,7 +54,7 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core The sections below will provide basic examples of how to use the package. More complete examples of applications for different versions of .NET can be found in -the “[Examples](Examples/)” folder of the project. +the “[Examples](../Examples/)” folder of the project. # Authentication diff --git a/JwtAuthentication.Core/Usage for old .NET.md b/JwtAuthentication.Core/Usage for old .NET.md index 35780d6..3d3bcc9 100644 --- a/JwtAuthentication.Core/Usage for old .NET.md +++ b/JwtAuthentication.Core/Usage for old .NET.md @@ -47,7 +47,7 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core The sections below will provide basic examples of how to use the package. More complete examples of applications for different versions of .NET can be found in -the “[Examples](Examples/)” folder of the project. +the “[Examples](../Examples/)” folder of the project. # Authentication From df34d10e45b90c67098703fce4930585ecf8b1c3 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 15:45:35 +0500 Subject: [PATCH 42/49] fix(Core): #65: update Microsoft.AspNetCore.Authentication.JwtBearer deps to avoid known vulnerability --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 12 ++++++------ .../JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 71d02db..572d051 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -1,10 +1,10 @@ - + netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core 0.3.5 - Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication @@ -24,22 +24,22 @@ - + - + - + - + diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index f23633c..133d43a 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -4,7 +4,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity 0.1.2 - Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication From d751f0c4ba1978e9aaa73aacbaf00220f6b182b9 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Thu, 10 Jul 2025 17:45:05 +0500 Subject: [PATCH 43/49] refactor(Examples): #65: rename NetCore to Net to projects that is higher than .NET 5 --- AspNetCore.JwtAuthentication.sln | 99 ++++++------ .../Controllers/ExampleController.cs | 32 ++++ .../Data/AppDbContext.cs | 4 +- ....0.AuthenticationUsingIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../Startup.cs | 6 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...5.0.AuthenticationWithRefreshToken.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../Startup.cs | 6 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Example.Net5.0.BaseAuthentication.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 2 +- .../Startup.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ....Net5.0.CookiesBasedAuthentication.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 2 +- .../Startup.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 0 ...et5.0.PermissionBasedAuthorization.csproj} | 0 .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../Startup.cs | 0 .../UserClaimsProvider.cs | 0 .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...enAuthAndRegistrationUsingIdentity.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 19 +++ .../Properties/launchSettings.json | 4 +- .../Startup.cs | 6 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...RefreshTokenWithConfidenceInterval.csproj} | 36 ++--- .../Models/CustomUser.cs | 2 +- .../Program.cs | 36 ++--- .../Properties/launchSettings.json | 4 +- .../Startup.cs | 6 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 0 ...le.Net5.0.WithCredentialsValidator.csproj} | 1 + .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../Startup.cs | 0 .../UserCredentialsValidator.cs | 0 .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 5 +- ...enticationUsingGenericIdentityUser.csproj} | 38 ++--- .../Models/CustomUser.cs | 2 +- .../ProgramGeneric.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 4 +- ....0.AuthenticationUsingIdentityUser.csproj} | 38 ++--- .../Models/CustomUser.cs | 2 +- .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ...6.0.AuthenticationWithRefreshToken.csproj} | 36 ++--- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Example.Net6.0.BaseAuthentication.csproj} | 28 ++-- .../Program.cs | 0 .../Properties/launchSettings.json | 62 ++++---- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ....Net6.0.CookiesBasedAuthentication.csproj} | 26 +-- .../ProgramCookies.cs | 0 .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ...et6.0.PermissionBasedAuthorization.csproj} | 28 ++-- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserClaimsProvider.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 13 ++ ...enAuthAndRegistrationUsingIdentity.csproj} | 36 ++--- .../Models/CustomUser.cs | 8 + .../Program.cs | 128 +++++++-------- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...RefreshTokenWithConfidenceInterval.csproj} | 36 ++--- .../Models/CustomUser.cs | 2 +- .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ...le.Net6.0.WithCredentialsValidator.csproj} | 44 +++--- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserCredentialsValidator.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 32 ++++ .../Data/AppDbContext.cs | 5 +- ...enticationUsingGenericIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../ProgramGeneric.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ....0.AuthenticationUsingIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ...7.0.AuthenticationWithRefreshToken.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Example.Net7.0.BaseAuthentication.csproj} | 2 +- .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../appsettings.json | 0 .../Controllers/ExampleController.cs | 32 ++++ ....Net7.0.CookiesBasedAuthentication.csproj} | 2 +- .../ProgramCookies.cs | 0 .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ...et7.0.PermissionBasedAuthorization.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserClaimsProvider.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 13 ++ ...enAuthAndRegistrationUsingIdentity.csproj} | 2 +- .../Models/CustomUser.cs | 8 + .../Program.cs | 4 +- .../Properties/launchSettings.json | 31 ++++ .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...RefreshTokenWithConfidenceInterval.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ...le.Net7.0.WithCredentialsValidator.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserCredentialsValidator.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 32 ++++ .../Data/AppDbContext.cs | 5 +- ...enticationUsingGenericIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../ProgramGeneric.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ....0.AuthenticationUsingIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ...8.0.AuthenticationWithRefreshToken.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 4 +- .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Example.Net8.0.BaseAuthentication.csproj} | 2 +- .../Program.cs | 0 .../Properties/launchSettings.json | 0 .../appsettings.json | 0 .../Controllers/ExampleController.cs | 32 ++++ ....Net8.0.CookiesBasedAuthentication.csproj} | 2 +- .../ProgramCookies.cs | 0 .../Properties/launchSettings.json | 4 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- ...et8.0.PermissionBasedAuthorization.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserClaimsProvider.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 13 ++ ...enAuthAndRegistrationUsingIdentity.csproj} | 2 +- .../Models/CustomUser.cs | 8 + .../Program.cs | 4 +- .../Properties/launchSettings.json | 31 ++++ .../appsettings.json | 0 .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...RefreshTokenWithConfidenceInterval.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 4 +- .../Properties/launchSettings.json | 31 ++++ .../appsettings.json | 10 +- .../Controllers/ExampleController.cs | 2 +- ...le.Net8.0.WithCredentialsValidator.csproj} | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 4 +- .../UserCredentialsValidator.cs | 2 +- .../appsettings.json | 0 .../Controllers/ExampleController.cs | 32 ++++ .../Data/AppDbContext.cs | 5 +- ...enticationUsingGenericIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../ProgramGeneric.cs | 130 +++++++-------- .../Properties/launchSettings.json | 62 ++++---- .../appsettings.json | 10 +- .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ....0.AuthenticationUsingIdentityUser.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 72 ++++----- .../Properties/launchSettings.json | 62 ++++---- .../appsettings.json | 10 +- .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 14 ++ ...9.0.AuthenticationWithRefreshToken.csproj} | 2 +- .../Models/CustomUser.cs | 9 ++ .../Program.cs | 148 +++++++++--------- .../Properties/launchSettings.json | 62 ++++---- .../appsettings.json | 10 +- .../Controllers/ExampleController.cs | 2 +- .../Example.Net9.0.BaseAuthentication.csproj} | 2 +- .../Program.cs | 52 +++--- .../Properties/launchSettings.json | 0 .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 32 ++++ ....Net9.0.CookiesBasedAuthentication.csproj} | 2 +- .../ProgramCookies.cs | 84 +++++----- .../Properties/launchSettings.json | 62 ++++---- .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 2 +- ...et9.0.PermissionBasedAuthorization.csproj} | 2 +- .../Program.cs | 68 ++++---- .../Properties/launchSettings.json | 62 ++++---- .../UserClaimsProvider.cs | 46 +++--- .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 ++++ .../Data/AppDbContext.cs | 13 ++ ...enAuthAndRegistrationUsingIdentity.csproj} | 2 +- .../Models/CustomUser.cs | 8 + .../Program.cs | 4 +- .../Properties/launchSettings.json | 31 ++++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 2 +- .../Data/AppDbContext.cs | 4 +- ...RefreshTokenWithConfidenceInterval.csproj} | 2 +- .../Models/CustomUser.cs | 2 +- .../Program.cs | 128 +++++++-------- .../Properties/launchSettings.json | 31 ++++ .../appsettings.json | 6 + .../Controllers/ExampleController.cs | 31 ++++ ...le.Net9.0.WithCredentialsValidator.csproj} | 2 +- .../Program.cs | 94 +++++------ .../Properties/launchSettings.json | 62 ++++---- .../UserCredentialsValidator.cs | 2 +- .../appsettings.json | 0 .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 32 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Program.cs | 19 --- .../Data/AppDbContext.cs | 14 -- .../Properties/launchSettings.json | 31 ---- .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 31 ---- .../appsettings.json | 6 - .../appsettings.json | 6 - .../appsettings.json | 6 - .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 13 -- .../Models/CustomUser.cs | 8 - .../Properties/launchSettings.json | 31 ---- .../appsettings.json | 6 - .../Properties/launchSettings.json | 31 ---- .../appsettings.json | 6 - .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 31 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 13 -- .../Models/CustomUser.cs | 8 - .../Properties/launchSettings.json | 31 ---- .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 31 ---- .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 13 -- .../Models/CustomUser.cs | 8 - .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 14 -- .../Models/CustomUser.cs | 9 -- .../Controllers/ExampleController.cs | 32 ---- .../Controllers/ExampleController.cs | 31 ---- .../Data/AppDbContext.cs | 13 -- .../Models/CustomUser.cs | 8 - .../Properties/launchSettings.json | 31 ---- .../Controllers/ExampleController.cs | 31 ---- Examples/Tests/NetCore5.0/BasicAuthTests.cs | 6 +- Examples/Tests/NetCore5.0/CookieTests.cs | 6 +- .../Tests/NetCore5.0/LoginCallbackTests.cs | 2 +- Examples/Tests/NetCore5.0/LogoutTest.cs | 6 +- Examples/Tests/NetCore5.0/RefreshTests.cs | 6 +- .../RefreshTestsWithConfidenceInterval.cs | 4 +- .../Tests/NetCore5.0/RegistrationTests.cs | 6 +- .../NetCore6.0/BasicAuthTestWithGeneric.cs | 4 +- Examples/Tests/NetCore6.0/BasicAuthTests.cs | 4 +- Examples/Tests/NetCore6.0/CookieTests.cs | 4 +- .../Tests/NetCore6.0/LoginCallbackTests.cs | 2 +- Examples/Tests/NetCore6.0/LogoutTest.cs | 4 +- Examples/Tests/NetCore6.0/RefreshTests.cs | 4 +- .../RefreshTestsWithConfidenceInterval.cs | 4 +- .../Tests/NetCore6.0/RegistrationTests.cs | 4 +- .../NetCore7.0/BasicAuthTestWithGeneric.cs | 2 +- Examples/Tests/NetCore7.0/BasicAuthTests.cs | 2 +- Examples/Tests/NetCore7.0/CookieTests.cs | 2 +- .../Tests/NetCore7.0/LoginCallbackTests.cs | 2 +- Examples/Tests/NetCore7.0/LogoutTest.cs | 2 +- Examples/Tests/NetCore7.0/RefreshTests.cs | 2 +- .../RefreshTestsWithConfidenceInterval.cs | 2 +- .../Tests/NetCore7.0/RegistrationTests.cs | 2 +- .../NetCore8.0/BasicAuthTestWithGeneric.cs | 2 +- Examples/Tests/NetCore8.0/BasicAuthTests.cs | 2 +- Examples/Tests/NetCore8.0/CookieTests.cs | 2 +- .../Tests/NetCore8.0/LoginCallbackTests.cs | 2 +- Examples/Tests/NetCore8.0/LogoutTest.cs | 2 +- Examples/Tests/NetCore8.0/RefreshTests.cs | 2 +- .../RefreshTestsWithConfidenceInterval.cs | 2 +- .../Tests/NetCore8.0/RegistrationTests.cs | 2 +- .../NetCore9.0/BasicAuthTestWithGeneric.cs | 2 +- Examples/Tests/NetCore9.0/BasicAuthTests.cs | 2 +- Examples/Tests/NetCore9.0/CookieTests.cs | 2 +- .../Tests/NetCore9.0/LoginCallbackTests.cs | 2 +- Examples/Tests/NetCore9.0/LogoutTest.cs | 2 +- Examples/Tests/NetCore9.0/RefreshTests.cs | 2 +- .../RefreshTestsWithConfidenceInterval.cs | 2 +- .../Tests/NetCore9.0/RegistrationTests.cs | 2 +- ....JwtAuthentication.postman_collection.json | 4 +- Examples/Tests/Tests.csproj | 16 +- .../Tests/Units/RefreshTokenManagerTests.cs | 2 +- 382 files changed, 2307 insertions(+), 2303 deletions(-) create mode 100644 Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationUsingIdentityUser}/Data/AppDbContext.cs (69%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken/Example.NetCore5.0.AuthenticationWithRefreshToken.csproj => Example.Net5.0.AuthenticationUsingIdentityUser/Example.Net5.0.AuthenticationUsingIdentityUser.csproj} (84%) rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationUsingIdentityUser}/Models/CustomUser.cs (66%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationUsingIdentityUser}/Program.cs (88%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.AuthenticationUsingIdentityUser}/Properties/launchSettings.json (90%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.AuthenticationUsingIdentityUser}/Startup.cs (89%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.AuthenticationUsingIdentityUser}/appsettings.json (100%) rename Examples/{Example.NetCore6.0.CookiesBasedAuthentication => Example.Net5.0.AuthenticationWithRefreshToken}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationWithRefreshToken}/Data/AppDbContext.cs (69%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser/Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj => Example.Net5.0.AuthenticationWithRefreshToken/Example.Net5.0.AuthenticationWithRefreshToken.csproj} (84%) rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationWithRefreshToken}/Models/CustomUser.cs (66%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication => Example.Net5.0.AuthenticationWithRefreshToken}/Program.cs (89%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationWithRefreshToken}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationWithRefreshToken}/Startup.cs (92%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.AuthenticationWithRefreshToken}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.BaseAuthentication => Example.Net5.0.BaseAuthentication}/Controllers/ExampleController.cs (93%) rename Examples/{Example.NetCore5.0.BaseAuthentication/Example.NetCore5.0.BaseAuthentication.csproj => Example.Net5.0.BaseAuthentication/Example.Net5.0.BaseAuthentication.csproj} (82%) rename Examples/{Example.NetCore5.0.BaseAuthentication => Example.Net5.0.BaseAuthentication}/Program.cs (93%) rename Examples/{Example.NetCore5.0.BaseAuthentication => Example.Net5.0.BaseAuthentication}/Properties/launchSettings.json (95%) rename Examples/{Example.NetCore5.0.BaseAuthentication => Example.Net5.0.BaseAuthentication}/Startup.cs (97%) rename Examples/{Example.NetCore5.0.BaseAuthentication => Example.Net5.0.BaseAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore7.0.CookiesBasedAuthentication => Example.Net5.0.CookiesBasedAuthentication}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication/Example.NetCore5.0.CookiesBasedAuthentication.csproj => Example.Net5.0.CookiesBasedAuthentication/Example.Net5.0.CookiesBasedAuthentication.csproj} (75%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.CookiesBasedAuthentication}/Program.cs (88%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication => Example.Net5.0.CookiesBasedAuthentication}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication => Example.Net5.0.CookiesBasedAuthentication}/Startup.cs (95%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication => Example.Net5.0.CookiesBasedAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/Controllers/ExampleController.cs (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization/Example.NetCore5.0.PermissionBasedAuthorization.csproj => Example.Net5.0.PermissionBasedAuthorization/Example.Net5.0.PermissionBasedAuthorization.csproj} (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/Program.cs (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/Properties/launchSettings.json (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/Startup.cs (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/UserClaimsProvider.cs (100%) rename Examples/{Example.NetCore5.0.PermissionBasedAuthorization => Example.Net5.0.PermissionBasedAuthorization}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Controllers/ExampleController.cs (88%) rename Examples/{Example.NetCore5.0.AuthenticationUsingIdentityUser => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Data/AppDbContext.cs (65%) rename Examples/{Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj} (82%) rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Models/CustomUser.cs (63%) create mode 100644 Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename Examples/{Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Properties/launchSettings.json (89%) rename Examples/{Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Startup.cs (90%) rename Examples/{Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Data/AppDbContext.cs (69%) rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj => Example.Net5.0.RefreshTokenWithConfidenceInterval/Example.Net5.0.RefreshTokenWithConfidenceInterval.csproj} (83%) rename Examples/{Example.NetCore5.0.AuthenticationWithRefreshToken => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Models/CustomUser.cs (68%) rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Program.cs (85%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval => Example.Net5.0.RefreshTokenWithConfidenceInterval}/Startup.cs (91%) rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser => Example.Net5.0.RefreshTokenWithConfidenceInterval}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/Controllers/ExampleController.cs (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator/Example.NetCore5.0.WithCredentialsValidator.csproj => Example.Net5.0.WithCredentialsValidator/Example.Net5.0.WithCredentialsValidator.csproj} (77%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/Program.cs (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/Properties/launchSettings.json (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/Startup.cs (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/UserCredentialsValidator.cs (100%) rename Examples/{Example.NetCore5.0.WithCredentialsValidator => Example.Net5.0.WithCredentialsValidator}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/Data/AppDbContext.cs (64%) rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj => Example.Net6.0.AuthenticationUsingGenericIdentityUser/Example.Net6.0.AuthenticationUsingGenericIdentityUser.csproj} (83%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/ProgramGeneric.cs (92%) rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore7.0.AuthenticationUsingIdentityUser => Example.Net6.0.AuthenticationUsingGenericIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken => Example.Net6.0.AuthenticationUsingIdentityUser}/Data/AppDbContext.cs (69%) rename Examples/{Example.NetCore6.0.AuthenticationUsingIdentityUser/Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj => Example.Net6.0.AuthenticationUsingIdentityUser/Example.Net6.0.AuthenticationUsingIdentityUser.csproj} (84%) rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken => Example.Net6.0.AuthenticationUsingIdentityUser}/Models/CustomUser.cs (66%) rename Examples/{Example.NetCore7.0.AuthenticationUsingIdentityUser => Example.Net6.0.AuthenticationUsingIdentityUser}/Program.cs (87%) rename Examples/{Example.NetCore8.0.AuthenticationUsingIdentityUser => Example.Net6.0.AuthenticationUsingIdentityUser}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken => Example.Net6.0.AuthenticationUsingIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken/Example.NetCore6.0.AuthenticationWithRefreshToken.csproj => Example.Net6.0.AuthenticationWithRefreshToken/Example.Net6.0.AuthenticationWithRefreshToken.csproj} (81%) create mode 100644 Examples/Example.Net6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken => Example.Net6.0.AuthenticationWithRefreshToken}/Program.cs (92%) rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken => Example.Net6.0.AuthenticationWithRefreshToken}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore7.0.BaseAuthentication => Example.Net6.0.AuthenticationWithRefreshToken}/appsettings.json (100%) rename Examples/{Example.NetCore6.0.BaseAuthentication => Example.Net6.0.BaseAuthentication}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore6.0.BaseAuthentication/Example.NetCore6.0.BaseAuthentication.csproj => Example.Net6.0.BaseAuthentication/Example.Net6.0.BaseAuthentication.csproj} (79%) rename Examples/{Example.NetCore7.0.BaseAuthentication => Example.Net6.0.BaseAuthentication}/Program.cs (100%) rename Examples/{Example.NetCore6.0.BaseAuthentication => Example.Net6.0.BaseAuthentication}/Properties/launchSettings.json (90%) rename Examples/{Example.NetCore7.0.CookiesBasedAuthentication => Example.Net6.0.BaseAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore5.0.CookiesBasedAuthentication => Example.Net6.0.CookiesBasedAuthentication}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore6.0.CookiesBasedAuthentication/Example.NetCore6.0.CookiesBasedAuthentication.csproj => Example.Net6.0.CookiesBasedAuthentication/Example.Net6.0.CookiesBasedAuthentication.csproj} (78%) rename Examples/{Example.NetCore7.0.CookiesBasedAuthentication => Example.Net6.0.CookiesBasedAuthentication}/ProgramCookies.cs (100%) rename Examples/{Example.NetCore9.0.CookiesBasedAuthentication => Example.Net6.0.CookiesBasedAuthentication}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization => Example.Net6.0.CookiesBasedAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore6.0.PermissionBasedAuthorization => Example.Net6.0.PermissionBasedAuthorization}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore6.0.PermissionBasedAuthorization/Example.NetCore6.0.PermissionBasedAuthorization.csproj => Example.Net6.0.PermissionBasedAuthorization/Example.Net6.0.PermissionBasedAuthorization.csproj} (77%) rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization => Example.Net6.0.PermissionBasedAuthorization}/Program.cs (93%) rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization => Example.Net6.0.PermissionBasedAuthorization}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization => Example.Net6.0.PermissionBasedAuthorization}/UserClaimsProvider.cs (92%) rename Examples/{Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net6.0.PermissionBasedAuthorization}/appsettings.json (100%) create mode 100644 Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs rename Examples/{Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj => Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj} (83%) create mode 100644 Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs rename Examples/{Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Program.cs (88%) rename Examples/{Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity}/appsettings.json (100%) rename Examples/{Example.NetCore6.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenWithConfidenceInterval}/Controllers/ExampleController.cs (87%) rename Examples/{Example.NetCore6.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenWithConfidenceInterval}/Data/AppDbContext.cs (65%) rename Examples/{Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj => Example.Net6.0.RefreshTokenWithConfidenceInterval/Example.Net6.0.RefreshTokenWithConfidenceInterval.csproj} (82%) rename Examples/{Example.NetCore6.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenWithConfidenceInterval}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenWithConfidenceInterval}/Program.cs (92%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net6.0.RefreshTokenWithConfidenceInterval}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser => Example.Net6.0.RefreshTokenWithConfidenceInterval}/appsettings.json (100%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator => Example.Net6.0.WithCredentialsValidator}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator/Example.NetCore6.0.WithCredentialsValidator.csproj => Example.Net6.0.WithCredentialsValidator/Example.Net6.0.WithCredentialsValidator.csproj} (85%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator => Example.Net6.0.WithCredentialsValidator}/Program.cs (95%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator => Example.Net6.0.WithCredentialsValidator}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator => Example.Net6.0.WithCredentialsValidator}/UserCredentialsValidator.cs (88%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator => Example.Net6.0.WithCredentialsValidator}/appsettings.json (100%) create mode 100644 Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser => Example.Net7.0.AuthenticationUsingGenericIdentityUser}/Data/AppDbContext.cs (64%) rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj => Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj} (85%) rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser => Example.Net7.0.AuthenticationUsingGenericIdentityUser}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser => Example.Net7.0.AuthenticationUsingGenericIdentityUser}/ProgramGeneric.cs (92%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser => Example.Net7.0.AuthenticationUsingGenericIdentityUser}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore8.0.AuthenticationUsingIdentityUser => Example.Net7.0.AuthenticationUsingGenericIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename Examples/{Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj => Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj} (86%) create mode 100644 Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs rename Examples/{Example.NetCore8.0.AuthenticationUsingIdentityUser => Example.Net7.0.AuthenticationUsingIdentityUser}/Program.cs (87%) rename Examples/{Example.NetCore7.0.AuthenticationUsingIdentityUser => Example.Net7.0.AuthenticationUsingIdentityUser}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken => Example.Net7.0.AuthenticationUsingIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename Examples/{Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj => Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj} (84%) create mode 100644 Examples/Example.Net7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename Examples/{Example.NetCore9.0.AuthenticationWithRefreshToken => Example.Net7.0.AuthenticationWithRefreshToken}/Program.cs (92%) rename Examples/{Example.NetCore9.0.AuthenticationWithRefreshToken => Example.Net7.0.AuthenticationWithRefreshToken}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore8.0.BaseAuthentication => Example.Net7.0.AuthenticationWithRefreshToken}/appsettings.json (100%) rename Examples/{Example.NetCore9.0.BaseAuthentication => Example.Net7.0.BaseAuthentication}/Controllers/ExampleController.cs (86%) rename Examples/{Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj => Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj} (81%) rename Examples/{Example.NetCore8.0.BaseAuthentication => Example.Net7.0.BaseAuthentication}/Program.cs (100%) rename Examples/{Example.NetCore7.0.BaseAuthentication => Example.Net7.0.BaseAuthentication}/Properties/launchSettings.json (100%) rename Examples/{Example.NetCore8.0.CookiesBasedAuthentication => Example.Net7.0.BaseAuthentication}/appsettings.json (100%) create mode 100644 Examples/Example.Net7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename Examples/{Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj => Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj} (80%) rename Examples/{Example.NetCore8.0.CookiesBasedAuthentication => Example.Net7.0.CookiesBasedAuthentication}/ProgramCookies.cs (100%) rename Examples/{Example.NetCore7.0.CookiesBasedAuthentication => Example.Net7.0.CookiesBasedAuthentication}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization => Example.Net7.0.CookiesBasedAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization => Example.Net7.0.PermissionBasedAuthorization}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj => Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj} (79%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization => Example.Net7.0.PermissionBasedAuthorization}/Program.cs (93%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization => Example.Net7.0.PermissionBasedAuthorization}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization => Example.Net7.0.PermissionBasedAuthorization}/UserClaimsProvider.cs (92%) rename Examples/{Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net7.0.PermissionBasedAuthorization}/appsettings.json (100%) create mode 100644 Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs rename Examples/{Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj => Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj} (84%) create mode 100644 Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs rename Examples/{Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Program.cs (91%) create mode 100644 Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity}/appsettings.json (100%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenWithConfidenceInterval}/Controllers/ExampleController.cs (87%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenWithConfidenceInterval}/Data/AppDbContext.cs (65%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj => Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj} (85%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenWithConfidenceInterval}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenWithConfidenceInterval}/Program.cs (92%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval => Example.Net7.0.RefreshTokenWithConfidenceInterval}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser => Example.Net7.0.RefreshTokenWithConfidenceInterval}/appsettings.json (100%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator => Example.Net7.0.WithCredentialsValidator}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj => Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj} (88%) rename Examples/{Example.NetCore9.0.WithCredentialsValidator => Example.Net7.0.WithCredentialsValidator}/Program.cs (95%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator => Example.Net7.0.WithCredentialsValidator}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator => Example.Net7.0.WithCredentialsValidator}/UserCredentialsValidator.cs (88%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator => Example.Net7.0.WithCredentialsValidator}/appsettings.json (100%) create mode 100644 Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser => Example.Net8.0.AuthenticationUsingGenericIdentityUser}/Data/AppDbContext.cs (64%) rename Examples/{Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj => Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj} (85%) rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser => Example.Net8.0.AuthenticationUsingGenericIdentityUser}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser => Example.Net8.0.AuthenticationUsingGenericIdentityUser}/ProgramGeneric.cs (92%) rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser => Example.Net8.0.AuthenticationUsingGenericIdentityUser}/Properties/launchSettings.json (91%) rename Examples/{Example.NetCore9.0.AuthenticationUsingIdentityUser => Example.Net8.0.AuthenticationUsingGenericIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename Examples/{Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj => Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj} (86%) create mode 100644 Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs rename Examples/{Example.NetCore9.0.AuthenticationUsingIdentityUser => Example.Net8.0.AuthenticationUsingIdentityUser}/Program.cs (87%) rename Examples/{Example.NetCore9.0.AuthenticationUsingIdentityUser => Example.Net8.0.AuthenticationUsingIdentityUser}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore9.0.AuthenticationWithRefreshToken => Example.Net8.0.AuthenticationUsingIdentityUser}/appsettings.json (100%) create mode 100644 Examples/Example.Net8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj => Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj} (84%) create mode 100644 Examples/Example.Net8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken => Example.Net8.0.AuthenticationWithRefreshToken}/Program.cs (92%) rename Examples/{Example.NetCore8.0.AuthenticationWithRefreshToken => Example.Net8.0.AuthenticationWithRefreshToken}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore9.0.BaseAuthentication => Example.Net8.0.AuthenticationWithRefreshToken}/appsettings.json (100%) rename Examples/{Example.NetCore7.0.BaseAuthentication => Example.Net8.0.BaseAuthentication}/Controllers/ExampleController.cs (86%) rename Examples/{Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj => Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj} (81%) rename Examples/{Example.NetCore9.0.BaseAuthentication => Example.Net8.0.BaseAuthentication}/Program.cs (100%) rename Examples/{Example.NetCore8.0.BaseAuthentication => Example.Net8.0.BaseAuthentication}/Properties/launchSettings.json (100%) rename Examples/{Example.NetCore9.0.CookiesBasedAuthentication => Example.Net8.0.BaseAuthentication}/appsettings.json (100%) create mode 100644 Examples/Example.Net8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename Examples/{Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj => Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj} (80%) rename Examples/{Example.NetCore9.0.CookiesBasedAuthentication => Example.Net8.0.CookiesBasedAuthentication}/ProgramCookies.cs (100%) rename Examples/{Example.NetCore8.0.CookiesBasedAuthentication => Example.Net8.0.CookiesBasedAuthentication}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization => Example.Net8.0.CookiesBasedAuthentication}/appsettings.json (100%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization => Example.Net8.0.PermissionBasedAuthorization}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj => Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj} (80%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization => Example.Net8.0.PermissionBasedAuthorization}/Program.cs (93%) rename Examples/{Example.NetCore8.0.PermissionBasedAuthorization => Example.Net8.0.PermissionBasedAuthorization}/Properties/launchSettings.json (92%) rename Examples/{Example.NetCore7.0.PermissionBasedAuthorization => Example.Net8.0.PermissionBasedAuthorization}/UserClaimsProvider.cs (92%) rename Examples/{Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net8.0.PermissionBasedAuthorization}/appsettings.json (100%) create mode 100644 Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs rename Examples/{Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj => Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj} (84%) create mode 100644 Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs rename Examples/{Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Program.cs (91%) create mode 100644 Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity}/appsettings.json (100%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenWithConfidenceInterval}/Controllers/ExampleController.cs (87%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenWithConfidenceInterval}/Data/AppDbContext.cs (65%) rename Examples/{Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj => Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj} (85%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenWithConfidenceInterval}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenWithConfidenceInterval}/Program.cs (92%) create mode 100644 Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename Examples/{Example.NetCore5.0.RefreshTokenWithConfidenceInterval => Example.Net8.0.RefreshTokenWithConfidenceInterval}/appsettings.json (99%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator => Example.Net8.0.WithCredentialsValidator}/Controllers/ExampleController.cs (90%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj => Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj} (88%) rename Examples/{Example.NetCore7.0.WithCredentialsValidator => Example.Net8.0.WithCredentialsValidator}/Program.cs (95%) rename Examples/{Example.NetCore9.0.WithCredentialsValidator => Example.Net8.0.WithCredentialsValidator}/Properties/launchSettings.json (93%) rename Examples/{Example.NetCore9.0.WithCredentialsValidator => Example.Net8.0.WithCredentialsValidator}/UserCredentialsValidator.cs (88%) rename Examples/{Example.NetCore8.0.WithCredentialsValidator => Example.Net8.0.WithCredentialsValidator}/appsettings.json (100%) create mode 100644 Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs rename Examples/{Example.NetCore7.0.AuthenticationUsingGenericIdentityUser => Example.Net9.0.AuthenticationUsingGenericIdentityUser}/Data/AppDbContext.cs (64%) rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj => Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj} (85%) rename Examples/{Example.NetCore9.0.AuthenticationUsingGenericIdentityUser => Example.Net9.0.AuthenticationUsingGenericIdentityUser}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser => Example.Net9.0.AuthenticationUsingGenericIdentityUser}/ProgramGeneric.cs (89%) rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser => Example.Net9.0.AuthenticationUsingGenericIdentityUser}/Properties/launchSettings.json (88%) rename Examples/{Example.NetCore6.0.AuthenticationUsingGenericIdentityUser => Example.Net9.0.AuthenticationUsingGenericIdentityUser}/appsettings.json (99%) create mode 100644 Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename Examples/{Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj => Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj} (86%) create mode 100644 Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs rename Examples/{Example.NetCore6.0.AuthenticationUsingIdentityUser => Example.Net9.0.AuthenticationUsingIdentityUser}/Program.cs (85%) rename Examples/{Example.NetCore6.0.AuthenticationUsingIdentityUser => Example.Net9.0.AuthenticationUsingIdentityUser}/Properties/launchSettings.json (89%) rename Examples/{Example.NetCore6.0.AuthenticationUsingIdentityUser => Example.Net9.0.AuthenticationUsingIdentityUser}/appsettings.json (99%) create mode 100644 Examples/Example.Net9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename Examples/{Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj => Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj} (84%) create mode 100644 Examples/Example.Net9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken => Example.Net9.0.AuthenticationWithRefreshToken}/Program.cs (89%) rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken => Example.Net9.0.AuthenticationWithRefreshToken}/Properties/launchSettings.json (89%) rename Examples/{Example.NetCore6.0.AuthenticationWithRefreshToken => Example.Net9.0.AuthenticationWithRefreshToken}/appsettings.json (99%) rename Examples/{Example.NetCore8.0.BaseAuthentication => Example.Net9.0.BaseAuthentication}/Controllers/ExampleController.cs (86%) rename Examples/{Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj => Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj} (81%) rename Examples/{Example.NetCore6.0.BaseAuthentication => Example.Net9.0.BaseAuthentication}/Program.cs (96%) rename Examples/{Example.NetCore9.0.BaseAuthentication => Example.Net9.0.BaseAuthentication}/Properties/launchSettings.json (100%) create mode 100644 Examples/Example.Net9.0.BaseAuthentication/appsettings.json create mode 100644 Examples/Example.Net9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename Examples/{Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj => Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj} (80%) rename Examples/{Example.NetCore6.0.CookiesBasedAuthentication => Example.Net9.0.CookiesBasedAuthentication}/ProgramCookies.cs (95%) rename Examples/{Example.NetCore6.0.CookiesBasedAuthentication => Example.Net9.0.CookiesBasedAuthentication}/Properties/launchSettings.json (89%) create mode 100644 Examples/Example.Net9.0.CookiesBasedAuthentication/appsettings.json rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization => Example.Net9.0.PermissionBasedAuthorization}/Controllers/ExampleController.cs (91%) rename Examples/{Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj => Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj} (80%) rename Examples/{Example.NetCore6.0.PermissionBasedAuthorization => Example.Net9.0.PermissionBasedAuthorization}/Program.cs (90%) rename Examples/{Example.NetCore6.0.PermissionBasedAuthorization => Example.Net9.0.PermissionBasedAuthorization}/Properties/launchSettings.json (89%) rename Examples/{Example.NetCore6.0.PermissionBasedAuthorization => Example.Net9.0.PermissionBasedAuthorization}/UserClaimsProvider.cs (90%) create mode 100644 Examples/Example.Net9.0.PermissionBasedAuthorization/appsettings.json create mode 100644 Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs create mode 100644 Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs rename Examples/{Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj => Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj} (84%) create mode 100644 Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs rename Examples/{Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity => Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity}/Program.cs (91%) create mode 100644 Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json create mode 100644 Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net9.0.RefreshTokenWithConfidenceInterval}/Controllers/ExampleController.cs (87%) rename Examples/{Example.NetCore7.0.RefreshTokenWithConfidenceInterval => Example.Net9.0.RefreshTokenWithConfidenceInterval}/Data/AppDbContext.cs (65%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj => Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj} (85%) rename Examples/{Example.NetCore9.0.RefreshTokenWithConfidenceInterval => Example.Net9.0.RefreshTokenWithConfidenceInterval}/Models/CustomUser.cs (61%) rename Examples/{Example.NetCore6.0.RefreshTokenWithConfidenceInterval => Example.Net9.0.RefreshTokenWithConfidenceInterval}/Program.cs (89%) create mode 100644 Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json create mode 100644 Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/appsettings.json create mode 100644 Examples/Example.Net9.0.WithCredentialsValidator/Controllers/ExampleController.cs rename Examples/{Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj => Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj} (88%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator => Example.Net9.0.WithCredentialsValidator}/Program.cs (92%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator => Example.Net9.0.WithCredentialsValidator}/Properties/launchSettings.json (89%) rename Examples/{Example.NetCore6.0.WithCredentialsValidator => Example.Net9.0.WithCredentialsValidator}/UserCredentialsValidator.cs (88%) rename Examples/{Example.NetCore9.0.WithCredentialsValidator => Example.Net9.0.WithCredentialsValidator}/appsettings.json (100%) delete mode 100644 Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json delete mode 100644 Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore6.0.BaseAuthentication/appsettings.json delete mode 100644 Examples/Example.NetCore6.0.CookiesBasedAuthentication/appsettings.json delete mode 100644 Examples/Example.NetCore6.0.PermissionBasedAuthorization/appsettings.json delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json delete mode 100644 Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/appsettings.json delete mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json delete mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs delete mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs delete mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs delete mode 100644 Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json delete mode 100644 Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index df81111..f5657be 100644 --- a/AspNetCore.JwtAuthentication.sln +++ b/AspNetCore.JwtAuthentication.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31919.166 @@ -12,113 +11,113 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{ADBF0A06-FF69-40A6-8F32-2F188AE1B6A4}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.BaseAuthentication", "Examples\Example.NetCore5.0.BaseAuthentication\Example.NetCore5.0.BaseAuthentication.csproj", "{36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.BaseAuthentication", "Examples\Example.Net5.0.BaseAuthentication\Example.Net5.0.BaseAuthentication.csproj", "{36F676C3-2C5F-4727-8BE2-8F759C2A3FBE}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.PermissionBasedAuthorization", "Examples\Example.NetCore5.0.PermissionBasedAuthorization\Example.NetCore5.0.PermissionBasedAuthorization.csproj", "{51E0C282-0942-4367-95EB-F248E80A5D6F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.PermissionBasedAuthorization", "Examples\Example.Net5.0.PermissionBasedAuthorization\Example.Net5.0.PermissionBasedAuthorization.csproj", "{51E0C282-0942-4367-95EB-F248E80A5D6F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.WithCredentialsValidator", "Examples\Example.NetCore5.0.WithCredentialsValidator\Example.NetCore5.0.WithCredentialsValidator.csproj", "{E2BC2C97-161E-41E4-B224-DFC62AD56768}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.WithCredentialsValidator", "Examples\Example.Net5.0.WithCredentialsValidator\Example.Net5.0.WithCredentialsValidator.csproj", "{E2BC2C97-161E-41E4-B224-DFC62AD56768}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.0.BaseAuthentication", "Examples\Example.NetCore3.0.BaseAuthentication\Example.NetCore3.0.BaseAuthentication.csproj", "{6AB1E6C4-563A-4447-8024-6C31C9A45141}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore3.1.BaseAuthentication", "Examples\Example.NetCore3.1.BaseAuthentication\Example.NetCore3.1.BaseAuthentication.csproj", "{43D3813D-CD36-46A7-86EF-CD6CF0A9A9BC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.CookiesBasedAuthentication", "Examples\Example.NetCore5.0.CookiesBasedAuthentication\Example.NetCore5.0.CookiesBasedAuthentication.csproj", "{32E74378-AAF5-4CA6-8633-30997453E58A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.CookiesBasedAuthentication", "Examples\Example.Net5.0.CookiesBasedAuthentication\Example.Net5.0.CookiesBasedAuthentication.csproj", "{32E74378-AAF5-4CA6-8633-30997453E58A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JwtAuthentication.Identity", "JwtAuthentication.Identity\JwtAuthentication.Identity.csproj", "{60A8C4FC-D6DC-4C5B-9FA9-6F81F55F3667}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore5.0.AuthenticationUsingIdentityUser\Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj", "{1DF1D001-0194-4CD8-82DD-40AF57FC1432}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.AuthenticationUsingIdentityUser", "Examples\Example.Net5.0.AuthenticationUsingIdentityUser\Example.Net5.0.AuthenticationUsingIdentityUser.csproj", "{1DF1D001-0194-4CD8-82DD-40AF57FC1432}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore5.0.AuthenticationWithRefreshToken\Example.NetCore5.0.AuthenticationWithRefreshToken.csproj", "{12915347-991A-4EA0-983D-03121E1C527B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.AuthenticationWithRefreshToken", "Examples\Example.Net5.0.AuthenticationWithRefreshToken\Example.Net5.0.AuthenticationWithRefreshToken.csproj", "{12915347-991A-4EA0-983D-03121E1C527B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8BF217FB-7AB4-4056-8186-2BDE9F3C99EC}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Examples\Tests\Tests.csproj", "{EF8EF2D5-9483-400E-B938-ADDB467BF300}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.BaseAuthentication", "Examples\Example.NetCore6.0.BaseAuthentication\Example.NetCore6.0.BaseAuthentication.csproj", "{DDA26737-950C-4B23-B66A-1733FB482A29}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.BaseAuthentication", "Examples\Example.Net6.0.BaseAuthentication\Example.Net6.0.BaseAuthentication.csproj", "{DDA26737-950C-4B23-B66A-1733FB482A29}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore5.0", "NetCore5.0", "{7A925031-2656-4CEB-821A-D76739E0E5A2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Net5.0", "Net5.0", "{7A925031-2656-4CEB-821A-D76739E0E5A2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore3.", "NetCore3.", "{614DB4C6-A4BE-4BBF-B385-C34985CA1FC3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore6.0", "NetCore6.0", "{4FF83CB3-A634-4D07-BEE0-B5391B86F071}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Net6.0", "Net6.0", "{4FF83CB3-A634-4D07-BEE0-B5391B86F071}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingIdentityUser\Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj", "{28707296-5273-471B-89FB-FA3D6C62CA67}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.AuthenticationUsingIdentityUser", "Examples\Example.Net6.0.AuthenticationUsingIdentityUser\Example.Net6.0.AuthenticationUsingIdentityUser.csproj", "{28707296-5273-471B-89FB-FA3D6C62CA67}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore6.0.AuthenticationWithRefreshToken\Example.NetCore6.0.AuthenticationWithRefreshToken.csproj", "{5AE1CC8C-80A2-46AF-A02E-BE129080F489}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.AuthenticationWithRefreshToken", "Examples\Example.Net6.0.AuthenticationWithRefreshToken\Example.Net6.0.AuthenticationWithRefreshToken.csproj", "{5AE1CC8C-80A2-46AF-A02E-BE129080F489}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.CookiesBasedAuthentication", "Examples\Example.NetCore6.0.CookiesBasedAuthentication\Example.NetCore6.0.CookiesBasedAuthentication.csproj", "{E3C800A0-012F-4440-BD78-813FE51F4830}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.CookiesBasedAuthentication", "Examples\Example.Net6.0.CookiesBasedAuthentication\Example.Net6.0.CookiesBasedAuthentication.csproj", "{E3C800A0-012F-4440-BD78-813FE51F4830}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.PermissionBasedAuthorization", "Examples\Example.NetCore6.0.PermissionBasedAuthorization\Example.NetCore6.0.PermissionBasedAuthorization.csproj", "{421DEC55-2DF8-4DCB-B53D-ED59C15062A2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.PermissionBasedAuthorization", "Examples\Example.Net6.0.PermissionBasedAuthorization\Example.Net6.0.PermissionBasedAuthorization.csproj", "{421DEC55-2DF8-4DCB-B53D-ED59C15062A2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{C7F24A8E-C454-4EB7-9F33-5ABCAD04AE24}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.WithCredentialsValidator", "Examples\Example.NetCore6.0.WithCredentialsValidator\Example.NetCore6.0.WithCredentialsValidator.csproj", "{2652FCF8-3604-435E-8963-92A4A365FA33}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.WithCredentialsValidator", "Examples\Example.Net6.0.WithCredentialsValidator\Example.Net6.0.WithCredentialsValidator.csproj", "{2652FCF8-3604-435E-8963-92A4A365FA33}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser\Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj", "{C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.Net6.0.AuthenticationUsingGenericIdentityUser\Example.Net6.0.AuthenticationUsingGenericIdentityUser.csproj", "{C617F7DD-6E7E-4B5D-8766-C82C37EFFF6E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore6.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore6.0.RefreshTokenWithConfidenceInterval\Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj", "{ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net6.0.RefreshTokenWithConfidenceInterval", "Examples\Example.Net6.0.RefreshTokenWithConfidenceInterval\Example.Net6.0.RefreshTokenWithConfidenceInterval.csproj", "{ABDD94F3-DF9E-47B2-813F-935C54C8DEA7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.NetCore5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore5.0.RefreshTokenWithConfidenceInterval\Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.Net5.0.RefreshTokenWithConfidenceInterval", "Examples\Example.Net5.0.RefreshTokenWithConfidenceInterval\Example.Net5.0.RefreshTokenWithConfidenceInterval.csproj", "{F0E28B79-7957-444F-B437-D2EEC072A6DE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.BaseAuthentication", "Examples\Example.NetCore7.0.BaseAuthentication\Example.NetCore7.0.BaseAuthentication.csproj", "{69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.BaseAuthentication", "Examples\Example.Net7.0.BaseAuthentication\Example.Net7.0.BaseAuthentication.csproj", "{69AE34C5-23F5-4E25-9E37-1FC1C8ABFE0D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore7.0", "NetCore7.0", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Net7.0", "Net7.0", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore7.0.AuthenticationUsingGenericIdentityUser\Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj", "{E85F73B6-5C37-4745-AFB3-16DA11F23882}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.Net7.0.AuthenticationUsingGenericIdentityUser\Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj", "{E85F73B6-5C37-4745-AFB3-16DA11F23882}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore7.0.AuthenticationUsingIdentityUser\Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj", "{BC726B57-2164-4C73-9DF3-32DE785F04FB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.AuthenticationUsingIdentityUser", "Examples\Example.Net7.0.AuthenticationUsingIdentityUser\Example.Net7.0.AuthenticationUsingIdentityUser.csproj", "{BC726B57-2164-4C73-9DF3-32DE785F04FB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore7.0.AuthenticationWithRefreshToken\Example.NetCore7.0.AuthenticationWithRefreshToken.csproj", "{54F6E533-537E-47D3-A829-6DB7CBD1D948}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.AuthenticationWithRefreshToken", "Examples\Example.Net7.0.AuthenticationWithRefreshToken\Example.Net7.0.AuthenticationWithRefreshToken.csproj", "{54F6E533-537E-47D3-A829-6DB7CBD1D948}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.CookiesBasedAuthentication", "Examples\Example.NetCore7.0.CookiesBasedAuthentication\Example.NetCore7.0.CookiesBasedAuthentication.csproj", "{2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.CookiesBasedAuthentication", "Examples\Example.Net7.0.CookiesBasedAuthentication\Example.Net7.0.CookiesBasedAuthentication.csproj", "{2AA6D3CA-6CAA-40D9-9C33-75C0B1FBF0EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.PermissionBasedAuthorization", "Examples\Example.NetCore7.0.PermissionBasedAuthorization\Example.NetCore7.0.PermissionBasedAuthorization.csproj", "{E7250382-AA91-44BA-BAD2-6E888195D628}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.PermissionBasedAuthorization", "Examples\Example.Net7.0.PermissionBasedAuthorization\Example.Net7.0.PermissionBasedAuthorization.csproj", "{E7250382-AA91-44BA-BAD2-6E888195D628}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{0B46B59D-395F-44C6-B68D-A6967DCEFA10}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{0B46B59D-395F-44C6-B68D-A6967DCEFA10}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore7.0.RefreshTokenWithConfidenceInterval\Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj", "{EAF21201-CD79-444C-A27C-B53B016C042C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.RefreshTokenWithConfidenceInterval", "Examples\Example.Net7.0.RefreshTokenWithConfidenceInterval\Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj", "{EAF21201-CD79-444C-A27C-B53B016C042C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore7.0.WithCredentialsValidator", "Examples\Example.NetCore7.0.WithCredentialsValidator\Example.NetCore7.0.WithCredentialsValidator.csproj", "{6AE10A59-1374-4000-B8BB-047DAAE30779}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net7.0.WithCredentialsValidator", "Examples\Example.Net7.0.WithCredentialsValidator\Example.Net7.0.WithCredentialsValidator.csproj", "{6AE10A59-1374-4000-B8BB-047DAAE30779}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore8.0.AuthenticationUsingGenericIdentityUser\Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj", "{A4EC68DA-C87B-4A66-9EE4-0056DC657D56}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.Net8.0.AuthenticationUsingGenericIdentityUser\Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj", "{A4EC68DA-C87B-4A66-9EE4-0056DC657D56}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore8.0.AuthenticationUsingIdentityUser\Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj", "{B41EE46C-6E57-4D72-8E5A-86E019C5E565}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.AuthenticationUsingIdentityUser", "Examples\Example.Net8.0.AuthenticationUsingIdentityUser\Example.Net8.0.AuthenticationUsingIdentityUser.csproj", "{B41EE46C-6E57-4D72-8E5A-86E019C5E565}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore8.0.AuthenticationWithRefreshToken\Example.NetCore8.0.AuthenticationWithRefreshToken.csproj", "{A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.AuthenticationWithRefreshToken", "Examples\Example.Net8.0.AuthenticationWithRefreshToken\Example.Net8.0.AuthenticationWithRefreshToken.csproj", "{A97DF002-5BD5-45C5-87F6-FF5BF5AA205E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.BaseAuthentication", "Examples\Example.NetCore8.0.BaseAuthentication\Example.NetCore8.0.BaseAuthentication.csproj", "{F58F3A0E-0763-4236-B903-377EE58F79AC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.BaseAuthentication", "Examples\Example.Net8.0.BaseAuthentication\Example.Net8.0.BaseAuthentication.csproj", "{F58F3A0E-0763-4236-B903-377EE58F79AC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.CookiesBasedAuthentication", "Examples\Example.NetCore8.0.CookiesBasedAuthentication\Example.NetCore8.0.CookiesBasedAuthentication.csproj", "{6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.CookiesBasedAuthentication", "Examples\Example.Net8.0.CookiesBasedAuthentication\Example.Net8.0.CookiesBasedAuthentication.csproj", "{6190BFE8-8B0E-4AEA-BAE7-4688BEBD50D5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.PermissionBasedAuthorization", "Examples\Example.NetCore8.0.PermissionBasedAuthorization\Example.NetCore8.0.PermissionBasedAuthorization.csproj", "{4C320ECC-388B-41CF-B391-20F6B1A31FA3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.PermissionBasedAuthorization", "Examples\Example.Net8.0.PermissionBasedAuthorization\Example.Net8.0.PermissionBasedAuthorization.csproj", "{4C320ECC-388B-41CF-B391-20F6B1A31FA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{80DFB643-D719-4C0B-ABD1-27ABCAA9B1F7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore8.0.RefreshTokenWithConfidenceInterval\Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj", "{CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.RefreshTokenWithConfidenceInterval", "Examples\Example.Net8.0.RefreshTokenWithConfidenceInterval\Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj", "{CB5DE2FF-2BFE-4FA8-BE06-186EF64CC6C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore8.0.WithCredentialsValidator", "Examples\Example.NetCore8.0.WithCredentialsValidator\Example.NetCore8.0.WithCredentialsValidator.csproj", "{48786B11-B83A-4134-85C6-4E9F959F9C06}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net8.0.WithCredentialsValidator", "Examples\Example.Net8.0.WithCredentialsValidator\Example.Net8.0.WithCredentialsValidator.csproj", "{48786B11-B83A-4134-85C6-4E9F959F9C06}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore8.0", "NetCore8.0", "{3DC4FB03-312C-4EFB-838C-F95431860DFC}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Net8.0", "Net8.0", "{3DC4FB03-312C-4EFB-838C-F95431860DFC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.NetCore9.0.AuthenticationUsingGenericIdentityUser\Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj", "{534CD87F-4858-47CC-BE27-8C60EAF98D75}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.AuthenticationUsingGenericIdentityUser", "Examples\Example.Net9.0.AuthenticationUsingGenericIdentityUser\Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj", "{534CD87F-4858-47CC-BE27-8C60EAF98D75}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationUsingIdentityUser", "Examples\Example.NetCore9.0.AuthenticationUsingIdentityUser\Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj", "{93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.AuthenticationUsingIdentityUser", "Examples\Example.Net9.0.AuthenticationUsingIdentityUser\Example.Net9.0.AuthenticationUsingIdentityUser.csproj", "{93EE0C9A-61C4-4E54-8B54-EF2BAC45A1F9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.AuthenticationWithRefreshToken", "Examples\Example.NetCore9.0.AuthenticationWithRefreshToken\Example.NetCore9.0.AuthenticationWithRefreshToken.csproj", "{5B59AF22-4146-4881-884B-1123D39361CD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.AuthenticationWithRefreshToken", "Examples\Example.Net9.0.AuthenticationWithRefreshToken\Example.Net9.0.AuthenticationWithRefreshToken.csproj", "{5B59AF22-4146-4881-884B-1123D39361CD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.BaseAuthentication", "Examples\Example.NetCore9.0.BaseAuthentication\Example.NetCore9.0.BaseAuthentication.csproj", "{E98221D9-DCAA-461E-BE07-13E612E914C0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.BaseAuthentication", "Examples\Example.Net9.0.BaseAuthentication\Example.Net9.0.BaseAuthentication.csproj", "{E98221D9-DCAA-461E-BE07-13E612E914C0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.CookiesBasedAuthentication", "Examples\Example.NetCore9.0.CookiesBasedAuthentication\Example.NetCore9.0.CookiesBasedAuthentication.csproj", "{39F7B3D2-15F5-46C3-87CC-9E2916591930}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.CookiesBasedAuthentication", "Examples\Example.Net9.0.CookiesBasedAuthentication\Example.Net9.0.CookiesBasedAuthentication.csproj", "{39F7B3D2-15F5-46C3-87CC-9E2916591930}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.PermissionBasedAuthorization", "Examples\Example.NetCore9.0.PermissionBasedAuthorization\Example.NetCore9.0.PermissionBasedAuthorization.csproj", "{FACED86D-3326-4B98-98DA-87FC6A789560}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.PermissionBasedAuthorization", "Examples\Example.Net9.0.PermissionBasedAuthorization\Example.Net9.0.PermissionBasedAuthorization.csproj", "{FACED86D-3326-4B98-98DA-87FC6A789560}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8B6E2110-1BD0-419C-B614-2CB2FC2683D0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity", "Examples\Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity\Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj", "{8B6E2110-1BD0-419C-B614-2CB2FC2683D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.RefreshTokenWithConfidenceInterval", "Examples\Example.NetCore9.0.RefreshTokenWithConfidenceInterval\Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj", "{63A683E6-AD18-4FC2-87C2-E4043E1C696C}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.RefreshTokenWithConfidenceInterval", "Examples\Example.Net9.0.RefreshTokenWithConfidenceInterval\Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj", "{63A683E6-AD18-4FC2-87C2-E4043E1C696C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.NetCore9.0.WithCredentialsValidator", "Examples\Example.NetCore9.0.WithCredentialsValidator\Example.NetCore9.0.WithCredentialsValidator.csproj", "{A8E18C36-BF99-42A7-9055-47E4C3449214}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Net9.0.WithCredentialsValidator", "Examples\Example.Net9.0.WithCredentialsValidator\Example.Net9.0.WithCredentialsValidator.csproj", "{A8E18C36-BF99-42A7-9055-47E4C3449214}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NetCore9.0", "NetCore9.0", "{1190019C-C08E-4729-8C0D-BB651642C479}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Net9.0", "Net9.0", "{1190019C-C08E-4729-8C0D-BB651642C479}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..28cd6f4 --- /dev/null +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net5._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs similarity index 69% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index b9b6fc8..2315532 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore7._0.AuthenticationWithRefreshToken.Models; +using Example.Net5._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Data +namespace Example.Net5._0.AuthenticationUsingIdentityUser.Data { public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Example.NetCore5.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Example.Net5.0.AuthenticationUsingIdentityUser.csproj similarity index 84% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Example.NetCore5.0.AuthenticationWithRefreshToken.csproj rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Example.Net5.0.AuthenticationUsingIdentityUser.csproj index a0e0e77..3802b20 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Example.NetCore5.0.AuthenticationWithRefreshToken.csproj +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Example.Net5.0.AuthenticationUsingIdentityUser.csproj @@ -2,7 +2,7 @@ net5.0 - Example.NetCore5._0.AuthenticationWithRefreshToken + Example.Net5._0.AuthenticationUsingIdentityUser diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs similarity index 66% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index 064ee7f..176cf6f 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.AuthenticationWithRefreshToken.Models +namespace Example.Net5._0.AuthenticationUsingIdentityUser.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Program.cs similarity index 88% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Program.cs index 565e10f..72c67a8 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Program.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; -namespace Example.NetCore5._0.AuthenticationWithRefreshToken +namespace Example.Net5._0.AuthenticationUsingIdentityUser { public class Program { diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 90% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index a307d77..1c0d5be 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Example.NetCore5._0.AuthenticationUsingIdentityUser": { + "Example.Net5._0.AuthenticationUsingIdentityUser": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, @@ -25,4 +25,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Startup.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Startup.cs similarity index 89% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Startup.cs rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Startup.cs index 0673e98..e34d58b 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Startup.cs +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Startup.cs @@ -1,5 +1,5 @@ -using Example.NetCore5._0.AuthenticationUsingIdentityUser.Data; -using Example.NetCore5._0.AuthenticationUsingIdentityUser.Models; +using Example.Net5._0.AuthenticationUsingIdentityUser.Data; +using Example.Net5._0.AuthenticationUsingIdentityUser.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser +namespace Example.Net5._0.AuthenticationUsingIdentityUser { public class Startup { diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/appsettings.json diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs index 6b7a6f4..be4f67c 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.CookiesBasedAuthentication.Controllers +namespace Example.Net5._0.AuthenticationWithRefreshToken.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs similarity index 69% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs index 938eaa3..86f7069 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore6._0.AuthenticationWithRefreshToken.Models; +using Example.Net5._0.AuthenticationWithRefreshToken.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._0.AuthenticationWithRefreshToken.Data +namespace Example.Net5._0.AuthenticationWithRefreshToken.Data { public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Example.Net5.0.AuthenticationWithRefreshToken.csproj similarity index 84% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Example.Net5.0.AuthenticationWithRefreshToken.csproj index 4360ffc..e856386 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Example.NetCore5.0.AuthenticationUsingIdentityUser.csproj +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Example.Net5.0.AuthenticationWithRefreshToken.csproj @@ -2,7 +2,7 @@ net5.0 - Example.NetCore5._0.AuthenticationUsingIdentityUser + Example.Net5._0.AuthenticationWithRefreshToken diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs similarity index 66% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs index 9725375..e08dfab 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Models +namespace Example.Net5._0.AuthenticationWithRefreshToken.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Program.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Program.cs similarity index 89% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Program.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Program.cs index 2faa867..63deb9a 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Program.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Program.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; -namespace Example.NetCore5._0.CookiesBasedAuthentication +namespace Example.Net5._0.AuthenticationWithRefreshToken { public class Program { diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index 68f960e..fba90c5 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Example.NetCore5._0.AuthenticationWithRefreshToken": { + "Example.Net5._0.AuthenticationWithRefreshToken": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, @@ -25,4 +25,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Startup.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Startup.cs similarity index 92% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Startup.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Startup.cs index c47135a..4582e73 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Startup.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Startup.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; -using Example.NetCore5._0.AuthenticationWithRefreshToken.Data; -using Example.NetCore5._0.AuthenticationWithRefreshToken.Models; +using Example.Net5._0.AuthenticationWithRefreshToken.Data; +using Example.Net5._0.AuthenticationWithRefreshToken.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -13,7 +13,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; -namespace Example.NetCore5._0.AuthenticationWithRefreshToken +namespace Example.Net5._0.AuthenticationWithRefreshToken { public class Startup { diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/appsettings.json diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net5.0.BaseAuthentication/Controllers/ExampleController.cs similarity index 93% rename from Examples/Example.NetCore5.0.BaseAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.BaseAuthentication/Controllers/ExampleController.cs index 08f7e41..d7931a2 100644 --- a/Examples/Example.NetCore5.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net5.0.BaseAuthentication/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore5._0.Controllers +namespace Example.Net5._0.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/Example.NetCore5.0.BaseAuthentication.csproj b/Examples/Example.Net5.0.BaseAuthentication/Example.Net5.0.BaseAuthentication.csproj similarity index 82% rename from Examples/Example.NetCore5.0.BaseAuthentication/Example.NetCore5.0.BaseAuthentication.csproj rename to Examples/Example.Net5.0.BaseAuthentication/Example.Net5.0.BaseAuthentication.csproj index c6a3cd0..78acd40 100644 --- a/Examples/Example.NetCore5.0.BaseAuthentication/Example.NetCore5.0.BaseAuthentication.csproj +++ b/Examples/Example.Net5.0.BaseAuthentication/Example.Net5.0.BaseAuthentication.csproj @@ -2,7 +2,7 @@ net5.0 - Example.NetCore5._0 + Example.Net5._0 diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/Program.cs b/Examples/Example.Net5.0.BaseAuthentication/Program.cs similarity index 93% rename from Examples/Example.NetCore5.0.BaseAuthentication/Program.cs rename to Examples/Example.Net5.0.BaseAuthentication/Program.cs index ca89a96..be420da 100644 --- a/Examples/Example.NetCore5.0.BaseAuthentication/Program.cs +++ b/Examples/Example.Net5.0.BaseAuthentication/Program.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; -namespace Example.NetCore5._0 +namespace Example.Net5._0 { public class Program { diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net5.0.BaseAuthentication/Properties/launchSettings.json similarity index 95% rename from Examples/Example.NetCore5.0.BaseAuthentication/Properties/launchSettings.json rename to Examples/Example.Net5.0.BaseAuthentication/Properties/launchSettings.json index fa9da69..b400f4c 100644 --- a/Examples/Example.NetCore5.0.BaseAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.BaseAuthentication/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Example.NetCore5._0": { + "Example.Net5._0": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/Startup.cs b/Examples/Example.Net5.0.BaseAuthentication/Startup.cs similarity index 97% rename from Examples/Example.NetCore5.0.BaseAuthentication/Startup.cs rename to Examples/Example.Net5.0.BaseAuthentication/Startup.cs index 2450564..bfc000e 100644 --- a/Examples/Example.NetCore5.0.BaseAuthentication/Startup.cs +++ b/Examples/Example.Net5.0.BaseAuthentication/Startup.cs @@ -6,7 +6,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -namespace Example.NetCore5._0 +namespace Example.Net5._0 { public class Startup { diff --git a/Examples/Example.NetCore5.0.BaseAuthentication/appsettings.json b/Examples/Example.Net5.0.BaseAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.BaseAuthentication/appsettings.json rename to Examples/Example.Net5.0.BaseAuthentication/appsettings.json diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index 604e071..7827500 100644 --- a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore7._0.CookiesBasedAuthentication.Controllers +namespace Example.Net5._0.CookiesBasedAuthentication.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Example.NetCore5.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net5.0.CookiesBasedAuthentication/Example.Net5.0.CookiesBasedAuthentication.csproj similarity index 75% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Example.NetCore5.0.CookiesBasedAuthentication.csproj rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Example.Net5.0.CookiesBasedAuthentication.csproj index 32e6b3b..ee0ef2c 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Example.NetCore5.0.CookiesBasedAuthentication.csproj +++ b/Examples/Example.Net5.0.CookiesBasedAuthentication/Example.Net5.0.CookiesBasedAuthentication.csproj @@ -2,7 +2,7 @@ net5.0 - Example.NetCore5._0.CookiesBasedAuthentication + Example.Net5._0.CookiesBasedAuthentication diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net5.0.CookiesBasedAuthentication/Program.cs similarity index 88% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Program.cs index 299b6dd..2602bc3 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net5.0.CookiesBasedAuthentication/Program.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser +namespace Example.Net5._0.CookiesBasedAuthentication { public class Program { diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net5.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Properties/launchSettings.json index 7fd5817..874597e 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Example.NetCore5._0.CookiesBasedAuthentication": { + "Example.Net5._0.CookiesBasedAuthentication": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs b/Examples/Example.Net5.0.CookiesBasedAuthentication/Startup.cs similarity index 95% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Startup.cs index cd5d3bf..df5772a 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs +++ b/Examples/Example.Net5.0.CookiesBasedAuthentication/Startup.cs @@ -6,7 +6,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -namespace Example.NetCore5._0.CookiesBasedAuthentication +namespace Example.Net5._0.CookiesBasedAuthentication { public class Startup { diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net5.0.CookiesBasedAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/appsettings.json rename to Examples/Example.Net5.0.CookiesBasedAuthentication/appsettings.json diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net5.0.PermissionBasedAuthorization/Controllers/ExampleController.cs similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.PermissionBasedAuthorization/Controllers/ExampleController.cs diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/Example.NetCore5.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net5.0.PermissionBasedAuthorization/Example.Net5.0.PermissionBasedAuthorization.csproj similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/Example.NetCore5.0.PermissionBasedAuthorization.csproj rename to Examples/Example.Net5.0.PermissionBasedAuthorization/Example.Net5.0.PermissionBasedAuthorization.csproj diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net5.0.PermissionBasedAuthorization/Program.cs similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net5.0.PermissionBasedAuthorization/Program.cs diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net5.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net5.0.PermissionBasedAuthorization/Properties/launchSettings.json diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/Startup.cs b/Examples/Example.Net5.0.PermissionBasedAuthorization/Startup.cs similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/Startup.cs rename to Examples/Example.Net5.0.PermissionBasedAuthorization/Startup.cs diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net5.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net5.0.PermissionBasedAuthorization/UserClaimsProvider.cs diff --git a/Examples/Example.NetCore5.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net5.0.PermissionBasedAuthorization/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.PermissionBasedAuthorization/appsettings.json rename to Examples/Example.Net5.0.PermissionBasedAuthorization/appsettings.json diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs similarity index 88% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs index 661c40a..fea2433 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser.Controllers +namespace Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index 064f450..b0a2681 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore5._0.AuthenticationUsingIdentityUser.Models; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser.Data +namespace Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data { public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj similarity index 82% rename from Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj index 167840a..7d5bc5f 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -2,7 +2,7 @@ net5.0 - Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity + Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs similarity index 63% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs index e502a59..2945bd6 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Models +namespace Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..0300a1d --- /dev/null +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json index b73f2cf..e7c5590 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity": { "commandName": "Project", "dotnetRunMessages": "true", "launchBrowser": true, @@ -25,4 +25,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs similarity index 90% rename from Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs index 1df60d9..7990b62 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs @@ -1,5 +1,5 @@ -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -11,7 +11,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; -namespace Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity +namespace Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity { public class Startup { diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index 2a773d9..abe5090 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore5._0.AuthenticationWithRefreshToken.Controllers +namespace Example.Net5._0.RefreshTokenWithConfidenceInterval.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs similarity index 69% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index b4045fa..e87f5ef 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore5._0.AuthenticationWithRefreshToken.Models; +using Example.Net5._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore5._0.AuthenticationWithRefreshToken.Data +namespace Example.Net5._0.RefreshTokenWithConfidenceInterval.Data { public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Example.Net5.0.RefreshTokenWithConfidenceInterval.csproj similarity index 83% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Example.Net5.0.RefreshTokenWithConfidenceInterval.csproj index 4fb55cf..e4784db 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Example.NetCore5.0.RefreshTokenWithConfidenceInterval.csproj +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Example.Net5.0.RefreshTokenWithConfidenceInterval.csproj @@ -1,18 +1,18 @@ - - - - net5.0 - disable - disable - Example.NetCore5._0.RefreshTokenWithConfidenceInterval - - - - - - - - - - - + + + + net5.0 + disable + disable + Example.Net5._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + diff --git a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs similarity index 68% rename from Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 83b2d62..2205b69 100644 --- a/Examples/Example.NetCore5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore5._0.AuthenticationWithRefreshToken.Models +namespace Example.Net5._0.RefreshTokenWithConfidenceInterval.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 85% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Program.cs index a5a72c4..ab3b090 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -1,19 +1,19 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval -{ - public static class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - private static IHostBuilder CreateHostBuilder(string[] args) - { - return Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); - } - } +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Example.Net5._0.RefreshTokenWithConfidenceInterval +{ + public static class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + private static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } + } } \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json index cf928d8..1302715 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "Example.Net5._0.RefreshTokenWithConfidenceInterval": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Startup.cs similarity index 91% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Startup.cs index e980087..64a48ea 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Startup.cs @@ -1,5 +1,5 @@ -using Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Data; -using Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net5._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net5._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; @@ -11,7 +11,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval +namespace Example.Net5._0.RefreshTokenWithConfidenceInterval { public class Startup { diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/appsettings.json rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/appsettings.json diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net5.0.WithCredentialsValidator/Controllers/ExampleController.cs similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.WithCredentialsValidator/Controllers/ExampleController.cs diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/Example.NetCore5.0.WithCredentialsValidator.csproj b/Examples/Example.Net5.0.WithCredentialsValidator/Example.Net5.0.WithCredentialsValidator.csproj similarity index 77% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/Example.NetCore5.0.WithCredentialsValidator.csproj rename to Examples/Example.Net5.0.WithCredentialsValidator/Example.Net5.0.WithCredentialsValidator.csproj index f24d7ef..500f62a 100644 --- a/Examples/Example.NetCore5.0.WithCredentialsValidator/Example.NetCore5.0.WithCredentialsValidator.csproj +++ b/Examples/Example.Net5.0.WithCredentialsValidator/Example.Net5.0.WithCredentialsValidator.csproj @@ -2,6 +2,7 @@ net5.0 + Example.Net5.0.WithCredentialsValidator diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net5.0.WithCredentialsValidator/Program.cs similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net5.0.WithCredentialsValidator/Program.cs diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net5.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net5.0.WithCredentialsValidator/Properties/launchSettings.json diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/Startup.cs b/Examples/Example.Net5.0.WithCredentialsValidator/Startup.cs similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/Startup.cs rename to Examples/Example.Net5.0.WithCredentialsValidator/Startup.cs diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net5.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net5.0.WithCredentialsValidator/UserCredentialsValidator.cs diff --git a/Examples/Example.NetCore5.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net5.0.WithCredentialsValidator/appsettings.json similarity index 100% rename from Examples/Example.NetCore5.0.WithCredentialsValidator/appsettings.json rename to Examples/Example.Net5.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs index c0bb58f..4d88fa0 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Controllers +namespace Example.Net6._0.AuthenticationUsingGenericIdentityUser.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs similarity index 64% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index 665a455..bb2fa62 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,9 @@ -using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net6._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Data; +namespace Example.Net6._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext { public AppDbContext(DbContextOptions options) diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Example.Net6.0.AuthenticationUsingGenericIdentityUser.csproj similarity index 83% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Example.Net6.0.AuthenticationUsingGenericIdentityUser.csproj index 509450f..9e61bca 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser.csproj +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Example.Net6.0.AuthenticationUsingGenericIdentityUser.csproj @@ -1,19 +1,19 @@ - - - - net6.0 - enable - disable - Example.NetCore6._0.AuthenticationUsingGenericIdentityUser - - - - - - - - - - - - + + + + net6.0 + enable + disable + Example.Net6._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index b55a57a..61ee31a 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; +namespace Example.Net6._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs similarity index 92% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index bed4955..3f67cf4 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -1,5 +1,5 @@ -using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Data; -using Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net6._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net6._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json index 653e423..17122ff 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "Example.Net6._0.AuthenticationUsingGenericIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/appsettings.json diff --git a/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..5a49713 --- /dev/null +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net6._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs similarity index 69% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index 4b6120d..91be9f3 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore8._0.AuthenticationWithRefreshToken.Models; +using Example.Net6._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Data +namespace Example.Net6._0.AuthenticationUsingIdentityUser.Data { public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Example.Net6.0.AuthenticationUsingIdentityUser.csproj similarity index 84% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Example.Net6.0.AuthenticationUsingIdentityUser.csproj index 9b742e7..5d801a3 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Example.NetCore6.0.AuthenticationUsingIdentityUser.csproj +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Example.Net6.0.AuthenticationUsingIdentityUser.csproj @@ -1,19 +1,19 @@ - - - - net6.0 - enable - enable - Example.NetCore6._0.AuthenticationUsingIdentityUser - - - - - - - - - - - - + + + + net6.0 + enable + enable + Example.Net6._0.AuthenticationUsingIdentityUser + + + + + + + + + + + + diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs similarity index 66% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index f33ae30..5547455 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Models +namespace Example.Net6._0.AuthenticationUsingIdentityUser.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Program.cs similarity index 87% rename from Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Program.cs index 6a1e549..0faa530 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore7._0.AuthenticationUsingIdentityUser.Data; -using Example.NetCore7._0.AuthenticationUsingIdentityUser.Models; +using Example.Net6._0.AuthenticationUsingIdentityUser.Data; +using Example.Net6._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index 78fb330..c7aeb04 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "Example.Net6._0.AuthenticationUsingIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/appsettings.json diff --git a/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..a1f7d36 --- /dev/null +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net6._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..1517267 --- /dev/null +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net6._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net6._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Example.NetCore6.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Example.Net6.0.AuthenticationWithRefreshToken.csproj similarity index 81% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Example.NetCore6.0.AuthenticationWithRefreshToken.csproj rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Example.Net6.0.AuthenticationWithRefreshToken.csproj index 81757c0..92163ce 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Example.NetCore6.0.AuthenticationWithRefreshToken.csproj +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Example.Net6.0.AuthenticationWithRefreshToken.csproj @@ -1,18 +1,18 @@ - - - - net6.0 - enable - enable - Example.NetCore6._0.AuthenticationWithRefreshToken - - - - - - - - - - - + + + + net6.0 + enable + enable + Example.Net6._0.AuthenticationWithRefreshToken + + + + + + + + + + + diff --git a/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..6bcb9b9 --- /dev/null +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net6._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs similarity index 92% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs index 366e61e..87a85a9 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore7._0.AuthenticationWithRefreshToken.Data; -using Example.NetCore7._0.AuthenticationWithRefreshToken.Models; +using Example.Net6._0.AuthenticationWithRefreshToken.Data; +using Example.Net6._0.AuthenticationWithRefreshToken.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index 33e5468..5ee41b9 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "Example.Net6._0.AuthenticationWithRefreshToken": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.BaseAuthentication/appsettings.json rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/appsettings.json diff --git a/Examples/Example.NetCore6.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net6.0.BaseAuthentication/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore6.0.BaseAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.BaseAuthentication/Controllers/ExampleController.cs index f6ed465..f608ac1 100644 --- a/Examples/Example.NetCore6.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.BaseAuthentication/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.BaseAuthentication.Controllers +namespace Example.Net6._0.BaseAuthentication.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.BaseAuthentication/Example.NetCore6.0.BaseAuthentication.csproj b/Examples/Example.Net6.0.BaseAuthentication/Example.Net6.0.BaseAuthentication.csproj similarity index 79% rename from Examples/Example.NetCore6.0.BaseAuthentication/Example.NetCore6.0.BaseAuthentication.csproj rename to Examples/Example.Net6.0.BaseAuthentication/Example.Net6.0.BaseAuthentication.csproj index 6a78e29..0cff828 100644 --- a/Examples/Example.NetCore6.0.BaseAuthentication/Example.NetCore6.0.BaseAuthentication.csproj +++ b/Examples/Example.Net6.0.BaseAuthentication/Example.Net6.0.BaseAuthentication.csproj @@ -1,14 +1,14 @@ - - - - net6.0 - enable - enable - Example.NetCore6._0.BaseAuthentication - - - - - - - + + + + net6.0 + enable + enable + Example.Net6._0.BaseAuthentication + + + + + + + diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Program.cs b/Examples/Example.Net6.0.BaseAuthentication/Program.cs similarity index 100% rename from Examples/Example.NetCore7.0.BaseAuthentication/Program.cs rename to Examples/Example.Net6.0.BaseAuthentication/Program.cs diff --git a/Examples/Example.NetCore6.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net6.0.BaseAuthentication/Properties/launchSettings.json similarity index 90% rename from Examples/Example.NetCore6.0.BaseAuthentication/Properties/launchSettings.json rename to Examples/Example.Net6.0.BaseAuthentication/Properties/launchSettings.json index 6b0f270..a3ab621 100644 --- a/Examples/Example.NetCore6.0.BaseAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.BaseAuthentication/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:14733", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.BaseAuthentication": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5063", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:14733", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.BaseAuthentication": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5063", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net6.0.BaseAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.CookiesBasedAuthentication/appsettings.json rename to Examples/Example.Net6.0.BaseAuthentication/appsettings.json diff --git a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index dd8ccfe..7c4ab73 100644 --- a/Examples/Example.NetCore5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore5._0.CookiesBasedAuthentication.Controllers +namespace Example.Net6._0.CookiesBasedAuthentication.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Example.NetCore6.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net6.0.CookiesBasedAuthentication/Example.Net6.0.CookiesBasedAuthentication.csproj similarity index 78% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/Example.NetCore6.0.CookiesBasedAuthentication.csproj rename to Examples/Example.Net6.0.CookiesBasedAuthentication/Example.Net6.0.CookiesBasedAuthentication.csproj index 2971aab..01469ca 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Example.NetCore6.0.CookiesBasedAuthentication.csproj +++ b/Examples/Example.Net6.0.CookiesBasedAuthentication/Example.Net6.0.CookiesBasedAuthentication.csproj @@ -1,13 +1,13 @@ - - - - net6.0 - enable - disable - Example.NetCore6._0.CookiesBasedAuthentication - - - - - - + + + + net6.0 + enable + disable + Example.Net6._0.CookiesBasedAuthentication + + + + + + diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net6.0.CookiesBasedAuthentication/ProgramCookies.cs similarity index 100% rename from Examples/Example.NetCore7.0.CookiesBasedAuthentication/ProgramCookies.cs rename to Examples/Example.Net6.0.CookiesBasedAuthentication/ProgramCookies.cs diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net6.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net6.0.CookiesBasedAuthentication/Properties/launchSettings.json index 27e1352..a29f68d 100644 --- a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.CookiesBasedAuthentication": { + "Example.Net6._0.CookiesBasedAuthentication": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net6.0.CookiesBasedAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/appsettings.json rename to Examples/Example.Net6.0.CookiesBasedAuthentication/appsettings.json diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index 3918c79..450b79a 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; -namespace Example.NetCore6._0.PermissionBasedAuthorization.Controllers +namespace Example.Net6._0.PermissionBasedAuthorization.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Example.NetCore6.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net6.0.PermissionBasedAuthorization/Example.Net6.0.PermissionBasedAuthorization.csproj similarity index 77% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Example.NetCore6.0.PermissionBasedAuthorization.csproj rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Example.Net6.0.PermissionBasedAuthorization.csproj index 6cd41e9..28f4193 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Example.NetCore6.0.PermissionBasedAuthorization.csproj +++ b/Examples/Example.Net6.0.PermissionBasedAuthorization/Example.Net6.0.PermissionBasedAuthorization.csproj @@ -1,14 +1,14 @@ - - - - net6.0 - enable - enable - Example.NetCore6._0.PermissionBasedAuthorization - - - - - - - + + + + net6.0 + enable + enable + Example.Net6._0.PermissionBasedAuthorization + + + + + + + diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net6.0.PermissionBasedAuthorization/Program.cs similarity index 93% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Program.cs index bff1793..7ec7fef 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.Net6.0.PermissionBasedAuthorization/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore9._0.PermissionBasedAuthorization; +using Example.Net6._0.PermissionBasedAuthorization; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net6.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Properties/launchSettings.json index 1cbc210..c628549 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.PermissionBasedAuthorization": { + "Example.Net6._0.PermissionBasedAuthorization": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net6.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 92% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net6.0.PermissionBasedAuthorization/UserClaimsProvider.cs index d836cab..7e8e666 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.Net6.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -1,7 +1,7 @@ using System.Security.Claims; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore8._0.PermissionBasedAuthorization +namespace Example.Net6._0.PermissionBasedAuthorization { public class UserClaimsProvider : IUserClaimsProvider { diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net6.0.PermissionBasedAuthorization/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json rename to Examples/Example.Net6.0.PermissionBasedAuthorization/appsettings.json diff --git a/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..37e7314 --- /dev/null +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} \ No newline at end of file diff --git a/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..fcfe5d5 --- /dev/null +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj similarity index 83% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj index 7b4d676..a4696bd 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Example.NetCore6.0.RefreshTokenWithConfidenceInterval.csproj +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -1,18 +1,18 @@ - - - - net6.0 - disable - disable - Example.NetCore6._0.RefreshTokenWithConfidenceInterval - - - - - - - - - - - + + + + net6.0 + disable + disable + Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity + + + + + + + + + + + diff --git a/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..d1d61f4 --- /dev/null +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs similarity index 88% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index bf3587a..b701b52 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -1,65 +1,65 @@ -using Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; -using Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.AspNetCore.Builder; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); - -var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; - -builder.Services - .AddDbContext(options => - options.UseInMemoryDatabase("TestDb_Net6") - ); - -builder.Services - .AddJwtAuthenticationWithIdentity() - .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) - .AddLogout() - .AddRegistration(); - -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseDefaultDbUser("Admin", "Admin"); - -app.UseRouting(); - -app.UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - -app.UseRefreshTokenMiddleware(); -app.UseRefreshTokenLogoutMiddleware(); - -app.UseRegistration(x => new CustomUser -{ - UserName = x.Login, - NormalizedUserName = x.Login, -} - ); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.Run(); - +using Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("TestDb_Net6") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + public partial class Program { } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json index 275dc04..0ad1635 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/appsettings.json rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs similarity index 87% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index 56a9b62..3c1ee98 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Controllers; +namespace Example.Net6._0.RefreshTokenWithConfidenceInterval.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index 3fd05e0..21ec4d2 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net6._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Data; +namespace Example.Net6._0.RefreshTokenWithConfidenceInterval.Data; public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Example.Net6.0.RefreshTokenWithConfidenceInterval.csproj similarity index 82% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Example.Net6.0.RefreshTokenWithConfidenceInterval.csproj index 8b64dd7..4fb7f8e 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Example.Net6.0.RefreshTokenWithConfidenceInterval.csproj @@ -1,18 +1,18 @@ - - - - net6.0 - disable - disable - Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity - - - - - - - - - - - + + + + net6.0 + disable + disable + Example.Net6._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 8c31146..2a662ce 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Models; +namespace Example.Net6._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 92% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Program.cs index 5acf728..88b8ed8 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Data; -using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net6._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net6._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json index cf928d8..22181a4 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "Example.Net6._0.RefreshTokenWithConfidenceInterval": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/appsettings.json rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/appsettings.json diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net6.0.WithCredentialsValidator/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/Controllers/ExampleController.cs index 05d0829..ffdce7e 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore7._0.WithCredentialsValidator.Controllers +namespace Example.Net6._0.WithCredentialsValidator.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/Example.NetCore6.0.WithCredentialsValidator.csproj b/Examples/Example.Net6.0.WithCredentialsValidator/Example.Net6.0.WithCredentialsValidator.csproj similarity index 85% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Example.NetCore6.0.WithCredentialsValidator.csproj rename to Examples/Example.Net6.0.WithCredentialsValidator/Example.Net6.0.WithCredentialsValidator.csproj index f81a4ca..912c7e6 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Example.NetCore6.0.WithCredentialsValidator.csproj +++ b/Examples/Example.Net6.0.WithCredentialsValidator/Example.Net6.0.WithCredentialsValidator.csproj @@ -1,22 +1,22 @@ - - - - net6.0 - enable - enable - Example.NetCore6._0.WithCredentialsValidator - - - - - - - - - PreserveNewest - true - PreserveNewest - - - - + + + + net6.0 + enable + enable + Example.Net6._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net6.0.WithCredentialsValidator/Program.cs similarity index 95% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/Program.cs index 637d4a0..84a30ae 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.Net6.0.WithCredentialsValidator/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore8._0.WithCredentialsValidator; +using Example.Net6._0.WithCredentialsValidator; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net6.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net6.0.WithCredentialsValidator/Properties/launchSettings.json index 2dd163f..78f0842 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.WithCredentialsValidator/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.WithCredentialsValidator": { + "Example.Net6._0.WithCredentialsValidator": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 88% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs index c9185f6..101ac43 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -1,6 +1,6 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore8._0.WithCredentialsValidator +namespace Example.Net6._0.WithCredentialsValidator { public class UserCredentialsValidator : IUserCredentialsValidator { diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net6.0.WithCredentialsValidator/appsettings.json similarity index 100% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/appsettings.json rename to Examples/Example.Net6.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..57a0f1b --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs similarity index 64% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index 651f8c1..e6569f1 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,9 @@ -using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net7._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Data; +namespace Example.Net7._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext { public AppDbContext(DbContextOptions options) diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj similarity index 85% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj index 0011ed8..049a111 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser.csproj +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj @@ -4,7 +4,7 @@ net7.0 enable disable - Example.NetCore7._0.AuthenticationUsingGenericIdentityUser + Example.Net7._0.AuthenticationUsingGenericIdentityUser diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index c0b2150..6be15ad 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; +namespace Example.Net7._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs similarity index 92% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index b45d02a..a04e173 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -1,5 +1,5 @@ -using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Data; -using Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net7._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net7._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json index 653e423..17122ff 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "Example.Net6._0.AuthenticationUsingGenericIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/appsettings.json diff --git a/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..94cd7a9 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..8ade01d --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net7._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net7._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj similarity index 86% rename from Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj rename to Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj index a2620e0..bbaf0e6 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Example.NetCore7.0.AuthenticationUsingIdentityUser.csproj +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - Example.NetCore7._0.AuthenticationUsingIdentityUser + Example.Net7._0.AuthenticationUsingIdentityUser diff --git a/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..f62dc44 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net7._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Program.cs similarity index 87% rename from Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Program.cs index 62ea201..d63eb9a 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore8._0.AuthenticationUsingIdentityUser.Data; -using Example.NetCore8._0.AuthenticationUsingIdentityUser.Models; +using Example.Net7._0.AuthenticationUsingIdentityUser.Data; +using Example.Net7._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index 78fb330..c7aeb04 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "Example.Net6._0.AuthenticationUsingIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net7.0.AuthenticationUsingIdentityUser/appsettings.json diff --git a/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..2f4d5a7 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..f40c4cd --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net7._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net7._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj similarity index 84% rename from Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj rename to Examples/Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj index 8f6bca1..535b6ae 100644 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Example.NetCore7.0.AuthenticationWithRefreshToken.csproj +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - Example.NetCore7._0.AuthenticationWithRefreshToken + Example.Net7._0.AuthenticationWithRefreshToken diff --git a/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..639fcf6 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net7._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Program.cs similarity index 92% rename from Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net7.0.AuthenticationWithRefreshToken/Program.cs index 941f16b..7c1343e 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore9._0.AuthenticationWithRefreshToken.Data; -using Example.NetCore9._0.AuthenticationWithRefreshToken.Models; +using Example.Net7._0.AuthenticationWithRefreshToken.Data; +using Example.Net7._0.AuthenticationWithRefreshToken.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index 33e5468..5ee41b9 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "Example.Net6._0.AuthenticationWithRefreshToken": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.BaseAuthentication/appsettings.json rename to Examples/Example.Net7.0.AuthenticationWithRefreshToken/appsettings.json diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net7.0.BaseAuthentication/Controllers/ExampleController.cs similarity index 86% rename from Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net7.0.BaseAuthentication/Controllers/ExampleController.cs index efc3bb4..4e5a9ac 100644 --- a/Examples/Example.NetCore9.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net7.0.BaseAuthentication/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore9._0.BaseAuthentication.Controllers; +namespace Example.Net7._0.BaseAuthentication.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj b/Examples/Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj similarity index 81% rename from Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj rename to Examples/Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj index f273f26..d82c340 100644 --- a/Examples/Example.NetCore7.0.BaseAuthentication/Example.NetCore7.0.BaseAuthentication.csproj +++ b/Examples/Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - Example.NetCore7._0.BaseAuthentication + Example.Net7._0.BaseAuthentication diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Program.cs b/Examples/Example.Net7.0.BaseAuthentication/Program.cs similarity index 100% rename from Examples/Example.NetCore8.0.BaseAuthentication/Program.cs rename to Examples/Example.Net7.0.BaseAuthentication/Program.cs diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net7.0.BaseAuthentication/Properties/launchSettings.json similarity index 100% rename from Examples/Example.NetCore7.0.BaseAuthentication/Properties/launchSettings.json rename to Examples/Example.Net7.0.BaseAuthentication/Properties/launchSettings.json diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net7.0.BaseAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.CookiesBasedAuthentication/appsettings.json rename to Examples/Example.Net7.0.BaseAuthentication/appsettings.json diff --git a/Examples/Example.Net7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..8561757 --- /dev/null +++ b/Examples/Example.Net7.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj similarity index 80% rename from Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj rename to Examples/Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj index 7f8b85f..15b3047 100644 --- a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Example.NetCore7.0.CookiesBasedAuthentication.csproj +++ b/Examples/Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj @@ -4,7 +4,7 @@ net7.0 enable disable - Example.NetCore7._0.CookiesBasedAuthentication + Example.Net7._0.CookiesBasedAuthentication diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net7.0.CookiesBasedAuthentication/ProgramCookies.cs similarity index 100% rename from Examples/Example.NetCore8.0.CookiesBasedAuthentication/ProgramCookies.cs rename to Examples/Example.Net7.0.CookiesBasedAuthentication/ProgramCookies.cs diff --git a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net7.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net7.0.CookiesBasedAuthentication/Properties/launchSettings.json index 27e1352..a29f68d 100644 --- a/Examples/Example.NetCore7.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.CookiesBasedAuthentication": { + "Example.Net6._0.CookiesBasedAuthentication": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net7.0.CookiesBasedAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/appsettings.json rename to Examples/Example.Net7.0.CookiesBasedAuthentication/appsettings.json diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs rename to Examples/Example.Net7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index e16f85f..1e7833b 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; -namespace Example.NetCore8._0.PermissionBasedAuthorization.Controllers +namespace Example.Net7._0.PermissionBasedAuthorization.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj similarity index 79% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj rename to Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj index 982c488..bdec672 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Example.NetCore7.0.PermissionBasedAuthorization.csproj +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - Example.NetCore7._0.PermissionBasedAuthorization + Example.Net7._0.PermissionBasedAuthorization diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs similarity index 93% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs index 2b16221..b2d9fd7 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore7._0.PermissionBasedAuthorization; +using Example.Net7._0.PermissionBasedAuthorization; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net7.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net7.0.PermissionBasedAuthorization/Properties/launchSettings.json index 1cbc210..c628549 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.PermissionBasedAuthorization": { + "Example.Net6._0.PermissionBasedAuthorization": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 92% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs index 0f5e2a5..3d815ee 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -1,7 +1,7 @@ using System.Security.Claims; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore9._0.PermissionBasedAuthorization +namespace Example.Net7._0.PermissionBasedAuthorization { public class UserClaimsProvider : IUserClaimsProvider { diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net7.0.PermissionBasedAuthorization/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json rename to Examples/Example.Net7.0.PermissionBasedAuthorization/appsettings.json diff --git a/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..e88913f --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..0512704 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj similarity index 84% rename from Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj rename to Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj index ed33708..68f8038 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -4,7 +4,7 @@ net7.0 disable disable - Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity + Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity diff --git a/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..26da2ea --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs similarity index 91% rename from Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename to Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index faac91d..d9aefd9 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; -using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..0ad1635 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/appsettings.json rename to Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs similarity index 87% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index bce7f60..eb887a7 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Controllers; +namespace Example.Net7._0.RefreshTokenWithConfidenceInterval.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index 5b2573c..cdf942a 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net7._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Data; +namespace Example.Net7._0.RefreshTokenWithConfidenceInterval.Data; public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj similarity index 85% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj index 52146ec..e744196 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Example.NetCore7.0.RefreshTokenWithConfidenceInterval.csproj +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj @@ -4,7 +4,7 @@ net7.0 disable disable - Example.NetCore7._0.RefreshTokenWithConfidenceInterval + Example.Net7._0.RefreshTokenWithConfidenceInterval diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 8f1bde4..52d4e5d 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; +namespace Example.Net7._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 92% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs index bd5e3b5..b78f2bd 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Data; -using Example.NetCore8._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net7._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net7._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json index cf928d8..22181a4 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { + "Example.Net6._0.RefreshTokenWithConfidenceInterval": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/appsettings.json rename to Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/appsettings.json diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Controllers/ExampleController.cs rename to Examples/Example.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs index d0f5f7c..27316c8 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.WithCredentialsValidator.Controllers +namespace Example.Net7._0.WithCredentialsValidator.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj b/Examples/Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj similarity index 88% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj rename to Examples/Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj index 1793b37..f65466f 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Example.NetCore7.0.WithCredentialsValidator.csproj +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj @@ -4,7 +4,7 @@ net7.0 enable enable - Example.NetCore7._0.WithCredentialsValidator + Example.Net7._0.WithCredentialsValidator diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net7.0.WithCredentialsValidator/Program.cs similarity index 95% rename from Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net7.0.WithCredentialsValidator/Program.cs index eb75292..27c64ee 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore9._0.WithCredentialsValidator; +using Example.Net7._0.WithCredentialsValidator; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net7.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net7.0.WithCredentialsValidator/Properties/launchSettings.json index 2dd163f..78f0842 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Properties/launchSettings.json +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.WithCredentialsValidator": { + "Example.Net6._0.WithCredentialsValidator": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 88% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs index b150a03..e07f10b 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -1,6 +1,6 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore7._0.WithCredentialsValidator +namespace Example.Net7._0.WithCredentialsValidator { public class UserCredentialsValidator : IUserCredentialsValidator { diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net7.0.WithCredentialsValidator/appsettings.json similarity index 100% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/appsettings.json rename to Examples/Example.Net7.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..1e3a2c3 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs similarity index 64% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index 89619ae..242f3ab 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,9 @@ -using Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net8._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Data; +namespace Example.Net8._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext { public AppDbContext(DbContextOptions options) diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj similarity index 85% rename from Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj index 1b7169a..641c097 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser.csproj +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj @@ -4,7 +4,7 @@ net8.0 enable disable - Example.NetCore8._0.AuthenticationUsingGenericIdentityUser + Example.Net8._0.AuthenticationUsingGenericIdentityUser diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index 6b35ae8..331f255 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Models; +namespace Example.Net8._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs similarity index 92% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index 29aa34c..e06d191 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -1,5 +1,5 @@ -using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Data; -using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net8._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net8._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json similarity index 91% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json index 653e423..17122ff 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { + "Example.Net6._0.AuthenticationUsingGenericIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/appsettings.json diff --git a/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..bb9832d --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..94e011c --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net8._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net8._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj similarity index 86% rename from Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj rename to Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj index 3979f5e..5e8bbfb 100644 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Example.NetCore8.0.AuthenticationUsingIdentityUser.csproj +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - Example.NetCore8._0.AuthenticationUsingIdentityUser + Example.Net8._0.AuthenticationUsingIdentityUser diff --git a/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..a82fe0d --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net8._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Program.cs similarity index 87% rename from Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Program.cs index 3f36af8..24ead6d 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore9._0.AuthenticationUsingIdentityUser.Data; -using Example.NetCore9._0.AuthenticationUsingIdentityUser.Models; +using Example.Net8._0.AuthenticationUsingIdentityUser.Data; +using Example.Net8._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index 78fb330..c7aeb04 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationUsingIdentityUser": { + "Example.Net6._0.AuthenticationUsingIdentityUser": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net8.0.AuthenticationUsingIdentityUser/appsettings.json diff --git a/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..3f729b7 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..f001c48 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net8._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net8._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj similarity index 84% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj rename to Examples/Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj index 9d8fab3..dddbf15 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Example.NetCore8.0.AuthenticationWithRefreshToken.csproj +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - Example.NetCore8._0.AuthenticationWithRefreshToken + Example.Net8._0.AuthenticationWithRefreshToken diff --git a/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..d8c298e --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net8._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Program.cs similarity index 92% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net8.0.AuthenticationWithRefreshToken/Program.cs index 813a9be..32ae423 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore8._0.AuthenticationWithRefreshToken.Data; -using Example.NetCore8._0.AuthenticationWithRefreshToken.Models; +using Example.Net8._0.AuthenticationWithRefreshToken.Data; +using Example.Net8._0.AuthenticationWithRefreshToken.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index 33e5468..5ee41b9 100644 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.AuthenticationWithRefreshToken": { + "Example.Net6._0.AuthenticationWithRefreshToken": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.BaseAuthentication/appsettings.json rename to Examples/Example.Net8.0.AuthenticationWithRefreshToken/appsettings.json diff --git a/Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net8.0.BaseAuthentication/Controllers/ExampleController.cs similarity index 86% rename from Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net8.0.BaseAuthentication/Controllers/ExampleController.cs index a061833..03fa269 100644 --- a/Examples/Example.NetCore7.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net8.0.BaseAuthentication/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore7._0.BaseAuthentication.Controllers; +namespace Example.Net8._0.BaseAuthentication.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj b/Examples/Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj similarity index 81% rename from Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj rename to Examples/Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj index 3358e0e..956aa2d 100644 --- a/Examples/Example.NetCore8.0.BaseAuthentication/Example.NetCore8.0.BaseAuthentication.csproj +++ b/Examples/Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - Example.NetCore8._0.BaseAuthentication + Example.Net8._0.BaseAuthentication diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Program.cs b/Examples/Example.Net8.0.BaseAuthentication/Program.cs similarity index 100% rename from Examples/Example.NetCore9.0.BaseAuthentication/Program.cs rename to Examples/Example.Net8.0.BaseAuthentication/Program.cs diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net8.0.BaseAuthentication/Properties/launchSettings.json similarity index 100% rename from Examples/Example.NetCore8.0.BaseAuthentication/Properties/launchSettings.json rename to Examples/Example.Net8.0.BaseAuthentication/Properties/launchSettings.json diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net8.0.BaseAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.CookiesBasedAuthentication/appsettings.json rename to Examples/Example.Net8.0.BaseAuthentication/appsettings.json diff --git a/Examples/Example.Net8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..5be8f1c --- /dev/null +++ b/Examples/Example.Net8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj similarity index 80% rename from Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj rename to Examples/Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj index d6b9750..3ab4010 100644 --- a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Example.NetCore8.0.CookiesBasedAuthentication.csproj +++ b/Examples/Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj @@ -4,7 +4,7 @@ net8.0 enable disable - Example.NetCore8._0.CookiesBasedAuthentication + Example.Net8._0.CookiesBasedAuthentication diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net8.0.CookiesBasedAuthentication/ProgramCookies.cs similarity index 100% rename from Examples/Example.NetCore9.0.CookiesBasedAuthentication/ProgramCookies.cs rename to Examples/Example.Net8.0.CookiesBasedAuthentication/ProgramCookies.cs diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net8.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net8.0.CookiesBasedAuthentication/Properties/launchSettings.json index 27e1352..a29f68d 100644 --- a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.CookiesBasedAuthentication": { + "Example.Net6._0.CookiesBasedAuthentication": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net8.0.CookiesBasedAuthentication/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/appsettings.json rename to Examples/Example.Net8.0.CookiesBasedAuthentication/appsettings.json diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs rename to Examples/Example.Net8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index 9eb36b6..4e99dc3 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; -namespace Example.NetCore7._0.PermissionBasedAuthorization.Controllers +namespace Example.Net8._0.PermissionBasedAuthorization.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj similarity index 80% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj rename to Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj index 1b8a6db..139e1fe 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Example.NetCore8.0.PermissionBasedAuthorization.csproj +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - Example.NetCore8._0.PermissionBasedAuthorization + Example.Net8._0.PermissionBasedAuthorization diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs similarity index 93% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs index c831415..17567dc 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore8._0.PermissionBasedAuthorization; +using Example.Net8._0.PermissionBasedAuthorization; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net8.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 92% rename from Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net8.0.PermissionBasedAuthorization/Properties/launchSettings.json index 1cbc210..c628549 100644 --- a/Examples/Example.NetCore8.0.PermissionBasedAuthorization/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.PermissionBasedAuthorization": { + "Example.Net6._0.PermissionBasedAuthorization": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 92% rename from Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs index d2a38a1..11d0207 100644 --- a/Examples/Example.NetCore7.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -1,7 +1,7 @@ using System.Security.Claims; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore7._0.PermissionBasedAuthorization +namespace Example.Net8._0.PermissionBasedAuthorization { public class UserClaimsProvider : IUserClaimsProvider { diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net8.0.PermissionBasedAuthorization/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json rename to Examples/Example.Net8.0.PermissionBasedAuthorization/appsettings.json diff --git a/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..9c0c738 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..c9779bd --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj similarity index 84% rename from Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj rename to Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj index 1d1d495..112498c 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -4,7 +4,7 @@ net8.0 disable disable - Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity + Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity diff --git a/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..b1bf49c --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs similarity index 91% rename from Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename to Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index aece4e0..358f061 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; -using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..0ad1635 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/appsettings.json rename to Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs similarity index 87% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index 998e3f7..40933d9 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Controllers; +namespace Example.Net8._0.RefreshTokenWithConfidenceInterval.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index b8383dc..a4fe229 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net8._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Data; +namespace Example.Net8._0.RefreshTokenWithConfidenceInterval.Data; public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj similarity index 85% rename from Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj index 295ad75..0a88058 100644 --- a/Examples/Example.NetCore8.0.RefreshTokenWithConfidenceInterval/Example.NetCore8.0.RefreshTokenWithConfidenceInterval.csproj +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj @@ -4,7 +4,7 @@ net8.0 disable disable - Example.NetCore8._0.RefreshTokenWithConfidenceInterval + Example.Net8._0.RefreshTokenWithConfidenceInterval diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 6f8ceb0..a8cbfec 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; +namespace Example.Net8._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 92% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs index 9b4a737..2f905ae 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Data; -using Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net8._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net8._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..22181a4 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.RefreshTokenWithConfidenceInterval": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/appsettings.json similarity index 99% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json rename to Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/appsettings.json @@ -1,6 +1,6 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs rename to Examples/Example.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs index 65132d3..fbd7d53 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore8._0.WithCredentialsValidator.Controllers +namespace Example.Net8._0.WithCredentialsValidator.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj b/Examples/Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj similarity index 88% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj rename to Examples/Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj index 8afbfc8..e31c39a 100644 --- a/Examples/Example.NetCore8.0.WithCredentialsValidator/Example.NetCore8.0.WithCredentialsValidator.csproj +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - Example.NetCore8._0.WithCredentialsValidator + Example.Net8._0.WithCredentialsValidator diff --git a/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net8.0.WithCredentialsValidator/Program.cs similarity index 95% rename from Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net8.0.WithCredentialsValidator/Program.cs index c4eecb0..4f3f526 100644 --- a/Examples/Example.NetCore7.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Program.cs @@ -1,4 +1,4 @@ -using Example.NetCore7._0.WithCredentialsValidator; +using Example.Net8._0.WithCredentialsValidator; using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net8.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 93% rename from Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net8.0.WithCredentialsValidator/Properties/launchSettings.json index 2dd163f..78f0842 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Properties/launchSettings.json +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Properties/launchSettings.json @@ -9,7 +9,7 @@ } }, "profiles": { - "Example.NetCore6._0.WithCredentialsValidator": { + "Example.Net6._0.WithCredentialsValidator": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, @@ -28,4 +28,4 @@ } } } -} +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 88% rename from Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs index 28533da..19130f0 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -1,6 +1,6 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore9._0.WithCredentialsValidator +namespace Example.Net8._0.WithCredentialsValidator { public class UserCredentialsValidator : IUserCredentialsValidator { diff --git a/Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net8.0.WithCredentialsValidator/appsettings.json similarity index 100% rename from Examples/Example.NetCore8.0.WithCredentialsValidator/appsettings.json rename to Examples/Example.Net8.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..546423a --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.AuthenticationUsingGenericIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs similarity index 64% rename from Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs index 8cda405..cc3c953 100644 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,9 @@ -using Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Models; +using Example.Net9._0.AuthenticationUsingGenericIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Data; +namespace Example.Net9._0.AuthenticationUsingGenericIdentityUser.Data; + public class AppDbContext : TourmalineDbContext { public AppDbContext(DbContextOptions options) diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj similarity index 85% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj index d761248..a1b733b 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser.csproj +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj @@ -4,7 +4,7 @@ net9.0 enable disable - Example.NetCore9._0.AuthenticationUsingGenericIdentityUser + Example.Net9._0.AuthenticationUsingGenericIdentityUser diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index 971a421..95007cf 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Models; +namespace Example.Net9._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index 75238a2..919d647 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -1,66 +1,66 @@ -using Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Data; -using Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Models; -using Microsoft.AspNetCore.Builder; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); - -var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; - -builder.Services - .AddDbContext(options => - options.UseInMemoryDatabase("Database") - ); - -builder.Services - .AddJwtAuthenticationWithIdentity() - .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) - .AddLogout() - .AddRegistration(); - - -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseDefaultDbUser("Admin", "Admin"); - -app.UseRouting(); - -app.UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - -app.UseRefreshTokenMiddleware(); -app.UseRefreshTokenLogoutMiddleware(); - -app.UseRegistration(x => new CustomUser -{ - UserName = x.Login, - NormalizedUserName = x.Login, -} - ); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.Run(); - +using Example.Net9._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net9._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); + +var accessTokenExpireInMinutes = refreshAuthenticationOptions.AccessTokenExpireInMinutes; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout() + .AddRegistration(); + + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + public partial class ProgramGeneric { } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json similarity index 88% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json index 66b99da..17122ff 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:35556", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.AuthenticationUsingGenericIdentityUser": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5160", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:35556", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.AuthenticationUsingGenericIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5160", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/appsettings.json rename to Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/appsettings.json +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/appsettings.json @@ -1,6 +1,6 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } } \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs new file mode 100644 index 0000000..41eb6e7 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.AuthenticationUsingIdentityUser.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..d60bbae --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net9._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net9._0.AuthenticationUsingIdentityUser.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj similarity index 86% rename from Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj rename to Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj index 5dab5ef..53d80ac 100644 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Example.NetCore9.0.AuthenticationUsingIdentityUser.csproj +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - Example.NetCore9._0.AuthenticationUsingIdentityUser + Example.Net9._0.AuthenticationUsingIdentityUser diff --git a/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..d7a948b --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net9._0.AuthenticationUsingIdentityUser.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Program.cs similarity index 85% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Program.cs index 4cd8ad0..7d29c2c 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Program.cs @@ -1,37 +1,37 @@ -using Example.NetCore6._0.AuthenticationUsingIdentityUser.Data; -using Example.NetCore6._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -var builder = WebApplication.CreateBuilder(args); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services.AddDbContext(options => - options.UseInMemoryDatabase("Database") - ); - -builder.Services - .AddJwtAuthenticationWithIdentity() - .AddBaseLogin(configuration.GetSection(nameof(AuthenticationOptions)).Get()); -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseRouting(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - +using Example.Net9._0.AuthenticationUsingIdentityUser.Data; +using Example.Net9._0.AuthenticationUsingIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddBaseLogin(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index bddc0dd..c7aeb04 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:23668", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.AuthenticationUsingIdentityUser": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5105", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:23668", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.AuthenticationUsingIdentityUser": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5105", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net9.0.AuthenticationUsingIdentityUser/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/appsettings.json +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/appsettings.json @@ -1,6 +1,6 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } } \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs new file mode 100644 index 0000000..691d3f7 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.AuthenticationWithRefreshToken.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs new file mode 100644 index 0000000..b912134 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -0,0 +1,14 @@ +using Example.Net9._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net9._0.AuthenticationWithRefreshToken.Data +{ + public class AppDbContext : TourmalineDbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj similarity index 84% rename from Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj rename to Examples/Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj index ded0509..d028ad9 100644 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Example.NetCore9.0.AuthenticationWithRefreshToken.csproj +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - Example.NetCore9._0.AuthenticationWithRefreshToken + Example.Net9._0.AuthenticationWithRefreshToken diff --git a/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs new file mode 100644 index 0000000..910e1da --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net9._0.AuthenticationWithRefreshToken.Models +{ + public class CustomUser : IdentityUser + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Program.cs similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net9.0.AuthenticationWithRefreshToken/Program.cs index b6b40ee..d7f21a6 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Program.cs @@ -1,75 +1,75 @@ -using Example.NetCore6._0.AuthenticationWithRefreshToken.Data; -using Example.NetCore6._0.AuthenticationWithRefreshToken.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Logout.Models; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; - -var builder = WebApplication.CreateBuilder(args); - - - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services.AddDbContext(options => - options.UseInMemoryDatabase("Database") - ); - -builder.Services - .AddJwtAuthenticationWithIdentity() - .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) - .AddLogout(); - -builder.Services.AddControllers(); - -var app = builder.Build(); - - - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseDefaultDbUser("Admin", "Admin"); - -app.UseRouting(); - -app.UseDefaultLoginMiddleware(); - -app - .OnLogoutExecuted(OnLogoutExecuted) - .OnLogoutExecuting(OnLogoutExecuting) - .UseLogoutMiddleware(); - -app - .OnRefreshExecuting(OnRefreshExecuting) - .UseRefreshMiddleware(); - -app.UseJwtAuthentication(); - -app.UseAuthorization(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.MapControllers(); - -app.Run(); - -Task OnLogoutExecuting(LogoutModel data) -{ - return Task.CompletedTask; -} - -Task OnLogoutExecuted(LogoutModel data) -{ - return Task.CompletedTask; -} - -Task OnRefreshExecuting(RefreshModel data) -{ - return Task.CompletedTask; +using Example.Net9._0.AuthenticationWithRefreshToken.Data; +using Example.Net9._0.AuthenticationWithRefreshToken.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Logout.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Middleware.Refresh.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + + + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(configuration.GetSection("AuthenticationOptions").Get()) + .AddLogout(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + + + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware(); + +app + .OnLogoutExecuted(OnLogoutExecuted) + .OnLogoutExecuting(OnLogoutExecuting) + .UseLogoutMiddleware(); + +app + .OnRefreshExecuting(OnRefreshExecuting) + .UseRefreshMiddleware(); + +app.UseJwtAuthentication(); + +app.UseAuthorization(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.MapControllers(); + +app.Run(); + +Task OnLogoutExecuting(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnLogoutExecuted(LogoutModel data) +{ + return Task.CompletedTask; +} + +Task OnRefreshExecuting(RefreshModel data) +{ + return Task.CompletedTask; } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index b8dc85d..5ee41b9 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:12783", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.AuthenticationWithRefreshToken": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5054", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:12783", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.AuthenticationWithRefreshToken": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5054", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net9.0.AuthenticationWithRefreshToken/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/appsettings.json +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/appsettings.json @@ -1,6 +1,6 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } } \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net9.0.BaseAuthentication/Controllers/ExampleController.cs similarity index 86% rename from Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net9.0.BaseAuthentication/Controllers/ExampleController.cs index cecae13..ead1a48 100644 --- a/Examples/Example.NetCore8.0.BaseAuthentication/Controllers/ExampleController.cs +++ b/Examples/Example.Net9.0.BaseAuthentication/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore8._0.BaseAuthentication.Controllers; +namespace Example.Net9._0.BaseAuthentication.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj b/Examples/Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj similarity index 81% rename from Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj rename to Examples/Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj index cbfb2a1..293aff8 100644 --- a/Examples/Example.NetCore9.0.BaseAuthentication/Example.NetCore9.0.BaseAuthentication.csproj +++ b/Examples/Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - Example.NetCore9._0.BaseAuthentication + Example.Net9._0.BaseAuthentication diff --git a/Examples/Example.NetCore6.0.BaseAuthentication/Program.cs b/Examples/Example.Net9.0.BaseAuthentication/Program.cs similarity index 96% rename from Examples/Example.NetCore6.0.BaseAuthentication/Program.cs rename to Examples/Example.Net9.0.BaseAuthentication/Program.cs index 4917a4a..7dce155 100644 --- a/Examples/Example.NetCore6.0.BaseAuthentication/Program.cs +++ b/Examples/Example.Net9.0.BaseAuthentication/Program.cs @@ -1,27 +1,27 @@ -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; - -var builder = WebApplication.CreateBuilder(args); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services.AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseRouting(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services.AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net9.0.BaseAuthentication/Properties/launchSettings.json similarity index 100% rename from Examples/Example.NetCore9.0.BaseAuthentication/Properties/launchSettings.json rename to Examples/Example.Net9.0.BaseAuthentication/Properties/launchSettings.json diff --git a/Examples/Example.Net9.0.BaseAuthentication/appsettings.json b/Examples/Example.Net9.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.0.BaseAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..f10cafd --- /dev/null +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.CookiesBasedAuthentication.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj similarity index 80% rename from Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj rename to Examples/Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj index 35c2047..071af46 100644 --- a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Example.NetCore9.0.CookiesBasedAuthentication.csproj +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj @@ -4,7 +4,7 @@ net9.0 enable disable - Example.NetCore9._0.CookiesBasedAuthentication + Example.Net9._0.CookiesBasedAuthentication diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net9.0.CookiesBasedAuthentication/ProgramCookies.cs similarity index 95% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs rename to Examples/Example.Net9.0.CookiesBasedAuthentication/ProgramCookies.cs index b7f5597..4b2aa9b 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/ProgramCookies.cs @@ -1,43 +1,43 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services - .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseRouting(); - -app.UseCookieLoginMiddleware(new CookieAuthOptions -{ - Key = "ExampleCookieName", -} - ); - -app.UseJwtAuthentication(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.UseAuthorization(); - -app.MapControllers(); - -app.Run(); - +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseCookieLoginMiddleware(new CookieAuthOptions +{ + Key = "ExampleCookieName", +} + ); + +app.UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); + public partial class ProgramCookies { } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net9.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net9.0.CookiesBasedAuthentication/Properties/launchSettings.json index 6b4ff2e..a29f68d 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:59033", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.CookiesBasedAuthentication": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5269", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:59033", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.CookiesBasedAuthentication": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5269", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net9.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs similarity index 91% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs rename to Examples/Example.Net9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs index 88ce7bf..2261a65 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; -namespace Example.NetCore9._0.PermissionBasedAuthorization.Controllers +namespace Example.Net9._0.PermissionBasedAuthorization.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj similarity index 80% rename from Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj rename to Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj index 88aa731..a8717f3 100644 --- a/Examples/Example.NetCore9.0.PermissionBasedAuthorization/Example.NetCore9.0.PermissionBasedAuthorization.csproj +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - Example.NetCore9._0.PermissionBasedAuthorization + Example.Net9._0.PermissionBasedAuthorization diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs similarity index 90% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs index 57095c6..a389ce1 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs @@ -1,35 +1,35 @@ -using Example.NetCore6._0.PermissionBasedAuthorization; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services - .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) - .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); - -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseRouting(); - -app.UseAuthorization(); - -app - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - +using Example.Net9._0.PermissionBasedAuthorization; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app.UseAuthorization(); + +app + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + app.Run(); \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net9.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net9.0.PermissionBasedAuthorization/Properties/launchSettings.json index f4c16a6..c628549 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:2600", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.PermissionBasedAuthorization": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5007", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:2600", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.PermissionBasedAuthorization": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5007", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 90% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs index 3b422ad..f23a58b 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -1,24 +1,24 @@ -using System.Security.Claims; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; - -namespace Example.NetCore6._0.PermissionBasedAuthorization -{ - public class UserClaimsProvider : IUserClaimsProvider - { - public const string ExampleClaimType = "ExamplePermission"; - - public const string FirstExampleClaimName = "CanUseExampleFirst"; - - public const string SecondExampleClaimName = "CanUseExampleSecond"; - - public Task> GetUserClaimsAsync(string login) - { - return Task.FromResult(new List - { - new Claim(ExampleClaimType, FirstExampleClaimName), - new Claim(ExampleClaimType, SecondExampleClaimName), - } - ); - } - } +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net9._0.PermissionBasedAuthorization +{ + public class UserClaimsProvider : IUserClaimsProvider + { + public const string ExampleClaimType = "ExamplePermission"; + + public const string FirstExampleClaimName = "CanUseExampleFirst"; + + public const string SecondExampleClaimName = "CanUseExampleSecond"; + + public Task> GetUserClaimsAsync(string login) + { + return Task.FromResult(new List + { + new Claim(ExampleClaimType, FirstExampleClaimName), + new Claim(ExampleClaimType, SecondExampleClaimName), + } + ); + } + } } \ No newline at end of file diff --git a/Examples/Example.Net9.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net9.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs new file mode 100644 index 0000000..7be2699 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; + +[ApiController] +[Route("[controller]")] +public class ExampleController : ControllerBase +{ + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs new file mode 100644 index 0000000..e075316 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj similarity index 84% rename from Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj rename to Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj index 97d82a4..7980e30 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -4,7 +4,7 @@ net9.0 disable disable - Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity + Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity diff --git a/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs new file mode 100644 index 0000000..496b75a --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs similarity index 91% rename from Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename to Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 00e3ddb..acdccf9 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -1,5 +1,5 @@ -using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; -using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; diff --git a/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json new file mode 100644 index 0000000..0ad1635 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs similarity index 87% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs rename to Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs index fb912be..9eda927 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Controllers; +namespace Example.Net9._0.RefreshTokenWithConfidenceInterval.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs rename to Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs index b05dc62..e25c017 100644 --- a/Examples/Example.NetCore7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net9._0.RefreshTokenWithConfidenceInterval.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore7._0.RefreshTokenWithConfidenceInterval.Data; +namespace Example.Net9._0.RefreshTokenWithConfidenceInterval.Data; public class AppDbContext : TourmalineDbContext { diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj similarity index 85% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj rename to Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj index 945791c..b2c9984 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Example.NetCore9.0.RefreshTokenWithConfidenceInterval.csproj +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj @@ -4,7 +4,7 @@ net9.0 disable disable - Example.NetCore9._0.RefreshTokenWithConfidenceInterval + Example.Net9._0.RefreshTokenWithConfidenceInterval diff --git a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs rename to Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs index 47d928e..fb54b6b 100644 --- a/Examples/Example.NetCore9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore9._0.RefreshTokenWithConfidenceInterval.Models; +namespace Example.Net9._0.RefreshTokenWithConfidenceInterval.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 89% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs index b3553f2..e1f5c73 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -1,65 +1,65 @@ -using Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Data; -using Example.NetCore6._0.RefreshTokenWithConfidenceInterval.Models; -using Microsoft.AspNetCore.Builder; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); -const int refreshConfidenceIntervalInMilliseconds = 300_000; - -builder.Services - .AddDbContext(options => - options.UseInMemoryDatabase("Database") - ); - -builder.Services - .AddJwtAuthenticationWithIdentity() - .AddLoginWithRefresh(refreshAuthenticationOptions) - .AddRefreshConfidenceInterval(refreshConfidenceIntervalInMilliseconds) - .AddLogout() - .AddRegistration(); - -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseDefaultDbUser("Admin", "Admin"); - -app.UseRouting(); - -app.UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - -app.UseRefreshTokenMiddleware(); -app.UseRefreshTokenLogoutMiddleware(); - -app.UseRegistration(x => new CustomUser -{ - UserName = x.Login, - NormalizedUserName = x.Login, -} - ); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.Run(); - +using Example.Net9._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net9._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.AspNetCore.Builder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +var refreshAuthenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); +const int refreshConfidenceIntervalInMilliseconds = 300_000; + +builder.Services + .AddDbContext(options => + options.UseInMemoryDatabase("Database") + ); + +builder.Services + .AddJwtAuthenticationWithIdentity() + .AddLoginWithRefresh(refreshAuthenticationOptions) + .AddRefreshConfidenceInterval(refreshConfidenceIntervalInMilliseconds) + .AddLogout() + .AddRegistration(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseDefaultDbUser("Admin", "Admin"); + +app.UseRouting(); + +app.UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseRefreshTokenMiddleware(); +app.UseRefreshTokenLogoutMiddleware(); + +app.UseRegistration(x => new CustomUser +{ + UserName = x.Login, + NormalizedUserName = x.Login, +} + ); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + public abstract class ProgramWithConfidenceInterval { } \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..22181a4 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.RefreshTokenWithConfidenceInterval": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5108", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/appsettings.json @@ -0,0 +1,6 @@ +{ + "AuthenticationOptions": { + "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", + "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net9.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..23050e4 --- /dev/null +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._0.WithCredentialsValidator.Controllers +{ + [ApiController] + [Route("[controller]")] + public class ExampleController : ControllerBase + { + private static readonly string[] Summaries = + { + "Freezing", + "Bracing", + "Chilly", + "Cool", + "Mild", + "Warm", + "Balmy", + "Hot", + "Sweltering", + "Scorching", + }; + + [Authorize] + [HttpGet] + public IEnumerable Get() + { + return Summaries; + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj b/Examples/Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj similarity index 88% rename from Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj rename to Examples/Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj index b04d0be..1f6f1e0 100644 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Example.NetCore9.0.WithCredentialsValidator.csproj +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj @@ -4,7 +4,7 @@ net9.0 enable enable - Example.NetCore9._0.WithCredentialsValidator + Example.Net9._0.WithCredentialsValidator diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net9.0.WithCredentialsValidator/Program.cs similarity index 92% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net9.0.WithCredentialsValidator/Program.cs index 9d9aa8a..54a3622 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Program.cs @@ -1,48 +1,48 @@ -using Example.NetCore6._0.WithCredentialsValidator; -using TourmalineCore.AspNetCore.JwtAuthentication.Core; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; -using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; - -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddControllers(); - -var configuration = builder.Configuration; -var environment = builder.Environment; - -builder.Services - .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) - .AddUserCredentialValidator(); - -builder.Services.AddControllers(); - -var app = builder.Build(); - -if (environment.IsDevelopment()) -{ - app.UseDeveloperExceptionPage(); -} - -app.UseRouting(); - -app - .OnLoginExecuting(OnLoginExecuting) - .OnLoginExecuted(OnLoginExecuted) - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); - -app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); - -app.Run(); - -Task OnLoginExecuting(LoginModel data) -{ - Console.WriteLine(data.Login); - return Task.FromResult(data); -} - -Task OnLoginExecuted(LoginModel data) -{ - Console.WriteLine(data.Login); - return Task.FromResult(data); +using Example.Net9._0.WithCredentialsValidator; +using TourmalineCore.AspNetCore.JwtAuthentication.Core; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services.AddControllers(); + +var configuration = builder.Configuration; +var environment = builder.Environment; + +builder.Services + .AddJwtAuthentication(configuration.GetSection(nameof(AuthenticationOptions)).Get()) + .AddUserCredentialValidator(); + +builder.Services.AddControllers(); + +var app = builder.Build(); + +if (environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseRouting(); + +app + .OnLoginExecuting(OnLoginExecuting) + .OnLoginExecuted(OnLoginExecuted) + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); + +app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + +app.Run(); + +Task OnLoginExecuting(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); +} + +Task OnLoginExecuted(LoginModel data) +{ + Console.WriteLine(data.Login); + return Task.FromResult(data); } \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net9.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net9.0.WithCredentialsValidator/Properties/launchSettings.json index 419bec2..78f0842 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Properties/launchSettings.json +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:20559", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.WithCredentialsValidator": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5090", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20559", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net6._0.WithCredentialsValidator": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5090", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 88% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs index 4618147..3c65d8d 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -1,6 +1,6 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore6._0.WithCredentialsValidator +namespace Example.Net9._0.WithCredentialsValidator { public class UserCredentialsValidator : IUserCredentialsValidator { diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net9.0.WithCredentialsValidator/appsettings.json similarity index 100% rename from Examples/Example.NetCore9.0.WithCredentialsValidator/appsettings.json rename to Examples/Example.Net9.0.WithCredentialsValidator/appsettings.json diff --git a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs deleted file mode 100644 index 8cad8da..0000000 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs deleted file mode 100644 index b261fbe..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs deleted file mode 100644 index 6822c3e..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs deleted file mode 100644 index 1dc7348..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs deleted file mode 100644 index 689efcc..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) - { - return Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs deleted file mode 100644 index af68427..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json deleted file mode 100644 index 7d6fb74..0000000 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:24369", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore5._0.RefreshTokenWithConfidenceInterval": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5108", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index 830192d..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index e653b58..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs deleted file mode 100644 index bc8db00..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore6._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs deleted file mode 100644 index b3940d7..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs deleted file mode 100644 index 378c3fe..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore6._0.AuthenticationWithRefreshToken.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.BaseAuthentication/appsettings.json b/Examples/Example.NetCore6.0.BaseAuthentication/appsettings.json deleted file mode 100644 index d09d8c4..0000000 --- a/Examples/Example.NetCore6.0.BaseAuthentication/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.NetCore6.0.CookiesBasedAuthentication/appsettings.json deleted file mode 100644 index d09d8c4..0000000 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.NetCore6.0.PermissionBasedAuthorization/appsettings.json deleted file mode 100644 index d09d8c4..0000000 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs deleted file mode 100644 index 57e15d1..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; - -[ApiController] -[Route("[controller]")] -public class ExampleController : ControllerBase -{ - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs deleted file mode 100644 index 43e21bf..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; - -public class AppDbContext : TourmalineDbContext -{ - public AppDbContext(DbContextOptions options) - : base(options) - { - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs deleted file mode 100644 index da27e0c..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; - -public class CustomUser : IdentityUser -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json deleted file mode 100644 index 270809e..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:24369", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5108", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json deleted file mode 100644 index d09d8c4..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json deleted file mode 100644 index 5e48c0b..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:24369", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.RefreshTokenWithConfidenceInterval": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5108", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/appsettings.json deleted file mode 100644 index d09d8c4..0000000 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "AuthenticationOptions": { - "PublicSigningKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQAB", - "PrivateSigningKey": "MIIEowIBAAKCAQEAsDwLnM5sbVi326YDsLvMkQLXDKVAaHrJZ/MwkoxF4Hmq4+pu4KojgQyVDtjseXG8UW5wbxW58eXG8V0XgJzsD8zQX2Z1bBawpIeD9sXf/5CFZGif85YFIqS3brqR3ScdGxYHXcwrUMGUCThxe918Q0aNXzdSxGGP2v7ZbtpFhLRyrTXHl4u6k3eyYG7zCkwextnMb9CJuCR7x1ua1V1S0xljAqg5PicFjt0vVSKzPM/Djw7XK84sJXxaet7t4cNtXVJIAyXUMsSli6gg9Cw9CEUSE40iWUR/6wrdUYAchk3vWiBhMmnufwzmFRLKHOH9Fz8buJVSrRfyt7a6S2iN+wIDAQABAoIBAQCvue/KV3p+Pex2tD8RxvDf13kfPtfOVkDlyfQw7HXwsuDXijctBfmJAEbRGzQQlHw2pmyuF3fl4DxTB4Qb1lz8FDniJoQHV0ijhgzrz7rfVffsevajKH/OX3gYjShM4GeBTqHhwWefiqZV21YtMFhrrLniq4N4FeAfeebNRg/zlWEigraxqAWb4cplnxBE3qOBECKXdF/B8uhp743BU/2HLSO5BUdhtPlN3FKoYdyqtrKyNO2z7rC+Gk8tNd+KbMHDUMiOQXzbXkpsXYKAug9iTW+gxZG/bNyzGNrJBFrUYb1fP4iZphbxBJgobNYJBKA565cAX/wI5lFakTBB0YAhAoGBAOk0TyV0dA8WJ6NrWmRUBKsKvkSREhBveW+P3LtA8a1IgQf4K6ohIfcq9w/+nRvTLPIxo67FcqEyzVUu9TOafzIi59w4RBWG/HKOZ5lvIVicbuPyclPVWyC+9bMMgWEJy9wGwE+fGh3AvAA4PXNBcjOqfT0sSF9PBUo5qN11Q/qHAoGBAMF2IL+cXgPiUta4XoMh14ksJiwHtZeMkj+kauU3rctDITSkIGMFp4q0W5UUSG1yPcW/++rMQfuAjCZotdNpbQT+g+KfG44DMT5W7nRgv60S0/6X/OoLIhCue19yLMVzFpai0YEH+s24/XNnwl53K34G1zVMCsZcIuIng8SZVintAoGAJP/1pr2pRFOBin4X418pNnIH6h0SPqVRIRA0N0mAjru4LSmE1ANZvjuE43bEOovwz6Rskegl3cmPpnpC0SMsFypOmzQaKUg3eX16lm95XPPE7EmlNgPd534kwXm0dU72lzxC+t8FZ78SlP5XUZgKpIPiRvhlqymAb1xinHBkjrUCgYAB144YRPTgNJd1U+wSc5AJzlHOuYQRHVWHJZme9RjChrEaPzXPu44M1ArLMJY/9IaCC4HqimdWbbLn6rdQfAB9u66lyb4JbB5b6Zf7o7Avha5fDjNqRxDb981U61Fhz+a3KHW2NM0+iDRhlOtU2u2fFZGXAFJZ8Saj4JxwksUvQQKBgEQ1TAW/INhWSkEW8vGeLnjV+rxOx8EJ9ftVCRaQMlDEDlX0n7BZeQrQ1pBxwL0FSTrUQdD02MsWshrhe0agKsw2Yaxn8gYs1v9HMloS4Q3L2zl8pi7R3yx72RIcdnS4rqGXeO5t8dm305Yz2RHhqtkBmpFBssSEYCY/tUDmsQVU" - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index 1cedcfc..0000000 --- a/Examples/Example.NetCore7.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore7._0.AuthenticationUsingGenericIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index d7c4094..0000000 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs deleted file mode 100644 index df8d699..0000000 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore7._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs deleted file mode 100644 index 86a56cc..0000000 --- a/Examples/Example.NetCore7.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore7._0.AuthenticationUsingIdentityUser.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs deleted file mode 100644 index 1d63cee..0000000 --- a/Examples/Example.NetCore7.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore7._0.AuthenticationWithRefreshToken.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs deleted file mode 100644 index 540fb7b..0000000 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; - -[ApiController] -[Route("[controller]")] -public class ExampleController : ControllerBase -{ - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs deleted file mode 100644 index aa557f6..0000000 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; - -public class AppDbContext : TourmalineDbContext -{ - public AppDbContext(DbContextOptions options) - : base(options) - { - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs deleted file mode 100644 index 85ce19c..0000000 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; - -public class CustomUser : IdentityUser -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json deleted file mode 100644 index 275dc04..0000000 --- a/Examples/Example.NetCore7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:24369", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5108", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index 1e28251..0000000 --- a/Examples/Example.NetCore8.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore8._0.AuthenticationUsingGenericIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index 31ee2b6..0000000 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs deleted file mode 100644 index 5a4dcfb..0000000 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore8._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs deleted file mode 100644 index 6049f1d..0000000 --- a/Examples/Example.NetCore8.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore8._0.AuthenticationUsingIdentityUser.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs deleted file mode 100644 index e854bdc..0000000 --- a/Examples/Example.NetCore8.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore8._0.AuthenticationWithRefreshToken.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs deleted file mode 100644 index 2e3f85b..0000000 --- a/Examples/Example.NetCore8.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore8._0.CookiesBasedAuthentication.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs deleted file mode 100644 index 4fe79d9..0000000 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; - -[ApiController] -[Route("[controller]")] -public class ExampleController : ControllerBase -{ - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs deleted file mode 100644 index ddb6ddb..0000000 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; - -public class AppDbContext : TourmalineDbContext -{ - public AppDbContext(DbContextOptions options) - : base(options) - { - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs deleted file mode 100644 index df99abb..0000000 --- a/Examples/Example.NetCore8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; - -public class CustomUser : IdentityUser -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index d7ce172..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationUsingGenericIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.AuthenticationUsingGenericIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs deleted file mode 100644 index 2021ce8..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs deleted file mode 100644 index e5baef9..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore9._0.AuthenticationUsingIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs deleted file mode 100644 index e83cca8..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore9._0.AuthenticationUsingIdentityUser.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs deleted file mode 100644 index 48578c9..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs deleted file mode 100644 index a05ae23..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Example.NetCore9._0.AuthenticationWithRefreshToken.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Data -{ - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs b/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs deleted file mode 100644 index 4d29fcd..0000000 --- a/Examples/Example.NetCore9.0.AuthenticationWithRefreshToken/Models/CustomUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore9._0.AuthenticationWithRefreshToken.Models -{ - public class CustomUser : IdentityUser - { - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs deleted file mode 100644 index b4bcc1a..0000000 --- a/Examples/Example.NetCore9.0.CookiesBasedAuthentication/Controllers/ExampleController.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.CookiesBasedAuthentication.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs deleted file mode 100644 index 8cbf1bf..0000000 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; - -[ApiController] -[Route("[controller]")] -public class ExampleController : ControllerBase -{ - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs deleted file mode 100644 index 5fe0752..0000000 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; - -public class AppDbContext : TourmalineDbContext -{ - public AppDbContext(DbContextOptions options) - : base(options) - { - } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs deleted file mode 100644 index 7db116a..0000000 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace Example.NetCore9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; - -public class CustomUser : IdentityUser -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json deleted file mode 100644 index 275dc04..0000000 --- a/Examples/Example.NetCore9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:24369", - "sslPort": 0 - } - }, - "profiles": { - "Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "launchUrl": "weatherforecast", - "applicationUrl": "http://localhost:5108", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "weatherforecast", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs deleted file mode 100644 index 1a5b995..0000000 --- a/Examples/Example.NetCore9.0.WithCredentialsValidator/Controllers/ExampleController.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; - -namespace Example.NetCore9._0.WithCredentialsValidator.Controllers -{ - [ApiController] - [Route("[controller]")] - public class ExampleController : ControllerBase - { - private static readonly string[] Summaries = - { - "Freezing", - "Bracing", - "Chilly", - "Cool", - "Mild", - "Warm", - "Balmy", - "Hot", - "Sweltering", - "Scorching", - }; - - [Authorize] - [HttpGet] - public IEnumerable Get() - { - return Summaries; - } - } -} \ No newline at end of file diff --git a/Examples/Tests/NetCore5.0/BasicAuthTests.cs b/Examples/Tests/NetCore5.0/BasicAuthTests.cs index 43cb5c0..51a9333 100644 --- a/Examples/Tests/NetCore5.0/BasicAuthTests.cs +++ b/Examples/Tests/NetCore5.0/BasicAuthTests.cs @@ -1,11 +1,11 @@ using System.Net; -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity; using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class BasicAuthTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore5.0/CookieTests.cs b/Examples/Tests/NetCore5.0/CookieTests.cs index 74b7aa6..27fa6d6 100644 --- a/Examples/Tests/NetCore5.0/CookieTests.cs +++ b/Examples/Tests/NetCore5.0/CookieTests.cs @@ -1,11 +1,11 @@ using System.Net; -using Example.NetCore5._0.CookiesBasedAuthentication; +using Example.Net5._0.CookiesBasedAuthentication; using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.CookiesBasedAuthentication))] + [Collection(nameof(Example.Net5._0.CookiesBasedAuthentication))] public class CookieTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore5.0/LoginCallbackTests.cs b/Examples/Tests/NetCore5.0/LoginCallbackTests.cs index e6aae4f..9d9c78d 100644 --- a/Examples/Tests/NetCore5.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore5.0/LoginCallbackTests.cs @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { public class LoginCallbackTests { diff --git a/Examples/Tests/NetCore5.0/LogoutTest.cs b/Examples/Tests/NetCore5.0/LogoutTest.cs index 9e8f39d..983eef0 100644 --- a/Examples/Tests/NetCore5.0/LogoutTest.cs +++ b/Examples/Tests/NetCore5.0/LogoutTest.cs @@ -1,13 +1,13 @@ using System.Net; using System.Net.Http.Json; -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity; using Microsoft.AspNetCore.Mvc.Testing; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class LogoutTest : AuthTestsBase { diff --git a/Examples/Tests/NetCore5.0/RefreshTests.cs b/Examples/Tests/NetCore5.0/RefreshTests.cs index 5bc6d1c..7970df8 100644 --- a/Examples/Tests/NetCore5.0/RefreshTests.cs +++ b/Examples/Tests/NetCore5.0/RefreshTests.cs @@ -1,15 +1,15 @@ using System.Net; using System.Net.Http.Json; -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity; using Microsoft.AspNetCore.Mvc.Testing; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class RefreshTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore5.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore5.0/RefreshTestsWithConfidenceInterval.cs index 86efa50..6d19894 100644 --- a/Examples/Tests/NetCore5.0/RefreshTestsWithConfidenceInterval.cs +++ b/Examples/Tests/NetCore5.0/RefreshTestsWithConfidenceInterval.cs @@ -1,9 +1,9 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.RefreshTokenWithConfidenceInterval))] + [Collection(nameof(Example.Net5._0.RefreshTokenWithConfidenceInterval))] public class RefreshTestsWithConfidenceInterval : AuthTestsBase { diff --git a/Examples/Tests/NetCore5.0/RegistrationTests.cs b/Examples/Tests/NetCore5.0/RegistrationTests.cs index d07fca2..8cc7807 100644 --- a/Examples/Tests/NetCore5.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore5.0/RegistrationTests.cs @@ -1,15 +1,15 @@ using System.Net; using System.Net.Http.Json; using System.Text.Json; -using Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity; using Microsoft.AspNetCore.Mvc.Testing; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore5._0 +namespace Tests.Net5._0 { - [Collection(nameof(Example.NetCore5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class RegistrationTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore6.0/BasicAuthTestWithGeneric.cs index 4412f0c..632758e 100644 --- a/Examples/Tests/NetCore6.0/BasicAuthTestWithGeneric.cs +++ b/Examples/Tests/NetCore6.0/BasicAuthTestWithGeneric.cs @@ -8,9 +8,9 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.AuthenticationUsingGenericIdentityUser))] + [Collection(nameof(Example.Net6._0.AuthenticationUsingGenericIdentityUser))] public class BasicAuthTestWithGeneric : IClassFixture> { diff --git a/Examples/Tests/NetCore6.0/BasicAuthTests.cs b/Examples/Tests/NetCore6.0/BasicAuthTests.cs index 477b6af..1130b48 100644 --- a/Examples/Tests/NetCore6.0/BasicAuthTests.cs +++ b/Examples/Tests/NetCore6.0/BasicAuthTests.cs @@ -2,9 +2,9 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class BasicAuthTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/CookieTests.cs b/Examples/Tests/NetCore6.0/CookieTests.cs index e7d93ae..583fdde 100644 --- a/Examples/Tests/NetCore6.0/CookieTests.cs +++ b/Examples/Tests/NetCore6.0/CookieTests.cs @@ -2,9 +2,9 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.CookiesBasedAuthentication))] + [Collection(nameof(Example.Net6._0.CookiesBasedAuthentication))] public class CookieTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/LoginCallbackTests.cs b/Examples/Tests/NetCore6.0/LoginCallbackTests.cs index b95f917..b58926d 100644 --- a/Examples/Tests/NetCore6.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore6.0/LoginCallbackTests.cs @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { public class LoginCallbackTests { diff --git a/Examples/Tests/NetCore6.0/LogoutTest.cs b/Examples/Tests/NetCore6.0/LogoutTest.cs index 5c6f964..cda9d48 100644 --- a/Examples/Tests/NetCore6.0/LogoutTest.cs +++ b/Examples/Tests/NetCore6.0/LogoutTest.cs @@ -4,9 +4,9 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class LogoutTest : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/RefreshTests.cs b/Examples/Tests/NetCore6.0/RefreshTests.cs index 1857958..fa0f8db 100644 --- a/Examples/Tests/NetCore6.0/RefreshTests.cs +++ b/Examples/Tests/NetCore6.0/RefreshTests.cs @@ -7,9 +7,9 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class RefreshTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore6.0/RefreshTestsWithConfidenceInterval.cs index 5c91e8e..7fcb05f 100644 --- a/Examples/Tests/NetCore6.0/RefreshTestsWithConfidenceInterval.cs +++ b/Examples/Tests/NetCore6.0/RefreshTestsWithConfidenceInterval.cs @@ -1,9 +1,9 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.RefreshTokenWithConfidenceInterval))] + [Collection(nameof(Example.Net6._0.RefreshTokenWithConfidenceInterval))] public class RefreshTestsWithConfidenceInterval : AuthTestsBase { diff --git a/Examples/Tests/NetCore6.0/RegistrationTests.cs b/Examples/Tests/NetCore6.0/RegistrationTests.cs index 17cf176..54da11d 100644 --- a/Examples/Tests/NetCore6.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore6.0/RegistrationTests.cs @@ -6,9 +6,9 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore6._0 +namespace Tests.Net6._0 { - [Collection(nameof(Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] + [Collection(nameof(Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity))] public class RegistrationTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs index 77f364f..803157b 100644 --- a/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs +++ b/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs @@ -8,7 +8,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class BasicAuthTestWithGeneric : IClassFixture> diff --git a/Examples/Tests/NetCore7.0/BasicAuthTests.cs b/Examples/Tests/NetCore7.0/BasicAuthTests.cs index 004c26a..a650447 100644 --- a/Examples/Tests/NetCore7.0/BasicAuthTests.cs +++ b/Examples/Tests/NetCore7.0/BasicAuthTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class BasicAuthTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore7.0/CookieTests.cs b/Examples/Tests/NetCore7.0/CookieTests.cs index b0fbcc5..ab75e2a 100644 --- a/Examples/Tests/NetCore7.0/CookieTests.cs +++ b/Examples/Tests/NetCore7.0/CookieTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class CookieTests : AuthTestsBase diff --git a/Examples/Tests/NetCore7.0/LoginCallbackTests.cs b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs index e77c87a..2d9a127 100644 --- a/Examples/Tests/NetCore7.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore7.0/LoginCallbackTests.cs @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class LoginCallbackTests { diff --git a/Examples/Tests/NetCore7.0/LogoutTest.cs b/Examples/Tests/NetCore7.0/LogoutTest.cs index ac06565..f1aa43f 100644 --- a/Examples/Tests/NetCore7.0/LogoutTest.cs +++ b/Examples/Tests/NetCore7.0/LogoutTest.cs @@ -4,7 +4,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class LogoutTest : AuthTestsBase diff --git a/Examples/Tests/NetCore7.0/RefreshTests.cs b/Examples/Tests/NetCore7.0/RefreshTests.cs index d03f3d7..c4f1443 100644 --- a/Examples/Tests/NetCore7.0/RefreshTests.cs +++ b/Examples/Tests/NetCore7.0/RefreshTests.cs @@ -7,7 +7,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class RefreshTests : AuthTestsBase diff --git a/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs index ff141bc..c79bb26 100644 --- a/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs +++ b/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class RefreshTestsWithConfidenceInterval : AuthTestsBase diff --git a/Examples/Tests/NetCore7.0/RegistrationTests.cs b/Examples/Tests/NetCore7.0/RegistrationTests.cs index 74699df..d23efca 100644 --- a/Examples/Tests/NetCore7.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore7.0/RegistrationTests.cs @@ -6,7 +6,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore7._0 +namespace Tests.Net7._0 { public class RegistrationTests : AuthTestsBase diff --git a/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs index ef36a97..4323f77 100644 --- a/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs +++ b/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs @@ -8,7 +8,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class BasicAuthTestWithGeneric : IClassFixture> diff --git a/Examples/Tests/NetCore8.0/BasicAuthTests.cs b/Examples/Tests/NetCore8.0/BasicAuthTests.cs index 5acbc81..00950fb 100644 --- a/Examples/Tests/NetCore8.0/BasicAuthTests.cs +++ b/Examples/Tests/NetCore8.0/BasicAuthTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class BasicAuthTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore8.0/CookieTests.cs b/Examples/Tests/NetCore8.0/CookieTests.cs index cbcae51..67987e8 100644 --- a/Examples/Tests/NetCore8.0/CookieTests.cs +++ b/Examples/Tests/NetCore8.0/CookieTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class CookieTests : AuthTestsBase diff --git a/Examples/Tests/NetCore8.0/LoginCallbackTests.cs b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs index d6650ab..e67d73b 100644 --- a/Examples/Tests/NetCore8.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore8.0/LoginCallbackTests.cs @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class LoginCallbackTests { diff --git a/Examples/Tests/NetCore8.0/LogoutTest.cs b/Examples/Tests/NetCore8.0/LogoutTest.cs index a4cab54..8073ab1 100644 --- a/Examples/Tests/NetCore8.0/LogoutTest.cs +++ b/Examples/Tests/NetCore8.0/LogoutTest.cs @@ -4,7 +4,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class LogoutTest : AuthTestsBase diff --git a/Examples/Tests/NetCore8.0/RefreshTests.cs b/Examples/Tests/NetCore8.0/RefreshTests.cs index b2596c3..66fb5f8 100644 --- a/Examples/Tests/NetCore8.0/RefreshTests.cs +++ b/Examples/Tests/NetCore8.0/RefreshTests.cs @@ -7,7 +7,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class RefreshTests : AuthTestsBase diff --git a/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs index 6a05666..fb4e4c7 100644 --- a/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs +++ b/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class RefreshTestsWithConfidenceInterval : AuthTestsBase diff --git a/Examples/Tests/NetCore8.0/RegistrationTests.cs b/Examples/Tests/NetCore8.0/RegistrationTests.cs index feabeab..3f1064c 100644 --- a/Examples/Tests/NetCore8.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore8.0/RegistrationTests.cs @@ -6,7 +6,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore8._0 +namespace Tests.Net8._0 { public class RegistrationTests : AuthTestsBase diff --git a/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs index 44459e1..a3538c8 100644 --- a/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs +++ b/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs @@ -8,7 +8,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class BasicAuthTestWithGeneric : IClassFixture> diff --git a/Examples/Tests/NetCore9.0/BasicAuthTests.cs b/Examples/Tests/NetCore9.0/BasicAuthTests.cs index 00dda3c..3b17cbe 100644 --- a/Examples/Tests/NetCore9.0/BasicAuthTests.cs +++ b/Examples/Tests/NetCore9.0/BasicAuthTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class BasicAuthTests : AuthTestsBase { diff --git a/Examples/Tests/NetCore9.0/CookieTests.cs b/Examples/Tests/NetCore9.0/CookieTests.cs index 58e2a62..a245d82 100644 --- a/Examples/Tests/NetCore9.0/CookieTests.cs +++ b/Examples/Tests/NetCore9.0/CookieTests.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class CookieTests : AuthTestsBase diff --git a/Examples/Tests/NetCore9.0/LoginCallbackTests.cs b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs index 904c313..c1e7899 100644 --- a/Examples/Tests/NetCore9.0/LoginCallbackTests.cs +++ b/Examples/Tests/NetCore9.0/LoginCallbackTests.cs @@ -10,7 +10,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Services.Implementation; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class LoginCallbackTests { diff --git a/Examples/Tests/NetCore9.0/LogoutTest.cs b/Examples/Tests/NetCore9.0/LogoutTest.cs index efef6a4..c5f5043 100644 --- a/Examples/Tests/NetCore9.0/LogoutTest.cs +++ b/Examples/Tests/NetCore9.0/LogoutTest.cs @@ -4,7 +4,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Request; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class LogoutTest : AuthTestsBase diff --git a/Examples/Tests/NetCore9.0/RefreshTests.cs b/Examples/Tests/NetCore9.0/RefreshTests.cs index d8d7115..9fad6de 100644 --- a/Examples/Tests/NetCore9.0/RefreshTests.cs +++ b/Examples/Tests/NetCore9.0/RefreshTests.cs @@ -7,7 +7,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class RefreshTests : AuthTestsBase diff --git a/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs b/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs index 7b6a4aa..48ccf5d 100644 --- a/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs +++ b/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc.Testing; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class RefreshTestsWithConfidenceInterval : AuthTestsBase diff --git a/Examples/Tests/NetCore9.0/RegistrationTests.cs b/Examples/Tests/NetCore9.0/RegistrationTests.cs index eacb312..b1535ad 100644 --- a/Examples/Tests/NetCore9.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore9.0/RegistrationTests.cs @@ -6,7 +6,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Models.Response; using Xunit; -namespace Tests.NetCore9._0 +namespace Tests.Net9._0 { public class RegistrationTests : AuthTestsBase diff --git a/Examples/Tests/Postman/TourmalineCore.AspNetCore.JwtAuthentication.postman_collection.json b/Examples/Tests/Postman/TourmalineCore.AspNetCore.JwtAuthentication.postman_collection.json index 70078d8..463deda 100644 --- a/Examples/Tests/Postman/TourmalineCore.AspNetCore.JwtAuthentication.postman_collection.json +++ b/Examples/Tests/Postman/TourmalineCore.AspNetCore.JwtAuthentication.postman_collection.json @@ -6,7 +6,7 @@ }, "item": [ { - "name": "Example.NetCore5.0.CookiesBasedAuthentication", + "name": "Example.Net5.0.CookiesBasedAuthentication", "item": [ { "name": "Call authorized endpoint without token", @@ -120,7 +120,7 @@ ] }, { - "name": "Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity", + "name": "Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity", "item": [ { "name": "Call authorized endpoint without token", diff --git a/Examples/Tests/Tests.csproj b/Examples/Tests/Tests.csproj index 79df921..e59c832 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -25,16 +25,16 @@ - - + + - - - - - - + + + + + + diff --git a/Examples/Tests/Units/RefreshTokenManagerTests.cs b/Examples/Tests/Units/RefreshTokenManagerTests.cs index 953511c..fa7d464 100644 --- a/Examples/Tests/Units/RefreshTokenManagerTests.cs +++ b/Examples/Tests/Units/RefreshTokenManagerTests.cs @@ -1,4 +1,4 @@ -using Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using MockQueryable.Moq; using Moq; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; From 5ae45b27e67af261fcfdaed414aa1cd5b56916c9 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 09:54:36 +0500 Subject: [PATCH 44/49] bump version of Identity to 0.1.3 and Core to 0.3.6 --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 572d051..f3bf69c 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core - 0.3.5 + 0.3.6 Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index 133d43a..d133ba5 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity - 0.1.2 + 0.1.3 Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication From 57bc34ee5a2ecb53acd4d06e4b9a433cc028ff42 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 10:34:37 +0500 Subject: [PATCH 45/49] ci(publish-to-nuget): #65: add 7,8 and 9 versions of .NET --- .github/workflows/publish-to-nuget.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/publish-to-nuget.yml b/.github/workflows/publish-to-nuget.yml index 3396435..47091d7 100644 --- a/.github/workflows/publish-to-nuget.yml +++ b/.github/workflows/publish-to-nuget.yml @@ -23,6 +23,9 @@ jobs: 3.1.x 5.0.x 6.0.x + 7.0.x + 8.0.x + 9.0.x - name: Restore Dependencies run: dotnet restore From 08099056d81dc964b33802a96bd190fcba53dee4 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 15:46:21 +0500 Subject: [PATCH 46/49] chore(Core): clean up JwtBearer dependencies --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index f3bf69c..0ec887e 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -29,17 +29,20 @@ + + - + @@ -54,7 +57,7 @@ - + From f1322fb190882c420232ee206221a0e92bdc0682 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 16:02:16 +0500 Subject: [PATCH 47/49] chore(readme): #65: revert visual changes --- JwtAuthentication.Core/README.md | 185 ++++------ JwtAuthentication.Core/Usage for old .NET.md | 220 +++++------ JwtAuthentication.Identity/README.md | 270 +++++--------- .../Usage for old .NET.md | 344 ++++++++---------- 4 files changed, 405 insertions(+), 614 deletions(-) diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index fb4e8dd..8190490 100644 --- a/JwtAuthentication.Core/README.md +++ b/JwtAuthentication.Core/README.md @@ -1,70 +1,52 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core - ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). -We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing -the keys. This library contains middleware and authentication extensions. With -this library, you can very easily connect the JWT-based authentication to your -project. Also, this library allows to override the logic of username and -password validation. The library provides the ability to use a debug token to -avoid the need to enter a username and password when the lifetime of the JWT -expires. +We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. +This library contains middleware and authentication extensions. +With this library, you can very easily connect the JWT-based authentication to your project. +Also, this library allows to override the logic of username and password validation. +The library provides the ability to use a debug token to avoid the need to enter a username and password when the lifetime of the JWT expires. ## Installation +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) -![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) -![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) - -TourmalineCore.AspNetCore.JwtAuthentication.Core is available on -[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). -But also you can install latest stable version using **.NET CLI**: - -```sh +TourmalineCore.AspNetCore.JwtAuthentication.Core is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). But also you can install latest stable version using **.NET CLI** +``` dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core ``` -## Table of Content - - +## Table of Content - [TourmalineCore.AspNetCore.JwtAuthentication.Core](#tourmalinecoreaspnetcorejwtauthenticationcore) - - [Installation](#installation) - - [Table of Content](#table-of-content) + * [Installation](#installation) + * [Table of Content](#table-of-content) - [Authentication](#authentication) - - [Basic usage](#basic-usage) - - [Using cookie](#using-cookie) - - [Options](#options) - - [Routing](#routing) - - [Login request](#login-request) - - [Login validation](#login-validation) - - [Token usage](#token-usage) + * [Basic usage](#basic-usage) + * [Using cookie](#using-cookie) + * [Options](#options) + * [Routing](#routing) + * [Login request](#login-request) + * [Login validation](#login-validation) + * [Token usage](#token-usage) - [Authorization](#authorization) - [Callbacks](#callbacks) - - [Login](#login) - - [Logout](#logout) - - [Refresh](#refresh) - - - -The sections below will provide basic examples of how to use the package. -More complete examples of applications for different versions of .NET can be -found in -the “[Examples](../Examples/)” folder of the project. + * [Login](#login) + * [Logout](#logout) + * [Refresh](#refresh) # Authentication ## Basic usage -To start using JWT-based authentication, need to use one method in the -Program.cs file. In this case, the default options will be used. +To start using JWT-based authentication, need to use one method in the Startup.cs file. +In this case, the default options will be used. + +Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. -Then, the token will be required in the request header of every authorized -endpoint, like this: `Authorization: Bearer {token}`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -80,17 +62,13 @@ builder.Services.AddJwtAuthentication(authenticationOptions); var app = builder.Build(); app - .UseDefaultLoginMiddleware() - .UseJwtAuthentication(); + .UseDefaultLoginMiddleware() + .UseJwtAuthentication(); ``` ## Using cookie -This package also allows you to store the received token in a cookie. To do that -you need to use Cookie login middleware instead of default login. After -successful login the token will be added to a cookie, that user will receive in -a response. Then they can use this cookie for the authentication instead of -writing the token to the Authentication header of every request. +This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -102,7 +80,8 @@ var configuration = builder.Configuration; var environment = builder.Environment; var authenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get() -builder.Services.AddJwtAuthentication(authenticationOptions); +builder.Services + .AddJwtAuthentication(authenticationOptions); var app = builder.Build(); @@ -119,8 +98,7 @@ app.UseAuthorization(); ## Options -To use package you need to pass `AuthenticationOptions` to the -`AddJwtAuthentication()`. +To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). | Name | Type | Default | Required | Description | | -------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | @@ -131,37 +109,35 @@ To use package you need to pass `AuthenticationOptions` to the | AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; - var authenticationOptions = configuration.GetSection(nameof(AuthenticationOptions)).Get(); -builder.services.AddJwtAuthentication(authenticationOptions); +builder + .services.AddJwtAuthentication(authenticationOptions); ``` Minimum `appsettings.json` configuration: - ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` -For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can -generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 -PEM Format. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). +Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. ## Routing -The default route to the login endpoint is `/auth/login`. You can change it by -passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware -extension. Like this: +The default route to the login endpoint is `/auth/login`. +You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: ```cs var app = builder.Build(); @@ -170,48 +146,42 @@ app .UseDefaultLoginMiddleware(new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); .UseJwtAuthentication(); ``` - **OR** like this if you are using cookie middleware: ```cs var app = builder.Build(); app.UseCookieLoginMiddleware( - new CookieAuthOptions{ Key = "ExampleCookieName" }, + new CookieAuthOptions{ Key = "ExampleCookieName" }, new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); ``` ## Login request -You can call the login endpoint, you need to use the POST method, add to the -header `Content-Type: application/json` and pass the login/password in the JSON -format in the request body. Like this: - +You can call the login endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the login/password in the JSON format in the request body. Like this: ```json { "login": "Admin", "password": "Admin" } ``` - + As a successful result it will return **Access Token Model** json: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Login validation By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. -You can provide your own implementation of the IUserCredentialsValidator -interface, in which implement your own logic for validation of the login and -password. +You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -230,12 +200,10 @@ public class UserCredentialsValidator : IUserCredentialsValidator ``` `Program.cs` - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; var builder = WebApplication.CreateBuilder(args); - builder.services .AddJwtAuthentication(authenticationOptions) .AddUserCredentialValidator(); @@ -243,11 +211,9 @@ builder.services ## Token usage -To enable token validation, you must add the `[Authorize]` attribute before the -controller or method, for example: +To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: For methods: - ```cs [Authorize] [HttpGet] @@ -258,7 +224,6 @@ public IEnumerable Get() ``` For controllers: - ```cs [Authorize] [ApiController] @@ -271,24 +236,20 @@ public class ExampleController : ControllerBase # Authorization -This library implements claims-based authorization. With this, claims are added -to the token payload and verified upon request. In order to use this mechanism, -you need: - -1. Create a class that implements the IUserClaimsProvider interface that will - return a list of the claims that you need. For example: +This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: +1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; public class UserClaimsProvider : IUserClaimsProvider { public const string ExampleClaimType = "ExamplePermission"; - + private const string FirstExampleClaimName = "CanUseExampleFirst"; private const string SecondExampleClaimName = "CanUseExampleSecond"; - + public Task> GetUserClaimsAsync(string login) { return Task.FromResult(new List @@ -300,9 +261,8 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the `Startup.cs`. You can pass the name of the claim - type you want to use as a parameter. `Default claim type = "Permission"`. - +2. Connect this provider in the `Startup.cs`. + You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -313,11 +273,9 @@ builder.services ``` The claims in the token will look like this: - -```json +``` { - "ExamplePermission": [ - // instead "ExamplePermission" will be "Permission" when using the default option + "ExamplePermission": [ // instead "ExamplePermission" will be "Permission" when using the default option "CanUseExampleFirst", "CanUseExampleSecond" ], @@ -325,10 +283,7 @@ The claims in the token will look like this: } ``` -3. To enable checking of permissions, you must add the `RequiresPermission` - attribute before the controller or method and pass as a parameter all - permissions that are needed , for example: - +3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -342,7 +297,6 @@ public IEnumerable Get() ``` For controllers: - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -356,22 +310,17 @@ public class ExampleController : ControllerBase } ``` -Thus, only those users who have the desired permission will have access to the -controller or controller method. +Thus, only those users who have the desired permission will have access to the controller or controller method. # Callbacks -The library provides the ability to transfer callbacks for a call at the -beginning and end of the execution of the authentication, logout and refresh -token functions. This feature can be used for logging, to calculate your system -usage statistics, and so on. +The library provides the ability to transfer callbacks for a call at the beginning and end of the execution of the authentication, logout and refresh token functions. This feature can be used for logging, to calculate your system usage statistics, and so on. ## Login To use callbacks for authentication, follow these steps: -1. Create a function that will take `LoginModel` as a parameter and return a - result of the Task type. For example: +1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; @@ -395,12 +344,8 @@ app ## Logout -To call callbacks during logout, you need to follow the same steps as for login. -Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function -should take `LogoutModel` as a parameter +To call callbacks during logout, you need to follow the same steps as for login. Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function should take `LogoutModel` as a parameter ## Refresh -To call callbacks during refresh, you need to follow the same steps as for -login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your -function should take `RefreshModel` as a parameter +To call callbacks during refresh, you need to follow the same steps as for login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your function should take `RefreshModel` as a parameter \ No newline at end of file diff --git a/JwtAuthentication.Core/Usage for old .NET.md b/JwtAuthentication.Core/Usage for old .NET.md index 3d3bcc9..db710b2 100644 --- a/JwtAuthentication.Core/Usage for old .NET.md +++ b/JwtAuthentication.Core/Usage for old .NET.md @@ -1,65 +1,48 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Core - ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 6.0](README.md) or newer. -We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing -the keys. This library contains middleware and authentication extensions. With -this library, you can very easily connect the JWT-based authentication to your -project. Also, this library allows to override the logic of username and -password validation. The library provides the ability to use a debug token to -avoid the need to enter a username and password when the lifetime of the JWT -expires. +We are using Microsoft.AspNetCore.Authentication.JwtBearer with RSA for signing the keys. +This library contains middleware and authentication extensions. +With this library, you can very easily connect the JWT-based authentication to your project. +Also, this library allows to override the logic of username and password validation. +The library provides the ability to use a debug token to avoid the need to enter a username and password when the lifetime of the JWT expires. # Installation +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Core?color=gre&label=stable%20version) -![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Core?label=pre-release%20version) -![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Core) - -TourmalineCore.AspNetCore.JwtAuthentication.Core is available on -[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). -But also you can install latest stable version using **.NET CLI** - -```sh +TourmalineCore.AspNetCore.JwtAuthentication.Core is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Core/). But also you can install latest stable version using **.NET CLI** +``` dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Core ``` # Table of Content - [Authentication](#authentication) - - [Basic Usage](#basic) - - [Cookie](#cookie) - - [Options](#options) - - [Routing](#routing) - - [Login Request Example](#login-request) - - [Login Validation](#login-validation) - - [Token Usage](#token-usage) +- [Basic Usage](#basic) +- [Cookie](#cookie) +- [Options](#options) +- [Routing](#routing) +- [Login Request Example](#login-request) +- [Login Validation](#login-validation) +- [Token Usage](#token-usage) - [Authorization](#authorization) - [Callbacks](#callbacks) - - [Login](#login) - - [Logout](#logout) - - [Refresh](#refresh) - -The sections below will provide basic examples of how to use the package. -More complete examples of applications for different versions of .NET can be -found in -the “[Examples](../Examples/)” folder of the project. # Authentication ## Basic -To start using JWT-based authentication, need to use one method in the -`Startup.cs` file. In this case, the default options will be used. +To start using JWT-based authentication, need to use one method in the Startup.cs file. +In this case, the default options will be used. -Then, the token will be required in the request header of every authorized -endpoint, like this: `Authorization: Bearer {token}`. +Then, the token will be required in the request header of every authorized endpoint, like this: `Authorization: Bearer {token}`. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; public class Startup @@ -71,29 +54,30 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services.AddJwtAuthentication(authenticationOptions); + ... } - public async void Configure(IApplicationBuilder app, IHostingEnvironment env) + public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { + ... app.UseDefaultLoginMiddleware() app.UseJwtAuthentication(); + ... } } ``` ## Cookie -This package also allows you to store the received token in a cookie. To do that -you need to use Cookie login middleware instead of default login. After -successful login the token will be added to a cookie, that user will receive in -a response. Then they can use this cookie for the authentication instead of -writing the token to the Authentication header of every request. +This package also allows you to store the received token in a cookie. To do that you need to use Cookie login middleware instead of default login. After successful login the token will be added to a cookie, that user will receive in a response. Then they can use this cookie for the authentication instead of writing the token to the Authentication header of every request. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; public class Startup @@ -104,118 +88,122 @@ public class Startup { _configuration = configuration; } - - public void ConfigureServices(IServiceCollection services) + + public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services.AddJwtAuthentication(authenticationOptions); + ... } - public async void Configure(IApplicationBuilder app, IHostingEnvironment env) + public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { + ... app.UseCookieLoginMiddleware(new CookieAuthOptions{ Key = "ExampleCookieName" }); app.UseJwtAuthentication(); + ... } } ``` ## Options -To use package you need to pass AuthenticationOptions to the -AddJwtAuthentication(). +To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). + +| Name | Type | Default | Required | Description | +|-|-|-|-|-| +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -| Name | Type | Default | Required | Description | -| -------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 10080 | no | Lifetime of the Access Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +... -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = _configuration.GetSection(nameof(AuthenticationOptions)).Get() services.AddJwtAuthentication(authenticationOptions); + ... } ``` Minimum `appsettings.json` configuration: - ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` -For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). Here we can -generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 -PEM Format. +For generate pair RSA keys, use [mkjwk](https://mkjwk.org/). +Here we can generate key pair in RSA521 algorithm and 2048 key size. In package we use X.509 PEM Format. ## Routing -The default route to the login endpoint is `/auth/login`. You can change it by -passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware -extension. Like this: +The default route to the login endpoint is `/auth/login`. +You can change it by passing in a LoginEndpointOptions object to the UseDefaultLoginMiddleware extension. Like this: ```cs -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { + ... app.UseDefaultLoginMiddleware(new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); + ... } ``` - **OR** like this if you are using cookie middleware: ```cs -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { + ... app.UseCookieLoginMiddleware( - new CookieAuthOptions{ Key = "ExampleCookieName" }, + new CookieAuthOptions{ Key = "ExampleCookieName" }, new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); + ... } ``` ## Login request -You can call the login endpoint, you need to use the POST method, add to the -header `Content-Type: application/json` and pass the login/password in the JSON -format in the request body. Like this: - +You can call the login endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the login/password in the JSON format in the request body. Like this: ```json { "login": "Admin", "password": "Admin" } ``` - + As a successful result it will return **Access Token Model** json: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Login validation By default, login will be valid only for `Login="Admin"` and `Password="Admin"`. -You can provide your own implementation of the IUserCredentialsValidator -interface, in which implement your own logic for validation of the login and -password. +You can provide your own implementation of the IUserCredentialsValidator interface, in which implement your own logic for validation of the login and password. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; @@ -229,25 +217,25 @@ public class UserCredentialsValidator : IUserCredentialsValidator return Task.FromResult(login == Login && password == Password); } } - + public class Startup { - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + ... services .AddJwtAuthentication(authenticationOptions) .AddUserCredentialValidator(); + ... } } ``` ## Token usage -To enable token validation, you must add the `[Authorize]` attribute before the -controller or method, for example: +To enable token validation, you must add the `[Authorize]` attribute before the controller or method, for example: For methods: - ```cs [Authorize] [HttpGet] @@ -258,7 +246,6 @@ public IEnumerable Get() ``` For controllers: - ```cs [Authorize] [ApiController] @@ -271,24 +258,21 @@ public class ExampleController : ControllerBase # Authorization -This library implements claims-based authorization. With this, claims are added -to the token payload and verified upon request. In order to use this mechanism, -you need: - -1. Create a class that implements the IUserClaimsProvider interface that will - return a list of the claims that you need. For example: +This library implements claims-based authorization. With this, claims are added to the token payload and verified upon request. In order to use this mechanism, you need: +1. Create a class that implements the IUserClaimsProvider interface that will return a list of the claims that you need. For example: ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; public class UserClaimsProvider : IUserClaimsProvider { public const string ExampleClaimType = "ExamplePermission"; - + private const string FirstExampleClaimName = "CanUseExampleFirst"; private const string SecondExampleClaimName = "CanUseExampleSecond"; - + public Task> GetUserClaimsAsync(string login) { return Task.FromResult(new List @@ -300,25 +284,24 @@ public class UserClaimsProvider : IUserClaimsProvider } ``` -2. Connect this provider in the `Startup.cs`. You can pass the name of the claim - type you want to use as a parameter. `Default claim type = "Permission"`. - +2. Connect this provider in the `Startup.cs`. + You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { + ... services.AddJwtAuthentication(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + ... } ``` The claims in the token will look like this: - -```json +``` { - "ExamplePermission": [ - // instead "ExamplePermission" will be "Permission" when using the default option + "ExamplePermission": [ // instead "ExamplePermission" will be "Permission" when using the default option "CanUseExampleFirst", "CanUseExampleSecond" ], @@ -326,10 +309,7 @@ The claims in the token will look like this: } ``` -3. To enable checking of permissions, you must add the `RequiresPermission` - attribute before the controller or method and pass as a parameter all - permissions that are needed , for example: - +3. To enable checking of permissions, you must add the `RequiresPermission` attribute before the controller or method and pass as a parameter all permissions that are needed , for example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -343,7 +323,6 @@ public IEnumerable Get() ``` For controllers: - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; @@ -357,22 +336,17 @@ public class ExampleController : ControllerBase } ``` -Thus, only those users who have the desired permission will have access to the -controller or controller method. +Thus, only those users who have the desired permission will have access to the controller or controller method. # Callbacks -The library provides the ability to transfer callbacks for a call at the -beginning and end of the execution of the authentication, logout and refresh -token functions. This feature can be used for logging, to calculate your system -usage statistics, and so on. +The library provides the ability to transfer callbacks for a call at the beginning and end of the execution of the authentication, logout and refresh token functions. This feature can be used for logging, to calculate your system usage statistics, and so on. ## Login To use callbacks for authentication, follow these steps: -1. Create a function that will take `LoginModel` as a parameter and return a - result of the Task type. For example: +1. Create a function that will take `LoginModel` as a parameter and return a result of the Task type. For example: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Middlewares.Login.Models; @@ -394,12 +368,8 @@ app ## Logout -To call callbacks during logout, you need to follow the same steps as for login. -Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function -should take `LogoutModel` as a parameter +To call callbacks during logout, you need to follow the same steps as for login. Only use methods `OnLogoutExecuted` and `OnLogoutExecuting`. And your function should take `LogoutModel` as a parameter ## Refresh -To call callbacks during refresh, you need to follow the same steps as for -login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your -function should take `RefreshModel` as a parameter +To call callbacks during refresh, you need to follow the same steps as for login. Only use methods `OnRefreshExecuted` and `OnRefreshExecuting`. And your function should take `RefreshModel` as a parameter \ No newline at end of file diff --git a/JwtAuthentication.Identity/README.md b/JwtAuthentication.Identity/README.md index 1ca8436..a054dac 100644 --- a/JwtAuthentication.Identity/README.md +++ b/JwtAuthentication.Identity/README.md @@ -1,64 +1,49 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity - ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET Core 3.0 - .NET 5.0](Usage%20for%20old%20.NET.md). -This library contains middleware and authentication extensions. With this -library, you can very easily connect the JWT-based authentication to your -project with usage of EF Core and Identity to store users data. Optionally, you -can enable usage of Refresh token to provide additional level of security to -your app. Also, this library allows to easily implement registration and logout -functionality. +This library contains middleware and authentication extensions. +With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. +Optionally, you can enable usage of Refresh token to provide additional level of security to your app. +Also, this library allows to easily implement registration and logout functionality. -**NOTE**: This package is an extension of -TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic -functionality of JWT-based authentication. You can find more info about this -package -[here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) +**NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) ## Installation +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) -![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) -![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) - -TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on -[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). -But also you can install latest stable version using **.NET CLI** - -```sh +TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). But also you can install latest stable version using **.NET CLI** +``` dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity ``` ## Table of Content - [TourmalineCore.AspNetCore.JwtAuthentication.Identity](#tourmalinecoreaspnetcorejwtauthenticationidentity) - - [Installation](#installation) - - [Table of Content](#table-of-content) + * [Installation](#installation) + * [Table of Content](#table-of-content) - [Basic usage](#basic-usage) - - [Generic ID feature](#generic-id-feature) + * [Generic ID feature](#generic-id-feature) - [Registration](#registration) - - [Registration request](#registration-request) - - [Registration Routing](#registration-routing) + * [Registration request](#registration-request) + * [Registration Routing](#registration-routing) - [Refresh token](#refresh-token) - - [Login request with a Refresh Token](#login-request-with-a-refresh-token) - - [Refresh Token Request](#refresh-token-request) - - [Refresh Token Options](#refresh-token-options) - - [Refresh Routing](#refresh-routing) - - [Refresh Confidence Interval](#refresh-confidence-interval) + * [Login request with a Refresh Token](#login-request-with-a-refresh-token) + * [Refresh Token Request](#refresh-token-request) + * [Refresh Token Options](#refresh-token-options) + * [Refresh Routing](#refresh-routing) + * [Refresh Confidence Interval](#refresh-confidence-interval) - [Logout](#logout) - - [Logout request](#logout-request) + * [Logout request](#logout-request) - [Authorization](#authorization) -# Basic usage -1. You will need to inherit your context from TourmalineDbContext, provided by - this package. It uses a generic parameter of user entity. This entity must - inherit from **IdentityUser** class of Microsoft.Identity package. +# Basic usage +1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -72,7 +57,6 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -91,11 +75,9 @@ var app = builder.Build(); app .UseJwtAuthentication(); -} ``` 3. Optionally you can add the default user to the database - ```cs var app = builder.Build(); @@ -105,11 +87,9 @@ app ## Generic ID feature -By default, the id for the user and the role identities is created by the string -type in which the guid value is stored. +By default, the id for the user and the role identities is created by the string type in which the guid value is stored. -But can also use your own ID type by passing a generic type key in the **TKey** -parameter. +But can also use your own ID type by passing a generic type key in the **TKey** parameter. For example, by creating a custom entity with its id long type. @@ -120,11 +100,9 @@ public class CustomUser : IdentityUser // where long is generic type } ``` -Further, in methods where the generic user id type is involved, you must -explicitly specify the generic id type. - -> AppDbContext.cs +Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. +> AppDbContext.cs ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -162,19 +140,9 @@ app.UseRegistration(x => new CustomUser # Registration -Using Identity allows you to easily implement registration flow. To do that add -the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` -method to **Configure**. Both methods requires two generic parameters: - -- **User**: Entity representing the user of your app. It is must be inherited - from IdentityUser. -- **RegistrationRequestModel**: Model that will be passed to registration - endpoint. Basically, it contains only two properties necessary for basic - registration flow - login and password. You can use - **RegistrationRequestModel** class, provided by this package, or your own - model inherited from this class. In `UseRegistration` you will also need to - pass a mapping function, which will be used to convert - **RegistrationRequestModel** to **User** entity. +Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: +- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. +- **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -204,25 +172,20 @@ app ## Registration request -You can call the registration endpoint, you need to use the POST method, add to -the header `Content-Type: application/json` and pass the JSON object -representing chosen **RegistrationRequestModel** in the request body. Like this: - +You can call the registration endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the JSON object representing chosen **RegistrationRequestModel** in the request body. Like this: ```json -{ - "login": "Admin", - "password": "Admin" +{ + "login": "Admin", + "password": "Admin" } ``` -As a successful result it will return **Access Token Model**, so user will be -automatically logged in. +As a successful result it will return **Access Token Model**, so user will be automatically logged in. ## Registration Routing -The default route to the Registration endpoint is `/auth/register`. You can -change it by passing in a **RegistrationEndpointOptions** object to the -**UseRegistration** extension. Like this: +The default route to the Registration endpoint is `/auth/register`. +You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: ```cs var app = builder.Build(); @@ -233,17 +196,14 @@ app.UseRegistration(requestModel => new C NormalizedUserName = requestModel.Login, }, new RegistrationEndpointOptions() - { - RegistrationEndpointRoute = "/new-user" + { + RegistrationEndpointRoute = "/new-user" }); ``` # Refresh token -If you want to add another layer of security to your application, you can use -the refresh token. By using it you can reduce the lifetime of the access token, -but provide the ability to update it without re-login with an additional -long-live token stored in your database. +If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -266,17 +226,11 @@ app .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware(); ``` - ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a -**clientFingerPrint** parameter, that will be saved in the database with a -generated access token. If token has fingerprint, it can only be accessed by -providing the same fingerprint value. - -In addition to a access token login request will also return a **refresh token** -in the response. +Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +In addition to a access token login request will also return a **refresh token** in the response. ```json { "login": "Admin", @@ -285,32 +239,28 @@ in the response. } ``` -When you use a refresh token, its value will be added to every successful login -response (**Access Token Model**), so it will look like this: +When you use a refresh token, its value will be added to every successful login response (**Access Token Model**), so it will look like this: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - }, - "refreshToken": { - "value": "{{REFRESH_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + }, + "refreshToken": { + "value": "{{REFRESH_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Refresh Token Request -To call the Refresh Token Endpoint, you need to use the POST method, add to the -header `Content-Type: application/json` and pass the token value (and optionally -fingerprint) in the JSON format in the request body. Like this: - +To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -318,13 +268,9 @@ As a successful result it will return **Access Token Model**. ## Refresh Token Options -If you want to use your own values for options, then you need to pass -RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This -is inherit from basic AuthenticationOptions and share all the default -parameters. +If you want to use your own values for options, then you need to pass RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This is inherit from basic AuthenticationOptions and share all the default parameters. -To use package you need to pass AuthenticationOptions to the -AddJwtAuthentication(). +To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). | Name | Type | Default | Required | Description | | --------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | @@ -336,6 +282,7 @@ AddJwtAuthentication(). | RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | | IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | + ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; @@ -347,21 +294,19 @@ builder.services ``` Minimum appsettings.json configuration: - ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` ## Refresh Routing -The default route to the refresh endpoint is `/auth/refresh`. You can change it -by passing in a **RefreshEndpointOptions** object to the -**UseRefreshTokenMiddleware** extension. Like this: +The default route to the refresh endpoint is `/auth/refresh`. +You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; @@ -372,30 +317,23 @@ app .UseJwtAuthentication() .UseDefaultLoginMiddleware(); .UseRefreshTokenMiddleware(new RefreshEndpointOptions - { + { RefreshEndpointRoute = "/test/refresh", }); ``` ## Refresh Confidence Interval -Sometimes there may be situations when you send the same refresh requests which -causes an unexpected user logout. +Sometimes there may be situations when you send the same refresh requests which causes an unexpected user logout. This usually happens in the following cases: +1) You have opened several new tabs of your application almost at the same time +2) You worked in your application in different tabs and updated them almost at the same time -1. You have opened several new tabs of your application almost at the same time -2. You worked in your application in different tabs and updated them almost at - the same time +For example, you are working in your browser application, click on several links on a page that open other pages of the application in new tabs. +There may be a situation when you send the same refresh requests. What will happen in this case: -For example, you are working in your browser application, click on several links -on a page that open other pages of the application in new tabs. -There may be a situation when you send the same refresh requests. What will -happen in this case: - -1. The authentication package will receive a first refresh request, will expire - refresh token and send a new pair of tokens -1. The authentication package will receive a second refresh request, but this - refresh token is already expired and you will receive an error message +1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens +2) The authentication package will receive a second refresh request, but this refresh token is already expired and you will receive an error message ```mermaid sequenceDiagram @@ -408,27 +346,20 @@ sequenceDiagram Client->>Auth: POST auth/refresh {refreshTokenValue: "eea079d2-89e1-4cc6-a82c-31ac37d7996d" } note right of Auth: Token already expired! Auth-->>Client: Response 401 Unauthorized -end + end ``` -Yes, you can try to solve this problem on the client side. However, what if you -can't do this or do not want to complicate the frontend? +Yes, you can try to solve this problem on the client side. However, what if you can't do this or do not want to complicate the frontend? So how can the refresh confidence interval can help us? -The refresh confidence interval will allow you to correctly process refresh -requests with potentially expired tokens if the interval between the current -time and the token expiration time is less than the confidence interval time. +The refresh confidence interval will allow you to correctly process refresh requests with potentially expired tokens if the interval between the current time and the token expiration time is less than the confidence interval time. So in this case the requests processing will look like this: - -1. The authentication package will receive a first refresh request, will expire - refresh token and send a new pair of tokens -1. The authentication package will receive a second refresh request. - If the token is already expired, we look at a refresh confidence interval. - We find the difference between the current application time and the token - expiration time. - If this difference is greater than the confidence interval, you will receive - an error message, if not, then we send a new pair of tokens. +1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens +2) The authentication package will receive a second refresh request. +If the token is already expired, we look at a refresh confidence interval. +We find the difference between the current application time and the token expiration time. +If this difference is greater than the confidence interval, you will receive an error message, if not, then we send a new pair of tokens. ```mermaid sequenceDiagram @@ -447,14 +378,13 @@ sequenceDiagram else difference > refresh confidence interval rect rgb(240,128,128) Auth-->>Client: Response 401 Unauthorized + end end -end ``` Usage examples: You can set refresh confidence interval directly (in milliseconds) - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -469,10 +399,8 @@ builder.Services ``` You can also choose not to set a refresh confidence interval. -In this case, the refresh confidence interval will be set to 60,000 -milliseconds. -With this value you can be sure that multiple requests will be handled correctly -and it is not large enough to constantly use expired tokens. +In this case, the refresh confidence interval will be set to 60,000 milliseconds. +With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -488,10 +416,7 @@ builder.Services # Logout -If you are using the refresh token, you will probably want to have a possibility -to remove token's data from the database, when user requests it. This can be -achieved by implementing the Logout mechanism. You can simply enable it like -this: +If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -499,7 +424,7 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); - +... builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) @@ -516,14 +441,11 @@ app ## Logout request -To call the Logout Endpoint, you need to use the POST method, add to the header -`Content-Type: application/json` and pass the refresh token value (and -optionally fingerprint) in the JSON format in the request body. Like this: - +To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -531,28 +453,20 @@ If it was successful, it will return `true` in a response body. # Authorization -The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements -claims-based authorization. With this, claims are added to the token payload and -verified upon request. The basic implementation of authorization can be seen in -the documentation of the package -TourmalineCore.AspNetCore.JwtAuthentication.Core. +The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements claims-based authorization. With this, claims are added to the token payload and verified upon request. The basic implementation of authorization can be seen in the documentation of the package TourmalineCore.AspNetCore.JwtAuthentication.Core. -The only difference in implementation will be in the second step when adding -services. - -Connect this provider in the Startup.cs. You can pass the name of the claim type -you want to use as a parameter. `Default claim type = "Permission"`. +The only difference in implementation will be in the second step when adding services. +Connect this provider in the Startup.cs. + You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; var builder = WebApplication.CreateBuilder(args); - builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); ``` -Please note that if you enable functionality for the refresh token, then -`WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. +Please note that if you enable functionality for the refresh token, then `WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. diff --git a/JwtAuthentication.Identity/Usage for old .NET.md b/JwtAuthentication.Identity/Usage for old .NET.md index 0e075b0..78fe3ce 100644 --- a/JwtAuthentication.Identity/Usage for old .NET.md +++ b/JwtAuthentication.Identity/Usage for old .NET.md @@ -1,34 +1,21 @@ # TourmalineCore.AspNetCore.JwtAuthentication.Identity - ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/.NET?label=tests%20and%20build) The library can be used for all projects based on .NET Core 3.0 - .NET 9.0. Readme for usage on [.NET 6.0](README.md) or newer. -This library contains middleware and authentication extensions. With this -library, you can very easily connect the JWT-based authentication to your -project with usage of EF Core and Identity to store users data. Optionally, you -can enable usage of Refresh token to provide additional level of security to -your app. Also, this library allows to easily implement registration and logout -functionality. +This library contains middleware and authentication extensions. +With this library, you can very easily connect the JWT-based authentication to your project with usage of EF Core and Identity to store users data. +Optionally, you can enable usage of Refresh token to provide additional level of security to your app. +Also, this library allows to easily implement registration and logout functionality. -**NOTE**: This package is an extension of -TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic -functionality of JWT-based authentication. You can find more info about this -package -[here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) +**NOTE**: This package is an extension of TourmalineCore.AspNetCore.JwtAuthentication.Core package, that contains basic functionality of JWT-based authentication. You can find more info about this package [here](https://github.com/TourmalineCore/TourmalineCore.AspNetCore.JwtAuthentication/tree/master/JwtAuthentication.Core) # Installation +![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) ![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) ![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) -![Nuget](https://img.shields.io/nuget/v/TourmalineCore.AspNetCore.JwtAuthentication.Identity?color=gre&label=stable%20version) -![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/TourmalineCore.AspNetCore.JwtAuthentication.Identity?label=pre-release%20version) -![Nuget](https://img.shields.io/nuget/dt/TourmalineCore.AspNetCore.JwtAuthentication.Identity) - -TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on -[NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). -But also you can install latest stable version using **.NET CLI** - +TourmalineCore.AspNetCore.JwtAuthentication.Identity is available on [NuGet](https://www.nuget.org/packages/TourmalineCore.AspNetCore.JwtAuthentication.Identity/). But also you can install latest stable version using **.NET CLI** ``` dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity ``` @@ -36,27 +23,26 @@ dotnet add package TourmalineCore.AspNetCore.JwtAuthentication.Identity # Table of Content - [Basic Usage](#basic-usage) - - [Generic ID feature](#generic-id-feature) + - [Generic ID feature](#generic-id-feature) - [Registration](#registration) - - [Registration Request](#registration-request) - - [Registration Routing](#registration-routing) + - [Registration Request](#registration-request) + - [Registration Routing](#registration-routing) - [Refresh](#refresh-token) - - [Login request with a Refresh Token](#Login-request-with-a-Refresh-Token) - - [Refresh Token Request](#Refresh-Token-Request) - - [Refresh Token Options](#Refresh-Token-Options) - - [Refresh Routing](#Refresh-Token-Options) - - [Refresh Confidence Interval](#refresh-confidence-interval) - - [Logout](#logout) - - [Logout Request](#logout-request) + - [Login request with a Refresh Token](#Login-request-with-a-Refresh-Token) + - [Refresh Token Request](#Refresh-Token-Request) + - [Refresh Token Options](#Refresh-Token-Options) + - [Refresh Routing](#Refresh-Token-Options) + - [Refresh Confidence Interval](#refresh-confidence-interval) + - [Logout](#logout) + - [Logout Request](#logout-request) - [Authorization](#authorization) -# Basic usage -1. You will need to inherit your context from TourmalineDbContext, provided by - this package. It uses a generic parameter of user entity. This entity must - inherit from **IdentityUser** class of Microsoft.Identity package. +# Basic usage +1. You will need to inherit your context from TourmalineDbContext, provided by this package. It uses a generic parameter of user entity. This entity must inherit from **IdentityUser** class of Microsoft.Identity package. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class AppDbContext : TourmalineDbContext @@ -69,8 +55,8 @@ public class AppDbContext : TourmalineDbContext ``` 2. Then you need to update startup like this: - ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -83,41 +69,43 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions); + ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app.UseJwtAuthentication(); + ... } } ``` 3. Optionally you can add the default user to the database - ```cs public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app.UseDefaultDbUser("Admin", "Admin"); + ... } } ``` ## Generic ID feature -By default, the id for the user and the role identities is created by the string -type in which the guid value is stored. +By default, the id for the user and the role identities is created by the string type in which the guid value is stored. -But can also use your own ID type by passing a generic type key in the **TKey** -parameter. +But can also use your own ID type by passing a generic type key in the **TKey** parameter. For example, by creating a custom entity with its id long type. @@ -128,11 +116,9 @@ public class CustomUser : IdentityUser // where long is generic type } ``` -Further, in methods where the generic user id type is involved, you must -explicitly specify the generic id type. - -> Database context class +Further, in methods where the generic user id type is involved, you must explicitly specify the generic id type. +> Database context class ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -148,14 +134,23 @@ public class AppDbContext : TourmalineDbContext > Startup.cs ```cs +... public void ConfigureServices(IServiceCollection services) { + ... + services .AddJwtAuthenticationWithIdentity() + + ... } +... + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... + app.UseDefaultDbUser("Admin", "Admin"); app.UseDefaultLoginMiddleware() @@ -167,26 +162,21 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) NormalizedUserName = x.Login, } ); + + ... } + +... ``` # Registration -Using Identity allows you to easily implement registration flow. To do that add -the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` -method to **Configure**. Both methods requires two generic parameters: - -- **User**: Entity representing the user of your app. It is must be inherited - from IdentityUser. -- **RegistrationRequestModel**: Model that will be passed to registration - endpoint. Basically, it contains only two properties necessary for basic - registration flow - login and password. You can use - **RegistrationRequestModel** class, provided by this package, or your own - model inherited from this class. In `UseRegistration` you will also need to - pass a mapping function, which will be used to convert - **RegistrationRequestModel** to **User** entity. +Using Identity allows you to easily implement registration flow. To do that add the `AddRegistration` extension to **ConfigureServices**, and `UseRegistration` method to **Configure**. Both methods requires two generic parameters: +- **User**: Entity representing the user of your app. It is must be inherited from IdentityUser. +- **RegistrationRequestModel**: Model that will be passed to registration endpoint. Basically, it contains only two properties necessary for basic registration flow - login and password. You can use **RegistrationRequestModel** class, provided by this package, or your own model inherited from this class. In `UseRegistration` you will also need to pass a mapping function, which will be used to convert **RegistrationRequestModel** to **User** entity. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -199,71 +189,70 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions) .AddRegistration(); + ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app.UseRegistration(requestModel => new CustomUser() { UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }); + ... } } ``` ## Registration request -You can call the registration endpoint, you need to use the POST method, add to -the header `Content-Type: application/json` and pass the JSON object -representing chosen **RegistrationRequestModel** in the request body. Like this: - +You can call the registration endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the JSON object representing chosen **RegistrationRequestModel** in the request body. Like this: ```json -{ - "login": "Admin", - "password": "Admin" +{ + "login": "Admin", + "password": "Admin" } ``` -As a successful result it will return **Access Token Model**, so user will be -automatically logged in. +As a successful result it will return **Access Token Model**, so user will be automatically logged in. ## Registration Routing -The default route to the Registration endpoint is `/auth/register`. You can -change it by passing in a **RegistrationEndpointOptions** object to the -**UseRegistration** extension. Like this: +The default route to the Registration endpoint is `/auth/register`. +You can change it by passing in a **RegistrationEndpointOptions** object to the **UseRegistration** extension. Like this: ```cs public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app.UseRegistration(requestModel => new CustomUser() { UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }, new RegistrationEndpointOptions() - { - RegistrationEndpointRoute = "/new-user" + { + RegistrationEndpointRoute = "/new-user" }); + ... } ``` # Refresh token -If you want to add another layer of security to your application, you can use -the refresh token. By using it you can reduce the lifetime of the access token, -but provide the ability to update it without re-login with an additional -long-live token stored in your database. +If you want to add another layer of security to your application, you can use the refresh token. By using it you can reduce the lifetime of the access token, but provide the ability to update it without re-login with an additional long-live token stored in your database. ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -276,34 +265,32 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); + ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware(); + ... } } ``` - ## Login request with a Refresh Token -Requesting login endpoint will be much the same, but you can optionally add a -**clientFingerPrint** parameter, that will be saved in the database with a -generated access token. If token has fingerprint, it can only be accessed by -providing the same fingerprint value. - -In addition to a access token login request will also return a **refresh token** -in the response. +Requesting login endpoint will be much the same, but you can optionally add a **clientFingerPrint** parameter, that will be saved in the database with a generated access token. If token has fingerprint, it can only be accessed by providing the same fingerprint value. +In addition to a access token login request will also return a **refresh token** in the response. ```json { "login": "Admin", @@ -312,32 +299,28 @@ in the response. } ``` -When you use a refresh token, its value will be added to every successful login -response (**Access Token Model**), so it will look like this: +When you use a refresh token, its value will be added to every successful login response (**Access Token Model**), so it will look like this: ```json { - "accessToken": { - "value": "{{ACCESS_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - }, - "refreshToken": { - "value": "{{REFRESH_TOKEN_VALUE}}", - "expiresInUtc": "2021-01-01T00:00:00.0000000Z" - } + "accessToken": { + "value": "{{ACCESS_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + }, + "refreshToken": { + "value": "{{REFRESH_TOKEN_VALUE}}", + "expiresInUtc": "2021-01-01T00:00:00.0000000Z" + } } ``` ## Refresh Token Request -To call the Refresh Token Endpoint, you need to use the POST method, add to the -header `Content-Type: application/json` and pass the token value (and optionally -fingerprint) in the JSON format in the request body. Like this: - +To call the Refresh Token Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -345,88 +328,84 @@ As a successful result it will return **Access Token Model**. ## Refresh Token Options -If you want to use your own values for options, then you need to pass -RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This -is inherit from basic AuthenticationOptions and share all the default -parameters. +If you want to use your own values for options, then you need to pass RefreshAuthenticationOptions to the AddJwtAuthenticationWithRefreshToken(). This is inherit from basic AuthenticationOptions and share all the default parameters. -To use package you need to pass AuthenticationOptions to the -AddJwtAuthentication(). +To use package you need to pass AuthenticationOptions to the AddJwtAuthentication(). + +| Name | Type | Default | Required | Description | +|-|-|-|-|-| +| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | +| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | +| Issuer | string | null | no | The Registered Issuer Value | +| Audience | string | null | no | The Registered Audience Value | +| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | +| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | +| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | -| Name | Type | Default | Required | Description | -| --------------------------- | ------ | ------- | -------- | ------------------------------------------------------------------- | -| PrivateSigningKey | string | null | yes | The base64-encoded RSA Private Key | -| PublicSigningKey | string | null | yes | The Matching base64-encoded RSA Public Key | -| Issuer | string | null | no | The Registered Issuer Value | -| Audience | string | null | no | The Registered Audience Value | -| AccessTokenExpireInMinutes | int | 15 | no | Lifetime of the Access Token | -| RefreshTokenExpireInMinutes | int | 10080 | no | Lifetime of the Refresh Token | -| IsDebugTokenEnabled | bool | false | no | If true, user credentials will not be checked during authentication | ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; +... -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { + ... var authenticationOptions = _configuration.GetSection("AuthenticationOptions").Get(); services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions); + ... } ``` Minimum appsettings.json configuration: - ```json { - "AuthenticationOptions": { - "PublicSigningKey": "", - "PrivateSigningKey": "" - } + "AuthenticationOptions": { + "PublicSigningKey": "", + "PrivateSigningKey": "" + } } ``` ## Refresh Routing -The default route to the refresh endpoint is `/auth/refresh`. You can change it -by passing in a **RefreshEndpointOptions** object to the -**UseRefreshTokenMiddleware** extension. Like this: +The default route to the refresh endpoint is `/auth/refresh`. +You can change it by passing in a **RefreshEndpointOptions** object to the **UseRefreshTokenMiddleware** extension. Like this: ```cs +... using TourmalineCore.AspNetCore.JwtAuthentication.Identity.Options; +... -public async void Configure(IApplicationBuilder app, IHostingEnvironment env) +public async void Configure(IApplicationBuilder app, IHostingEnvironment env) { + ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware(); .UseRefreshTokenMiddleware(new RefreshEndpointOptions - { + { RefreshEndpointRoute = "/test/refresh", }); + ... } ``` ## Refresh Confidence Interval -Sometimes there may be situations when you send the same refresh requests which -causes an unexpected user logout. +Sometimes there may be situations when you send the same refresh requests which causes an unexpected user logout. This usually happens in the following cases: +1) You have opened several new tabs of your application almost at the same time +2) You worked in your application in different tabs and updated them almost at the same time -1. You have opened several new tabs of your application almost at the same time -1. You worked in your application in different tabs and updated them almost at - the same time +For example, you are working in your browser application, click on several links on a page that open other pages of the application in new tabs. +There may be a situation when you send the same refresh requests. What will happen in this case: -For example, you are working in your browser application, click on several links -on a page that open other pages of the application in new tabs. -There may be a situation when you send the same refresh requests. What will -happen in this case: - -1. The authentication package will receive a first refresh request, will expire - refresh token and send a new pair of tokens -1. The authentication package will receive a second refresh request, but this - refresh token is already expired and you will receive an error message +1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens +2) The authentication package will receive a second refresh request, but this refresh token is already expired and you will receive an error message ```mermaid sequenceDiagram @@ -439,27 +418,20 @@ sequenceDiagram Client->>Auth: POST auth/refresh {refreshTokenValue: "eea079d2-89e1-4cc6-a82c-31ac37d7996d" } note right of Auth: Token already expired! Auth-->>Client: Response 401 Unauthorized -end + end ``` -Yes, you can try to solve this problem on the client side. However, what if you -can't do this or do not want to complicate the frontend? +Yes, you can try to solve this problem on the client side. However, what if you can't do this or do not want to complicate the frontend? So how can the refresh confidence interval can help us? -The refresh confidence interval will allow you to correctly process refresh -requests with potentially expired tokens if the interval between the current -time and the token expiration time is less than the confidence interval time. +The refresh confidence interval will allow you to correctly process refresh requests with potentially expired tokens if the interval between the current time and the token expiration time is less than the confidence interval time. So in this case the requests processing will look like this: - -1. The authentication package will receive a first refresh request, will expire - refresh token and send a new pair of tokens -1. The authentication package will receive a second refresh request. - If the token is already expired, we look at a refresh confidence interval. - We find the difference between the current application time and the token - expiration time. - If this difference is greater than the confidence interval, you will receive - an error message, if not, then we send a new pair of tokens. +1) The authentication package will receive a first refresh request, will expire refresh token and send a new pair of tokens +2) The authentication package will receive a second refresh request. +If the token is already expired, we look at a refresh confidence interval. +We find the difference between the current application time and the token expiration time. +If this difference is greater than the confidence interval, you will receive an error message, if not, then we send a new pair of tokens. ```mermaid sequenceDiagram @@ -478,14 +450,13 @@ sequenceDiagram else difference > refresh confidence interval rect rgb(240,128,128) Auth-->>Client: Response 401 Unauthorized + end end -end ``` Usage examples: You can set refresh confidence interval directly (in milliseconds) - ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -499,7 +470,7 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); const int refreshConfidenceIntervalInMilliseconds = 300_000; @@ -520,10 +491,8 @@ public class Startup ``` You can also choose not to set a refresh confidence interval. -In this case, the refresh confidence interval will be set to 60,000 -milliseconds. -With this value you can be sure that multiple requests will be handled correctly -and it is not large enough to constantly use expired tokens. +In this case, the refresh confidence interval will be set to 60,000 milliseconds. +With this value you can be sure that multiple requests will be handled correctly and it is not large enough to constantly use expired tokens. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; @@ -538,7 +507,7 @@ public class Startup _configuration = configuration; } - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); @@ -560,10 +529,7 @@ public class Startup # Logout -If you are using the refresh token, you will probably want to have a possibility -to remove token's data from the database, when user requests it. This can be -achieved by implementing the Logout mechanism. You can simply enable it like -this: +If you are using the refresh token, you will probably want to have a possibility to remove token's data from the database, when user requests it. This can be achieved by implementing the Logout mechanism. You can simply enable it like this: ```cs ... @@ -572,35 +538,36 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Identity; public class Startup { - public void ConfigureServices(IServiceCollection services) + public void ConfigureServices(IServiceCollection services) { + ... services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .AddLogout(); + ... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + ... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware() .UseRefreshTokenLogoutMiddleware(); + ... } } ``` ## Logout request -To call the Logout Endpoint, you need to use the POST method, add to the header -`Content-Type: application/json` and pass the refresh token value (and -optionally fingerprint) in the JSON format in the request body. Like this: - +To call the Logout Endpoint, you need to use the POST method, add to the header `Content-Type: application/json` and pass the refresh token value (and optionally fingerprint) in the JSON format in the request body. Like this: ```json -{ - "refreshTokenValue": "{{REFRESH_TOKEN}}", - "clientFingerPrint": "{{FINGERPRINT}}" +{ + "refreshTokenValue": "{{REFRESH_TOKEN}}", + "clientFingerPrint": "{{FINGERPRINT}}" } ``` @@ -608,28 +575,23 @@ If it was successful, it will return `true` in a response body. # Authorization -The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements -claims-based authorization. With this, claims are added to the token payload and -verified upon request. The basic implementation of authorization can be seen in -the documentation of the package -TourmalineCore.AspNetCore.JwtAuthentication.Core. +The TourmalineCore.AspNetCore.JwtAuthentication.Identity extension implements claims-based authorization. With this, claims are added to the token payload and verified upon request. The basic implementation of authorization can be seen in the documentation of the package TourmalineCore.AspNetCore.JwtAuthentication.Core. -The only difference in implementation will be in the second step when adding -services. - -Connect this provider in the Startup.cs. You can pass the name of the claim type -you want to use as a parameter. `Default claim type = "Permission"`. +The only difference in implementation will be in the second step when adding services. +Connect this provider in the Startup.cs. + You can pass the name of the claim type you want to use as a parameter. `Default claim type = "Permission"`. ```cs using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -public void ConfigureServices(IServiceCollection services) +public void ConfigureServices(IServiceCollection services) { + ... services.AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); + ... } ``` -Please note that if you enable functionality for the refresh token, then -`WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. +Please note that if you enable functionality for the refresh token, then `WithUserClaimsProvider` should be called after `AddLoginWithRefresh`. From 2db52c577c9ca2e9ab7d71bcd87043c75e582079 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 16:20:07 +0500 Subject: [PATCH 48/49] chore: allow update to major version 1.0.0 --- JwtAuthentication.Core/JwtAuthentication.Core.csproj | 2 +- JwtAuthentication.Identity/JwtAuthentication.Identity.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 0ec887e..9800401 100644 --- a/JwtAuthentication.Core/JwtAuthentication.Core.csproj +++ b/JwtAuthentication.Core/JwtAuthentication.Core.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Core - 0.3.6 + 1.0.0 Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index d133ba5..fc2c991 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -3,7 +3,7 @@ netcoreapp3.0;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 TourmalineCore.AspNetCore.JwtAuthentication.Identity - 0.1.3 + 1.0.0 Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication From 9598a0bc1efdcb2f2379c56ccadba88fe119c992 Mon Sep 17 00:00:00 2001 From: Aleksandr Petrakov Date: Fri, 11 Jul 2025 17:03:03 +0500 Subject: [PATCH 49/49] chore: added different versions of EF --- .../JwtAuthentication.Identity.csproj | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index fc2c991..97c1b47 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -23,8 +23,32 @@ logo.png - - + + + + + + + + + + + + + + + + + + + + + + + + + +