diff --git a/.github/workflows/publish-to-nuget.yml b/.github/workflows/publish-to-nuget.yml index 1a93572..1fbb420 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 diff --git a/AspNetCore.JwtAuthentication.sln b/AspNetCore.JwtAuthentication.sln index e1ce8a8..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,148 +11,514 @@ 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.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}") = "Net7.0", "Net7.0", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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}") = "Net8.0", "Net8.0", "{3DC4FB03-312C-4EFB-838C-F95431860DFC}" +EndProject +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.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.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.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.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.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.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.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.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}") = "Net9.0", "Net9.0", "{1190019C-C08E-4729-8C0D-BB651642C479}" 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 + {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 + {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 @@ -182,6 +547,36 @@ 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} = {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} + {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} + {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} 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.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs similarity index 69% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs rename to Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index 938eaa3..2315532 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore6._0.AuthenticationWithRefreshToken.Models; +using Example.Net5._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._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.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs similarity index 68% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs index 064f450..86f7069 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore5._0.AuthenticationUsingIdentityUser.Models; +using Example.Net5._0.AuthenticationWithRefreshToken.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser.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.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs similarity index 66% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs index b3940d7..e08dfab 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net5.0.AuthenticationWithRefreshToken/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.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.NetCore5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Controllers/ExampleController.cs index dd8ccfe..7827500 100644 --- a/Examples/Example.NetCore5.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.NetCore5._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 89% rename from Examples/Example.NetCore5.0.CookiesBasedAuthentication/Startup.cs rename to Examples/Example.Net5.0.CookiesBasedAuthentication/Startup.cs index 7421b24..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 { @@ -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.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.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs similarity index 65% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index af68427..b0a2681 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs +++ b/Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore5._0.RefreshTokenWithConfidenceInterval.Models; +using Example.Net5._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore5._0.RefreshTokenWithConfidenceInterval.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 81% rename from Examples/Example.NetCore5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs rename to Examples/Example.Net5.0.RefreshTokenAuthAndRegistrationUsingIdentity/Startup.cs index 22eb234..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 { @@ -29,7 +29,7 @@ public void ConfigureServices(IServiceCollection services) var a = opt.AccessTokenExpireInMinutes; services.AddDbContext(options => - options.UseInMemoryDatabase("Database") + options.UseInMemoryDatabase("TestDb_Net5") ); services @@ -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.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 84% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Program.cs index d81a8d6..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.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json similarity index 88% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json index 5e48c0b..1302715 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -1,31 +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" - } - } - } -} +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:24369", + "sslPort": 0 + } + }, + "profiles": { + "Example.Net5._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/Startup.cs b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Startup.cs similarity index 85% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Startup.cs rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/Startup.cs index 647e317..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 { @@ -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.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/appsettings.json similarity index 99% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json rename to Examples/Example.Net5.0.RefreshTokenWithConfidenceInterval/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/appsettings.json +++ b/Examples/Example.Net5.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.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.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..bb2fa62 --- /dev/null +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net6._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net6._0.AuthenticationUsingGenericIdentityUser.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file 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.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs similarity index 61% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs index 6b35ae8..61ee31a 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Models; +namespace Example.Net6._0.AuthenticationUsingGenericIdentityUser.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs similarity index 85% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs index d9c6a83..3f67cf4 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs +++ b/Examples/Example.Net6.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.Net6._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net6._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.Net6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json similarity index 88% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json index 66b99da..17122ff 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.AuthenticationUsingGenericIdentityUser/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/appsettings.json rename to Examples/Example.Net6.0.AuthenticationUsingGenericIdentityUser/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/appsettings.json +++ b/Examples/Example.Net6.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.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs index 378c3fe..5a49713 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.AuthenticationWithRefreshToken.Controllers +namespace Example.Net6._0.AuthenticationUsingIdentityUser.Controllers { [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs similarity index 68% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs index caa2b63..91be9f3 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore6._0.AuthenticationUsingIdentityUser.Models; +using Example.Net6._0.AuthenticationUsingIdentityUser.Models; using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Data +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +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.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs similarity index 66% rename from Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs index 8cad8da..5547455 100644 --- a/Examples/Example.NetCore5.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore5._0.AuthenticationUsingIdentityUser.Models +namespace Example.Net6._0.AuthenticationUsingIdentityUser.Models { public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Program.cs similarity index 85% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Program.cs index 4cd8ad0..0faa530 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Program.cs +++ b/Examples/Example.Net6.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.Net6._0.AuthenticationUsingIdentityUser.Data; +using Example.Net6._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.Net6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json index bddc0dd..c7aeb04 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.AuthenticationUsingIdentityUser/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/appsettings.json rename to Examples/Example.Net6.0.AuthenticationUsingIdentityUser/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/appsettings.json +++ b/Examples/Example.Net6.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.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs index e653b58..a1f7d36 100644 --- a/Examples/Example.NetCore6.0.AuthenticationUsingIdentityUser/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Controllers/ExampleController.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.AuthenticationUsingIdentityUser.Controllers +namespace Example.Net6._0.AuthenticationWithRefreshToken.Controllers { [ApiController] [Route("[controller]")] 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.NetCore6.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs index cf09a1c..87a85a9 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Program.cs +++ b/Examples/Example.Net6.0.AuthenticationWithRefreshToken/Program.cs @@ -1,76 +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.Net6._0.AuthenticationWithRefreshToken.Data; +using Example.Net6._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.Net6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json index b8dc85d..5ee41b9 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.AuthenticationWithRefreshToken/appsettings.json similarity index 99% rename from Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/appsettings.json rename to Examples/Example.Net6.0.AuthenticationWithRefreshToken/appsettings.json index d09d8c4..8e261c5 100644 --- a/Examples/Example.NetCore6.0.AuthenticationWithRefreshToken/appsettings.json +++ b/Examples/Example.Net6.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.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.NetCore6.0.BaseAuthentication/Program.cs b/Examples/Example.Net6.0.BaseAuthentication/Program.cs similarity index 96% rename from Examples/Example.NetCore6.0.BaseAuthentication/Program.cs rename to Examples/Example.Net6.0.BaseAuthentication/Program.cs index 4917a4a..7dce155 100644 --- a/Examples/Example.NetCore6.0.BaseAuthentication/Program.cs +++ b/Examples/Example.Net6.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.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.Net6.0.BaseAuthentication/appsettings.json b/Examples/Example.Net6.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net6.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.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..7c4ab73 --- /dev/null +++ b/Examples/Example.Net6.0.CookiesBasedAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net6._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.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.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net6.0.CookiesBasedAuthentication/ProgramCookies.cs similarity index 90% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs rename to Examples/Example.Net6.0.CookiesBasedAuthentication/ProgramCookies.cs index 1d9184c..4b2aa9b 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/ProgramCookies.cs +++ b/Examples/Example.Net6.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.Net6.0.CookiesBasedAuthentication/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.CookiesBasedAuthentication/Properties/launchSettings.json rename to Examples/Example.Net6.0.CookiesBasedAuthentication/Properties/launchSettings.json index 6b4ff2e..a29f68d 100644 --- a/Examples/Example.NetCore6.0.CookiesBasedAuthentication/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net6.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net6.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.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.NetCore6.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net6.0.PermissionBasedAuthorization/Program.cs similarity index 88% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Program.cs index a4cb7bc..7ec7fef 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Program.cs +++ b/Examples/Example.Net6.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(); }); - -app.Run(); +using Example.Net6._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.Net6.0.PermissionBasedAuthorization/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/Properties/launchSettings.json rename to Examples/Example.Net6.0.PermissionBasedAuthorization/Properties/launchSettings.json index f4c16a6..c628549 100644 --- a/Examples/Example.NetCore6.0.PermissionBasedAuthorization/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.PermissionBasedAuthorization/UserClaimsProvider.cs similarity index 92% rename from Examples/Example.NetCore6.0.PermissionBasedAuthorization/UserClaimsProvider.cs rename to Examples/Example.Net6.0.PermissionBasedAuthorization/UserClaimsProvider.cs index 04fe1a4..7e8e666 100644 --- a/Examples/Example.NetCore6.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.NetCore6._0.PermissionBasedAuthorization +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net6._0.PermissionBasedAuthorization { public class UserClaimsProvider : IUserClaimsProvider { diff --git a/Examples/Example.Net6.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net6.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net6.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.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs similarity index 86% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs index 57e15d1..37e7314 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Controllers/ExampleController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Controllers; [ApiController] [Route("[controller]")] diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs similarity index 62% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs index 43e21bf..fcfe5d5 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Data/AppDbContext.cs @@ -1,8 +1,8 @@ -using Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +using Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; using Microsoft.EntityFrameworkCore; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; public class AppDbContext : TourmalineDbContext { 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.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs similarity index 58% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs index da27e0c..d1d61f4 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Models/CustomUser.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Identity; -namespace Example.NetCore6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; +namespace Example.Net6._0.RefreshTokenAuthAndRegistrationUsingIdentity.Models; public class CustomUser : IdentityUser { diff --git a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs similarity index 86% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs index 0dc5e62..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("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.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.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json similarity index 88% rename from Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json rename to Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json index 7d6fb74..0ad1635 100644 --- a/Examples/Example.NetCore5.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json @@ -1,31 +1,31 @@ -{ - "$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" - } - } - } -} +{ + "$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.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net6.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net6.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.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.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Program.cs similarity index 89% rename from Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Program.cs index b3553f2..88b8ed8 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenWithConfidenceInterval/Program.cs +++ b/Examples/Example.Net6.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.Net6._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net6._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.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json similarity index 87% rename from Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json rename to Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json index 270809e..22181a4 100644 --- a/Examples/Example.NetCore6.0.RefreshTokenAuthAndRegistrationUsingIdentity/Properties/launchSettings.json +++ b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json @@ -1,31 +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" - } - } - } -} +{ + "$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.Net6.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net6.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net6.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.NetCore6.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net6.0.WithCredentialsValidator/Controllers/ExampleController.cs similarity index 90% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Controllers/ExampleController.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/Controllers/ExampleController.cs index d0f5f7c..ffdce7e 100644 --- a/Examples/Example.NetCore6.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.NetCore6._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.NetCore6.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net6.0.WithCredentialsValidator/Program.cs similarity index 91% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/Program.cs index ad2c348..84a30ae 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Program.cs +++ b/Examples/Example.Net6.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.Net6._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.Net6.0.WithCredentialsValidator/Properties/launchSettings.json similarity index 89% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/Properties/launchSettings.json rename to Examples/Example.Net6.0.WithCredentialsValidator/Properties/launchSettings.json index 419bec2..78f0842 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/Properties/launchSettings.json +++ b/Examples/Example.Net6.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.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs similarity index 88% rename from Examples/Example.NetCore6.0.WithCredentialsValidator/UserCredentialsValidator.cs rename to Examples/Example.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs index 4618147..101ac43 100644 --- a/Examples/Example.NetCore6.0.WithCredentialsValidator/UserCredentialsValidator.cs +++ b/Examples/Example.Net6.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -1,6 +1,6 @@ using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; -namespace Example.NetCore6._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.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..e6569f1 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net7._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net7._0.AuthenticationUsingGenericIdentityUser.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..049a111 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Example.Net7.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,20 @@ + + + + net7.0 + enable + disable + Example.Net7._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + diff --git a/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..6be15ad --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net7._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..a04e173 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,66 @@ +using Example.Net7._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net7._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.Net7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..17122ff --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net7.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..bbaf0e6 --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Example.Net7.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,20 @@ + + + + net7.0 + enable + enable + 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.Net7.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..d63eb9a --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,37 @@ +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; +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.Net7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..c7aeb04 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net7.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..535b6ae --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Example.Net7.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + 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.Net7.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..7c1343e --- /dev/null +++ b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,75 @@ +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; +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.Net7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..5ee41b9 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net7.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net7.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..4e5a9ac --- /dev/null +++ b/Examples/Example.Net7.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._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.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj b/Examples/Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj new file mode 100644 index 0000000..d82c340 --- /dev/null +++ b/Examples/Example.Net7.0.BaseAuthentication/Example.Net7.0.BaseAuthentication.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + Example.Net7._0.BaseAuthentication + + + + + + + diff --git a/Examples/Example.Net7.0.BaseAuthentication/Program.cs b/Examples/Example.Net7.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..7dce155 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net7.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.BaseAuthentication/appsettings.json b/Examples/Example.Net7.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..15b3047 --- /dev/null +++ b/Examples/Example.Net7.0.CookiesBasedAuthentication/Example.Net7.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + disable + Example.Net7._0.CookiesBasedAuthentication + + + + + + + diff --git a/Examples/Example.Net7.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net7.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..4b2aa9b --- /dev/null +++ b/Examples/Example.Net7.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 { } \ No newline at end of file diff --git a/Examples/Example.Net7.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net7.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..a29f68d --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net7.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..1e7833b --- /dev/null +++ b/Examples/Example.Net7.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.Net7._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; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..bdec672 --- /dev/null +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Example.Net7.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + Example.Net7._0.PermissionBasedAuthorization + + + + + + + + diff --git a/Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..b2d9fd7 --- /dev/null +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,35 @@ +using Example.Net7._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.Net7.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net7.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..c628549 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..3d815ee --- /dev/null +++ b/Examples/Example.Net7.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net7._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.Net7.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net7.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..68f8038 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + disable + disable + 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.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..d9aefd9 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,65 @@ +using Example.Net7._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net7._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_Net7") + ); + +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.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.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net7.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..eb887a7 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._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; + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..cdf942a --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net7._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net7._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..e744196 --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Example.Net7.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + disable + disable + Example.Net7._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + diff --git a/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..52d4e5d --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net7._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..b78f2bd --- /dev/null +++ b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,65 @@ +using Example.Net7._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net7._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.Net7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/Properties/launchSettings.json new file mode 100644 index 0000000..22181a4 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net7.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net7.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.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..27316c8 --- /dev/null +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net7._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.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj b/Examples/Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..f65466f --- /dev/null +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Example.Net7.0.WithCredentialsValidator.csproj @@ -0,0 +1,23 @@ + + + + net7.0 + enable + enable + Example.Net7._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + diff --git a/Examples/Example.Net7.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net7.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..27c64ee --- /dev/null +++ b/Examples/Example.Net7.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,48 @@ +using Example.Net7._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.Net7.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net7.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..78f0842 --- /dev/null +++ b/Examples/Example.Net7.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.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.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..e07f10b --- /dev/null +++ b/Examples/Example.Net7.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,15 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net7._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); + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net7.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net7.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.Net7.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 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.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..242f3ab --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net8._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net8._0.AuthenticationUsingGenericIdentityUser.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..641c097 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Example.Net8.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + disable + Example.Net8._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..331f255 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net8._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..e06d191 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,66 @@ +using Example.Net8._0.AuthenticationUsingGenericIdentityUser.Data; +using Example.Net8._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.Net8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..17122ff --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net8.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..5e8bbfb --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Example.Net8.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + 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.Net8.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..24ead6d --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,37 @@ +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; +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.Net8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..c7aeb04 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net8.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..dddbf15 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Example.Net8.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + 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.Net8.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..32ae423 --- /dev/null +++ b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,75 @@ +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; +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.Net8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..5ee41b9 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net8.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net8.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..03fa269 --- /dev/null +++ b/Examples/Example.Net8.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._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.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj b/Examples/Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj new file mode 100644 index 0000000..956aa2d --- /dev/null +++ b/Examples/Example.Net8.0.BaseAuthentication/Example.Net8.0.BaseAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + Example.Net8._0.BaseAuthentication + + + + + + + + diff --git a/Examples/Example.Net8.0.BaseAuthentication/Program.cs b/Examples/Example.Net8.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..7dce155 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net8.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.BaseAuthentication/appsettings.json b/Examples/Example.Net8.0.BaseAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..3ab4010 --- /dev/null +++ b/Examples/Example.Net8.0.CookiesBasedAuthentication/Example.Net8.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + disable + Example.Net8._0.CookiesBasedAuthentication + + + + + + + + diff --git a/Examples/Example.Net8.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net8.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..4b2aa9b --- /dev/null +++ b/Examples/Example.Net8.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 { } \ No newline at end of file diff --git a/Examples/Example.Net8.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net8.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..a29f68d --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.CookiesBasedAuthentication/appsettings.json b/Examples/Example.Net8.0.CookiesBasedAuthentication/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..4e99dc3 --- /dev/null +++ b/Examples/Example.Net8.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.Net8._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; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..139e1fe --- /dev/null +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Example.Net8.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + Example.Net8._0.PermissionBasedAuthorization + + + + + + + + + diff --git a/Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..17567dc --- /dev/null +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,35 @@ +using Example.Net8._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.Net8.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net8.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..c628549 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..11d0207 --- /dev/null +++ b/Examples/Example.Net8.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net8._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.Net8.0.PermissionBasedAuthorization/appsettings.json b/Examples/Example.Net8.0.PermissionBasedAuthorization/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..112498c --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + disable + disable + 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.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..358f061 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,65 @@ +using Example.Net8._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net8._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_Net8") + ); + +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.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.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json b/Examples/Example.Net8.0.RefreshTokenAuthAndRegistrationUsingIdentity/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..40933d9 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._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; + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..a4fe229 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net8._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net8._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..0a88058 --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Example.Net8.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + disable + disable + Example.Net8._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + + diff --git a/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..a8cbfec --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net8._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..2f905ae --- /dev/null +++ b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,65 @@ +using Example.Net8._0.RefreshTokenWithConfidenceInterval.Data; +using Example.Net8._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.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.Net8.0.RefreshTokenWithConfidenceInterval/appsettings.json b/Examples/Example.Net8.0.RefreshTokenWithConfidenceInterval/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net8.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.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs b/Examples/Example.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs new file mode 100644 index 0000000..fbd7d53 --- /dev/null +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net8._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.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj b/Examples/Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..e31c39a --- /dev/null +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Example.Net8.0.WithCredentialsValidator.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + enable + enable + Example.Net8._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + + diff --git a/Examples/Example.Net8.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net8.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..4f3f526 --- /dev/null +++ b/Examples/Example.Net8.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,48 @@ +using Example.Net8._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.Net8.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net8.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..78f0842 --- /dev/null +++ b/Examples/Example.Net8.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.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.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..19130f0 --- /dev/null +++ b/Examples/Example.Net8.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,15 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net8._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); + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net8.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net8.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.Net8.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 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.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs new file mode 100644 index 0000000..cc3c953 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net9._0.AuthenticationUsingGenericIdentityUser.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net9._0.AuthenticationUsingGenericIdentityUser.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj new file mode 100644 index 0000000..a1b733b --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Example.Net9.0.AuthenticationUsingGenericIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net9.0 + enable + disable + Example.Net9._0.AuthenticationUsingGenericIdentityUser + + + + + + + + + + + + + + diff --git a/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs new file mode 100644 index 0000000..95007cf --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net9._0.AuthenticationUsingGenericIdentityUser.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs new file mode 100644 index 0000000..919d647 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/ProgramGeneric.cs @@ -0,0 +1,66 @@ +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.Net9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..17122ff --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.AuthenticationUsingGenericIdentityUser/appsettings.json b/Examples/Example.Net9.0.AuthenticationUsingGenericIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj new file mode 100644 index 0000000..53d80ac --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Example.Net9.0.AuthenticationUsingIdentityUser.csproj @@ -0,0 +1,21 @@ + + + + net9.0 + enable + enable + 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.Net9.0.AuthenticationUsingIdentityUser/Program.cs b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Program.cs new file mode 100644 index 0000000..7d29c2c --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Program.cs @@ -0,0 +1,37 @@ +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.Net9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/Properties/launchSettings.json new file mode 100644 index 0000000..c7aeb04 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.AuthenticationUsingIdentityUser/appsettings.json b/Examples/Example.Net9.0.AuthenticationUsingIdentityUser/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj new file mode 100644 index 0000000..d028ad9 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Example.Net9.0.AuthenticationWithRefreshToken.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + enable + enable + 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.Net9.0.AuthenticationWithRefreshToken/Program.cs b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Program.cs new file mode 100644 index 0000000..d7f21a6 --- /dev/null +++ b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Program.cs @@ -0,0 +1,75 @@ +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.Net9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/Properties/launchSettings.json new file mode 100644 index 0000000..5ee41b9 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.AuthenticationWithRefreshToken/appsettings.json b/Examples/Example.Net9.0.AuthenticationWithRefreshToken/appsettings.json new file mode 100644 index 0000000..8e261c5 --- /dev/null +++ b/Examples/Example.Net9.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.Net9.0.BaseAuthentication/Controllers/ExampleController.cs b/Examples/Example.Net9.0.BaseAuthentication/Controllers/ExampleController.cs new file mode 100644 index 0000000..ead1a48 --- /dev/null +++ b/Examples/Example.Net9.0.BaseAuthentication/Controllers/ExampleController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._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.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj b/Examples/Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj new file mode 100644 index 0000000..293aff8 --- /dev/null +++ b/Examples/Example.Net9.0.BaseAuthentication/Example.Net9.0.BaseAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + enable + enable + Example.Net9._0.BaseAuthentication + + + + + + + + diff --git a/Examples/Example.Net9.0.BaseAuthentication/Program.cs b/Examples/Example.Net9.0.BaseAuthentication/Program.cs new file mode 100644 index 0000000..7dce155 --- /dev/null +++ b/Examples/Example.Net9.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.Net9.0.BaseAuthentication/Properties/launchSettings.json b/Examples/Example.Net9.0.BaseAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..4435f01 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj b/Examples/Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj new file mode 100644 index 0000000..071af46 --- /dev/null +++ b/Examples/Example.Net9.0.CookiesBasedAuthentication/Example.Net9.0.CookiesBasedAuthentication.csproj @@ -0,0 +1,15 @@ + + + + net9.0 + enable + disable + Example.Net9._0.CookiesBasedAuthentication + + + + + + + + diff --git a/Examples/Example.Net9.0.CookiesBasedAuthentication/ProgramCookies.cs b/Examples/Example.Net9.0.CookiesBasedAuthentication/ProgramCookies.cs new file mode 100644 index 0000000..4b2aa9b --- /dev/null +++ b/Examples/Example.Net9.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 { } \ No newline at end of file diff --git a/Examples/Example.Net9.0.CookiesBasedAuthentication/Properties/launchSettings.json b/Examples/Example.Net9.0.CookiesBasedAuthentication/Properties/launchSettings.json new file mode 100644 index 0000000..a29f68d --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/Controllers/ExampleController.cs new file mode 100644 index 0000000..2261a65 --- /dev/null +++ b/Examples/Example.Net9.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.Net9._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; + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj b/Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj new file mode 100644 index 0000000..a8717f3 --- /dev/null +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Example.Net9.0.PermissionBasedAuthorization.csproj @@ -0,0 +1,16 @@ + + + + net9.0 + enable + enable + Example.Net9._0.PermissionBasedAuthorization + + + + + + + + + diff --git a/Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs new file mode 100644 index 0000000..a389ce1 --- /dev/null +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/Program.cs @@ -0,0 +1,35 @@ +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.Net9.0.PermissionBasedAuthorization/Properties/launchSettings.json b/Examples/Example.Net9.0.PermissionBasedAuthorization/Properties/launchSettings.json new file mode 100644 index 0000000..c628549 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs b/Examples/Example.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs new file mode 100644 index 0000000..f23a58b --- /dev/null +++ b/Examples/Example.Net9.0.PermissionBasedAuthorization/UserClaimsProvider.cs @@ -0,0 +1,24 @@ +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.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj new file mode 100644 index 0000000..7980e30 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + disable + disable + 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.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs new file mode 100644 index 0000000..acdccf9 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenAuthAndRegistrationUsingIdentity/Program.cs @@ -0,0 +1,65 @@ +using Example.Net9._0.RefreshTokenAuthAndRegistrationUsingIdentity.Data; +using Example.Net9._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_Net9") + ); + +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.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.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs new file mode 100644 index 0000000..9eda927 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Controllers/ExampleController.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Example.Net9._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; + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs new file mode 100644 index 0000000..e25c017 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Data/AppDbContext.cs @@ -0,0 +1,13 @@ +using Example.Net9._0.RefreshTokenWithConfidenceInterval.Models; +using Microsoft.EntityFrameworkCore; +using TourmalineCore.AspNetCore.JwtAuthentication.Identity; + +namespace Example.Net9._0.RefreshTokenWithConfidenceInterval.Data; + +public class AppDbContext : TourmalineDbContext +{ + public AppDbContext(DbContextOptions options) + : base(options) + { + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj new file mode 100644 index 0000000..b2c9984 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Example.Net9.0.RefreshTokenWithConfidenceInterval.csproj @@ -0,0 +1,20 @@ + + + + net9.0 + disable + disable + Example.Net9._0.RefreshTokenWithConfidenceInterval + + + + + + + + + + + + + diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs new file mode 100644 index 0000000..fb54b6b --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Models/CustomUser.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Identity; + +namespace Example.Net9._0.RefreshTokenWithConfidenceInterval.Models; + +public class CustomUser : IdentityUser +{ + public string Name { get; set; } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs new file mode 100644 index 0000000..e1f5c73 --- /dev/null +++ b/Examples/Example.Net9.0.RefreshTokenWithConfidenceInterval/Program.cs @@ -0,0 +1,65 @@ +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.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj b/Examples/Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj new file mode 100644 index 0000000..1f6f1e0 --- /dev/null +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Example.Net9.0.WithCredentialsValidator.csproj @@ -0,0 +1,24 @@ + + + + net9.0 + enable + enable + Example.Net9._0.WithCredentialsValidator + + + + + + + + + PreserveNewest + true + PreserveNewest + + + + + + diff --git a/Examples/Example.Net9.0.WithCredentialsValidator/Program.cs b/Examples/Example.Net9.0.WithCredentialsValidator/Program.cs new file mode 100644 index 0000000..54a3622 --- /dev/null +++ b/Examples/Example.Net9.0.WithCredentialsValidator/Program.cs @@ -0,0 +1,48 @@ +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.Net9.0.WithCredentialsValidator/Properties/launchSettings.json b/Examples/Example.Net9.0.WithCredentialsValidator/Properties/launchSettings.json new file mode 100644 index 0000000..78f0842 --- /dev/null +++ b/Examples/Example.Net9.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.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.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs b/Examples/Example.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs new file mode 100644 index 0000000..3c65d8d --- /dev/null +++ b/Examples/Example.Net9.0.WithCredentialsValidator/UserCredentialsValidator.cs @@ -0,0 +1,15 @@ +using TourmalineCore.AspNetCore.JwtAuthentication.Core.Contract; + +namespace Example.Net9._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); + } + } +} \ No newline at end of file diff --git a/Examples/Example.Net9.0.WithCredentialsValidator/appsettings.json b/Examples/Example.Net9.0.WithCredentialsValidator/appsettings.json new file mode 100644 index 0000000..dc634db --- /dev/null +++ b/Examples/Example.Net9.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 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.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.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs b/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs deleted file mode 100644 index da2b1a3..0000000 --- a/Examples/Example.NetCore6.0.AuthenticationUsingGenericIdentityUser/Data/AppDbContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Models; -using Microsoft.EntityFrameworkCore; -using TourmalineCore.AspNetCore.JwtAuthentication.Identity; - -namespace Example.NetCore6._0.AuthenticationUsingGenericIdentityUser.Data; - public class AppDbContext : TourmalineDbContext - { - public AppDbContext(DbContextOptions options) - : base(options) - { - } - } 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/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/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/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/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 c2c9d06..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 { @@ -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..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 { @@ -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/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 f50993d..8cc7807 100644 --- a/Examples/Tests/NetCore5.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore5.0/RegistrationTests.cs @@ -1,21 +1,21 @@ 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 { 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) @@ -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/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 79d1fba..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 { @@ -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..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 { @@ -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..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 { @@ -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/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 4794ea7..54da11d 100644 --- a/Examples/Tests/NetCore6.0/RegistrationTests.cs +++ b/Examples/Tests/NetCore6.0/RegistrationTests.cs @@ -6,15 +6,15 @@ 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 { 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) @@ -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/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore7.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..803157b --- /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.Net7._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/BasicAuthTests.cs b/Examples/Tests/NetCore7.0/BasicAuthTests.cs new file mode 100644 index 0000000..a650447 --- /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.Net7._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/NetCore7.0/CookieTests.cs b/Examples/Tests/NetCore7.0/CookieTests.cs new file mode 100644 index 0000000..ab75e2a --- /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.Net7._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..2d9a127 --- /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.Net7._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..f1aa43f --- /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.Net7._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..c4f1443 --- /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.Net7._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..c79bb26 --- /dev/null +++ b/Examples/Tests/NetCore7.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.Net7._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..d23efca --- /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.Net7._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test_net7"; + 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/NetCore8.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore8.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..4323f77 --- /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.Net8._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..00950fb --- /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.Net8._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..67987e8 --- /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.Net8._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..e67d73b --- /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.Net8._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..8073ab1 --- /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.Net8._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..66fb5f8 --- /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.Net8._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..fb4e4c7 --- /dev/null +++ b/Examples/Tests/NetCore8.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.Net8._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..3f1064c --- /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.Net8._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test_net8"; + 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/NetCore9.0/BasicAuthTestWithGeneric.cs b/Examples/Tests/NetCore9.0/BasicAuthTestWithGeneric.cs new file mode 100644 index 0000000..a3538c8 --- /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.Net9._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..3b17cbe --- /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.Net9._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..a245d82 --- /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.Net9._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..c1e7899 --- /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.Net9._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..c5f5043 --- /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.Net9._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..9fad6de --- /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.Net9._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..48ccf5d --- /dev/null +++ b/Examples/Tests/NetCore9.0/RefreshTestsWithConfidenceInterval.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Tests.Net9._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..b1535ad --- /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.Net9._0 +{ + public class RegistrationTests + : AuthTestsBase + { + private const string RegisterUrl = "/auth/register"; + + private const string Login = "test_net9"; + 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/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 7a49897..e59c832 100644 --- a/Examples/Tests/Tests.csproj +++ b/Examples/Tests/Tests.csproj @@ -1,14 +1,14 @@  - net6.0 - false - enable - Tests + net9.0 + false + enable + Tests - - + + @@ -23,26 +23,27 @@ - + - - + + - - - - - + + + + + + - - - + + + - - - PreserveNewest - - + + + PreserveNewest + + 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; diff --git a/JwtAuthentication.Core/JwtAuthentication.Core.csproj b/JwtAuthentication.Core/JwtAuthentication.Core.csproj index 4e3e707..9800401 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 + 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 + 1.0.0 + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication @@ -24,25 +24,41 @@ - - + + - - + + + - - + + - + + + + + + + + + + + + + + + + diff --git a/JwtAuthentication.Core/README.md b/JwtAuthentication.Core/README.md index aa4fce1..8190490 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,8 +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; @@ -60,30 +59,23 @@ var configuration = builder.Configuration; var authenticationOptions = (configuration.GetSection(nameof(AuthenticationOptions)).Get()); builder.Services.AddJwtAuthentication(authenticationOptions); -... - var app = builder.Build(); app .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. -```csharp -... +```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; @@ -91,8 +83,6 @@ var authenticationOptions = configuration.GetSection(nameof(AuthenticationOption builder.Services .AddJwtAuthentication(authenticationOptions); -... - var app = builder.Build(); app.UseCookieLoginMiddleware(new CookieAuthOptions @@ -104,41 +94,34 @@ 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 | +| 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 | -```csharp -... +```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); -... ``` -Minimum appsettings.json configuration: +Minimum `appsettings.json` configuration: ```json { "AuthenticationOptions": { @@ -148,7 +131,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,28 +139,22 @@ 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(); app .UseDefaultLoginMiddleware(new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); .UseJwtAuthentication(); -... ``` **OR** like this if you are using cookie middleware: -```csharp -... - +```cs var app = builder.Build(); app.UseCookieLoginMiddleware( new CookieAuthOptions{ Key = "ExampleCookieName" }, new LoginEndpointOptions{ LoginEndpointRoute = "/test/login" }); app.UseJwtAuthentication(); - ... ``` ## Login request @@ -206,8 +183,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,18 +199,14 @@ public class UserCredentialsValidator : IUserCredentialsValidator } ``` -Program.cs -```csharp -... +`Program.cs` +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Options; -... var builder = WebApplication.CreateBuilder(args); -... builder.services .AddJwtAuthentication(authenticationOptions) .AddUserCredentialValidator(); -... ``` ## Token usage @@ -242,7 +214,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 +224,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs [Authorize] [ApiController] [Route("[controller]")] @@ -267,8 +239,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; public class UserClaimsProvider : IUserClaimsProvider @@ -290,17 +261,15 @@ 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); -... builder.services .AddJwtAuthentication(authenticationOptions) .WithUserClaimsProvider(UserClaimsProvider.ExampleClaimType); -... ``` The claims in the token will look like this: @@ -315,7 +284,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 +297,7 @@ public IEnumerable Get() ``` For controllers: -```csharp +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core.Filters; [ApiController] @@ -353,7 +322,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 +333,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/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.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/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/JwtAuthentication.Identity.csproj b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj index c74121c..fc2c991 100644 --- a/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj +++ b/JwtAuthentication.Identity/JwtAuthentication.Identity.csproj @@ -1,10 +1,10 @@ - + - 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.2 - Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Aleksandr Petrakov + 1.0.0 + Maxim Koval, Nikita Medvedev, Aleksandr Shinkarev, Vladislav Yusupov, Oleg Klyavlin, Aleksandr Petrakov Tourmaline Core JwtAuthentication 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/README.md b/JwtAuthentication.Identity/README.md index 2e579b1..a054dac 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,8 +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; public class AppDbContext : TourmalineDbContext @@ -58,8 +57,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; @@ -67,31 +65,24 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +builder. services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions); -... var app = builder.Build(); app .UseJwtAuthentication(); -... -} ``` 3. Optionally you can add the default user to the database -```csharp -... - +```cs var app = builder.Build(); app .UseDefaultDbUser("Admin", "Admin"); -... ``` ## Generic ID feature @@ -102,8 +93,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; } @@ -113,8 +103,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; public class AppDbContext : TourmalineDbContext @@ -128,15 +117,12 @@ public class AppDbContext : TourmalineDbContext > Program.cs -```csharp -... +```cs var builder = WebApplication.CreateBuilder(args); builder.Services .AddJwtAuthenticationWithIdentity() -... - var app = builder.Build(); app.UseDefaultDbUser("Admin", "Admin"); @@ -150,18 +136,15 @@ app.UseRegistration(x => new CustomUser NormalizedUserName = x.Login, } ); - -... ``` # 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; @@ -169,15 +152,13 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +builder. services .AddJwtAuthenticationWithIdentity() .AddBaseLogin(authenticationOptions) .AddRegistration(); -... var app = builder.Build(); @@ -187,7 +168,6 @@ app UserName = requestModel.Login, NormalizedUserName = requestModel.Login, }); -... ``` ## Registration request @@ -200,16 +180,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(); app.UseRegistration(requestModel => new CustomUser() @@ -221,15 +199,13 @@ app.UseRegistration(requestModel => new C { 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. -```csharp -... +```cs using TourmalineCore.AspNetCore.JwtAuthentication.Core; using TourmalineCore.AspNetCore.JwtAuthentication.Identity; @@ -237,26 +213,22 @@ var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; -... var authenticationOptions = (_configuration.GetSection(nameof(AuthenticationOptions)).Get()); -buidler. +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 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 +256,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}}", @@ -300,29 +272,25 @@ If you want to use your own values for options, then you need to pass RefreshAut 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 | -```csharp -... +```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: @@ -340,14 +308,11 @@ 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; -... var app = builder.Build(); -... app .UseJwtAuthentication() .UseDefaultLoginMiddleware(); @@ -355,7 +320,6 @@ app { RefreshEndpointRoute = "/test/refresh", }); -... ``` ## Refresh Confidence Interval @@ -421,7 +385,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 +402,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,8 +418,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; @@ -466,22 +429,19 @@ builder.services .AddJwtAuthenticationWithIdentity() .AddLoginWithRefresh(authenticationOptions) .AddLogout(); -... var app = builder.Build(); -... app .UseJwtAuthentication() .UseDefaultLoginMiddleware() .UseRefreshTokenMiddleware() .UseRefreshTokenLogoutMiddleware(); -... ``` ## 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,16 +459,14 @@ 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); -... 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`. 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/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/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 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.