From 5266d4a12815cbccb950574a7f26f54835291e87 Mon Sep 17 00:00:00 2001 From: Jezz Santos Date: Mon, 12 Feb 2024 11:15:20 +1300 Subject: [PATCH] Added SSO authentication with a FakeSSOAuthenticationProvider to provide an example. #4 --- .../0110-back-end-for-front-end.md | 16 +- docs/images/Authentication-SSO.png | Bin 119832 -> 122793 bytes docs/images/BEFFE-ReverseProxy.png | Bin 52269 -> 52196 bytes docs/images/Sources.pptx | Bin 740138 -> 738084 bytes src/ApiHost1/appsettings.json | 5 + src/Application.Interfaces/Audits.Designer.cs | 27 ++ src/Application.Interfaces/Audits.resx | 9 + src/Application.Resources.Shared/Identity.cs | 36 ++- .../IEndUsersService.cs | 11 +- src/Common/Extensions/EnumExtensions.cs | 2 +- .../Domain.Interfaces.csproj | 1 + .../Validations/CommonValidations.cs | 29 ++ src/Domain.Shared/Address.cs | 68 +++++ src/Domain.Shared/PhoneNumber.cs | 38 +++ src/Domain.Shared/Resources.Designer.cs | 18 ++ src/Domain.Shared/Resources.resx | 6 + src/Domain.Shared/Timezone.cs | 45 +++ .../EndUsersApplicationSpec.cs | 37 ++- .../EndUsersApplication.cs | 29 +- .../IEndUsersApplication.cs | 5 +- .../Persistence/IEndUserRepository.cs | 4 + .../EndUsersInProcessServiceClient.cs | 18 +- .../Persistence/EndUserRepository.cs | 34 +++ .../APIKeysApplicationSpec.cs | 4 +- .../AuthTokensApplicationSpec.cs | 7 +- .../PasswordCredentialsApplicationSpec.cs | 8 +- .../SSOProvidersServiceSpec.cs | 166 +++++++++++ .../SingleSignOnApplicationSpec.cs | 279 ++++++++++++++++++ src/IdentityApplication/APIKeysApplication.cs | 4 +- .../ISSOAuthenticationProvider.cs | 45 +++ .../ISSOProvidersService.cs | 16 + .../SSOProvidersService.cs | 130 ++++++++ .../AuthTokensApplication.cs | 17 +- .../IAuthTokensApplication.cs | 2 +- .../ISingleSignOnApplication.cs | 11 + .../PasswordCredentialsApplication.cs | 28 +- ...KeyRepository.cs => IAPIKeysRepository.cs} | 2 +- .../Persistence/ISSOUsersRepository.cs | 14 + .../Persistence/ReadModels/SSOUser.cs | 25 ++ src/IdentityApplication/Resources.Designer.cs | 18 ++ src/IdentityApplication/Resources.resx | 6 + .../SingleSignOnApplication.cs | 132 +++++++++ .../SSOAuthTokenSpec.cs | 30 ++ .../SSOUserRootSpec.cs | 62 ++++ src/IdentityDomain/Events.cs | 64 +++- src/IdentityDomain/SSOAuthToken.cs | 47 +++ src/IdentityDomain/SSOAuthTokenType.cs | 8 + src/IdentityDomain/SSOAuthTokens.cs | 26 ++ src/IdentityDomain/SSOUserRoot.cs | 131 ++++++++ .../AuthTokensApiSpec.cs | 26 +- .../PasswordCredentialsApiSpec.cs | 10 +- .../SingleSignOnApiSpec.cs | 149 ++++++++++ ...nticateSingleSignOnRequestValidatorSpec.cs | 30 +- .../FakeSSOAuthenticationProviderSpec.cs | 64 ++++ .../Api/AuthTokens/AuthTokensApi.cs | 25 +- ...uthenticateSingleSignOnRequestValidator.cs | 7 + .../PasswordCredentialsApi.cs | 6 +- .../Api/SSO/SingleSignOnApi.cs | 35 +++ .../ApplicationServices/FakeOAuth2Service.cs | 66 +++++ .../FakeSSOAuthenticationProvider.cs | 53 ++++ .../IdentityInfrastructure.csproj | 4 + src/IdentityInfrastructure/IdentityModule.cs | 23 +- ...IKeyRepository.cs => APIKeysRepository.cs} | 4 +- .../ReadModels/SSOUserProjection.cs | 53 ++++ .../Persistence/SSOUsersRepository.cs | 74 +++++ .../Resources.Designer.cs | 18 ++ src/IdentityInfrastructure/Resources.resx | 6 + .../AuthenticationConstants.cs | 2 +- .../OAuth2HttpServiceClient.cs | 70 +++++ src/Infrastructure.Shared/IOAuth2Service.cs | 41 +++ .../Infrastructure.Shared.csproj | 2 + .../ExchangeOAuth2CodeForTokensRequest.cs | 20 ++ .../ExchangeOAuth2CodeForTokensResponse.cs | 15 + .../Identities/AuthenticateResponse.cs | 11 +- .../AuthenticateSingleSignOnRequest.cs | 2 + .../Identities/RefreshTokenRequest.cs | 2 +- .../Identities/RefreshTokenResponse.cs | 9 +- .../Identities/RevokeRefreshTokenRequest.cs | 2 +- .../AuthN/AuthenticateRequestValidatorSpec.cs | 218 +++++++++----- .../Api/AuthN/AuthenticationApiSpec.cs | 29 +- .../AuthenticationApplicationSpec.cs | 89 ++++-- .../WebApiSpec.cs | 4 +- src/SaaStack.sln.DotSettings | 23 +- .../Api/AuthN/AuthenticateRequestValidator.cs | 37 ++- .../Api/AuthN/AuthenticationApi.cs | 8 +- .../Application/AuthenticationApplication.cs | 12 +- 86 files changed, 2704 insertions(+), 265 deletions(-) create mode 100644 src/Domain.Shared/Address.cs create mode 100644 src/Domain.Shared/PhoneNumber.cs create mode 100644 src/Domain.Shared/Timezone.cs create mode 100644 src/IdentityApplication.UnitTests/SSOProvidersServiceSpec.cs create mode 100644 src/IdentityApplication.UnitTests/SingleSignOnApplicationSpec.cs create mode 100644 src/IdentityApplication/ApplicationServices/ISSOAuthenticationProvider.cs create mode 100644 src/IdentityApplication/ApplicationServices/ISSOProvidersService.cs create mode 100644 src/IdentityApplication/ApplicationServices/SSOProvidersService.cs create mode 100644 src/IdentityApplication/ISingleSignOnApplication.cs rename src/IdentityApplication/Persistence/{IAPIKeyRepository.cs => IAPIKeysRepository.cs} (85%) create mode 100644 src/IdentityApplication/Persistence/ISSOUsersRepository.cs create mode 100644 src/IdentityApplication/Persistence/ReadModels/SSOUser.cs create mode 100644 src/IdentityApplication/SingleSignOnApplication.cs create mode 100644 src/IdentityDomain.UnitTests/SSOAuthTokenSpec.cs create mode 100644 src/IdentityDomain.UnitTests/SSOUserRootSpec.cs create mode 100644 src/IdentityDomain/SSOAuthToken.cs create mode 100644 src/IdentityDomain/SSOAuthTokenType.cs create mode 100644 src/IdentityDomain/SSOAuthTokens.cs create mode 100644 src/IdentityDomain/SSOUserRoot.cs create mode 100644 src/IdentityInfrastructure.IntegrationTests/SingleSignOnApiSpec.cs create mode 100644 src/IdentityInfrastructure.UnitTests/ApplicationServices/FakeSSOAuthenticationProviderSpec.cs create mode 100644 src/IdentityInfrastructure/Api/SSO/SingleSignOnApi.cs create mode 100644 src/IdentityInfrastructure/ApplicationServices/FakeOAuth2Service.cs create mode 100644 src/IdentityInfrastructure/ApplicationServices/FakeSSOAuthenticationProvider.cs rename src/IdentityInfrastructure/Persistence/{APIKeyRepository.cs => APIKeysRepository.cs} (94%) create mode 100644 src/IdentityInfrastructure/Persistence/ReadModels/SSOUserProjection.cs create mode 100644 src/IdentityInfrastructure/Persistence/SSOUsersRepository.cs create mode 100644 src/Infrastructure.Shared/ApplicationServices/OAuth2HttpServiceClient.cs create mode 100644 src/Infrastructure.Shared/IOAuth2Service.cs create mode 100644 src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensRequest.cs create mode 100644 src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensResponse.cs diff --git a/docs/design-principles/0110-back-end-for-front-end.md b/docs/design-principles/0110-back-end-for-front-end.md index b1bcf708..4d57c9a1 100644 --- a/docs/design-principles/0110-back-end-for-front-end.md +++ b/docs/design-principles/0110-back-end-for-front-end.md @@ -81,8 +81,6 @@ If the attempt to authenticate is successful, the authentication response from t These "auth tokens" are then added to [HTTPOnly, secure] cookies that are then returned to the browser to be used between the browser and BEFFE for subsequent requests/responses. -![Authentication](../images/Authentication-Credentials.png) - At some point in time, either of those auth tokens will expire, at which point either the `access_token` can be refreshed (using the `refresh_token`), or the `refresh_tokesn` expires, and the end user will need to re-authenticate again. #### Login @@ -99,20 +97,26 @@ For example, } ``` +![Credentials Authentication](../images/Authentication-Credentials.png) + or with a body containing an SSO authentication code, For example, ```json { - "AuthCode": "anauthocde", - "Provider": "sso" + "AuthCode": "anauthcode", + "Provider": "google" } ``` +> Note: The Backend API call to authenticate this "OAuth2 identity" will receive some tokens (from the 3rd party provider) that should include an email address \[claim\] that identifies the actual person to the system. However, some OAuth2 providers today do not include that email address claim in the returned tokens, and in those cases the parson cannot be identified. Instead, their email address can be included in the above request (as `Username`) which can be available in the first steps of the "OAuth Authorization Flow". + +![SSO Authentication](../images/Authentication-SSO.png) + > Note: you will also need to include CSRF protection in these requests, like all others coming from a JS app. -A successful response from this request will yield the following body, +A successful response from either of these requests will yield the following body, For example, @@ -122,7 +126,7 @@ For example, } ``` -But it will also include these cookies (for the current domain): +But, the response will also include these cookies (for the current domain): `auth-tok=anaccesstoken` diff --git a/docs/images/Authentication-SSO.png b/docs/images/Authentication-SSO.png index c153e375d216735e3b0973e2c5b189cc30b1e28b..82be792d66f996fc51a029153446ba75bbdcb25b 100644 GIT binary patch literal 122793 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 )|5c?C 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 z z$9o&iq$=l5TsKjyEznP6g$rY8f7p0}^3KkGe<)J|G}tOVFHV8dVjEzKtIG>p+UjrL zz5!g&+0h~By82%0&Gq2b^~XC;s2I|hs3EUFc_+t*qVkoO$zzP1c|HUc}WSOx-wR171Ng zpW7Q@q_~%icR-zR!M23=8%4Vn*lnCv@By;r5%al*KW4>^N=meU@@8m%Qsus288RW-Mx?y{(9e%UqR8eCZ&ZE|}Jr&vaW6&z*+8zJ3!7zOwZ% zJ<1H-N_CNG8qR(TByl@)jiknZz-&Gk-^bF_s4%(j?hFKHGV`F9kg8Oumfr3(>pr+D`77w?^+X5FOB;uZEHaN3J`ic=Jg6yQ=J%jA5n70(cbJFT%Ox$*eMWB*`* zK$~feG$9FUwdI>mDK}?NHmmCkXN?@Ho&Uic>u!e+Z2AFc)dJX4o_Tzoo*EiYaodiAY4b7 z+#}E^YPC%pgm!gh15mmCAf2&@*KSR6eFsQRtYr)vh_OXHfY<_9O#B8W8d_^T&PI&b zp{@V*rv`y45r2V}C)u{I-g&Q*NBL)+g(Wp)4cFw(0ad{K3l;{IAEA+vQLCT4oLp+? z-rnAIFb)p(5f1S82j|HP(I39Ko@u<74Muk)@ryNT<;J8#iGBUiiCSgBw;fmlFw8oL z5Ip?bg$ymIJwr`%KG5jZ!Zo%y{MZLMEww(vnhakEit=BX@uI&lTuT#pCSzWi~qvb0_s48eEwe|8p z{oN7wROo@})qM#y$NHU8VatwnRJN;xTBU$DFrU9gJ|_-OUp!f5>hU6wwg%y*@VP0` z+sMhu2?@1=qBojAOhhDzxJ_cQ6HtEEBf^1Lf=bwA+$C1?{NlfXQ#>q%86^Ju*cANk z+yFUgroBBNqo4>wShVJ*!}+ddl3Z^|BJ6%O|r&L%QYlU4pso~u~a=4sk^^?`(|5p=&S&IX2%K_B?f zd*??uAN{b^8Cm`03%DOWdIUg9u#KJ`^$0sZKSdY`DXH7$NG=G@uf)XKG{Nr|yJ0Fh zWe|M5+qGsQ>i>aSCzP_z^Z2po&01r2hTiWnF^uQEO7H`WVS^GZ?gWsc2U2ECB+D#TT>EveXZj>aNOa6Gf=5e0^v77q!JEmUD%YX2Q3sizjZS_HF zrUzzC@H(I!9y~C;7?OgpA-kY3JJF9AOUycSgMX&J(KX)0h4u??@PvAyKsWG&@|nS! zvNpC`RfyBx5^PbsXXZ+M5~Xua72;F;M(MM2P$c3_57K!OWsvqmwOFYhH(L9&)nMvu zzOvb)n)~~)R=Y2plXoW`&tLH$hf*vzHl=VozF%F;C^7W)qYeee+zE!=3w--KybeqQ>JY z=iQboruqw`)6FNo#*L#!lEYzMnB;tCXS(t_dCljn4(BTmK-00y%MNi2zeIyQx@!HW z7awivfB+5Cc|+HVQ4*~KF*^~;Y!jmlDWnvM|J6-Lt>)n%hGO7aG0h;!`rz}wfp*0R z!81KR#2CVHs9tV&eA&i!QFY1f+5y^iI*ODun-J`Uck0OKCj&iiaI>4ta92>IbSfi{K)n6&x}ZI+&ZQUoqUC@2() znst+fZk+o%bmIPd2|s+)fB#%41o4(n13^F({!U%z7eRgdRViQ<;*ob^RdB9^_?=P) se1-d;J1xrpzx<8!{J*?7-T+N|(HTn=2jr`>!-1dIqS7KoLOSpN4^sZacK`qY literal 119832 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 A^Z)<= diff --git a/docs/images/BEFFE-ReverseProxy.png b/docs/images/BEFFE-ReverseProxy.png index 844a0acccc4ef388d048849a6a8aaa53606e02cc..e76b4c8d9baf071a0c7b94833631a311351e4a78 100644 GIT binary patch literal 52196 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 VsRo%x!R|mVp1*u9=d8nn{|6fLxVQiS literal 52269 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 KCGWEBqyGUp;K!W+ diff --git a/docs/images/Sources.pptx b/docs/images/Sources.pptx index 9e7a652d1049ba9a2d64b8684ceb962a54c1ffe6..4728b56bc03604169f5a301261549dc8fe653d69 100644 GIT binary patch delta 57308 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

)sxuapW!cfYrM9Ol9QV`QIc2qdw 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 z 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 delta 59067 zcmV(>K-j;ehApa=Er7HE0kaCB&o1UsDF6WSd6&=^0T+KaE_iKh?0s8v<3^U|`$p`4 zVCZ3EW_Gfb_e<@#JAg!{+Y{}!*K)Ua_r*a`EQwPrQbV$;T%Mi(J|~d?2!c28A{J$% z9F`yw$OMpi?&o~xU;gyV`*H8%a5f)JCtux=Kj53*a59)aj3$p?-TduGkMvD%zUWUL z`s3+j_|<>S=i&V3Pk;RH|LtF%-^|AkJ-B)@f7Ac!=4r8besg;}A3P1;_ve3@J`X4G z-P`HxeSZOe&K_?cX8lhv>ih96#aQ0H?~f)o#r3l`*H7QR9Sw%rbnxN*aI%Pl%!cFs z0`7eNG;l-@|LUxh=jZPRswCe9RAS8<#(phy6Fdyq&!dzv0<>zkGEAFaLA+ zc^f_({<7!|;)jFfr-P^OHk>;{^1eRIMql0hhxarU&U5792yvWplsayZr%XGlyroS3XSkZkH-p(Qf7jnsdxprh zb$UM<%%=0{+r=LS)Az-Km-_~mi11?9gnRvujCh89rV+EkBPlb6I7<>_wU@>*sj$}n zS-b|g=kj;{6t~4w7mpv_L~rp6Ja1UiwY7g+zPOF6My2A!AWc}n-yEMSOY0_A7S7pAga*-mU{Bo>-W9~#xkAsK8+Sn zy}P^b!hCTdX7Q==XDIJIf1KSLl=E_be)q9I?s0adds7+fgwrWfSYRZ0nj-FdE5&>g7>ClvF1OEN43SB-x?Nt7_6U=_vj&Mi3{kAcAsckRmgbUb||dF(h$aen^V-@XN!t}ZU_#vL@CA6 zOKeAK=Mhyz%f&?}zD!$;0rWXQ#6Xm<2uH z0@q3QDd&lhCIz|f9U`eE$S6t?bJiLs2xo@9tXyXx&!asl6;V1Txg~$uGetlz){*Y1 zmPY7ON8V;phF2e!VoCbp;PIhYrT)Xe-SpnRANRkyi40lEV!-0ulXd-$yw6PD_uGhj z-DdyWU9{Q3B-~)L_g4O`Sm*}~)*H@dh3_N`koE`f+~ncd(aKv(zW=88=jnXW`v>xm zjj>+L_%Lg%tHnzt>RcHlwvJWDyT;|ksc+SbIlSfRraD5h!&s(6&46)LhGDu z)D#rTlv1p4eSr$2at-Eq*Vl0xM#p=;q-xQc>h~@1{o`i!aTYh{;*Z}v1n1-8bKn~- z*~J-eV>!hx&htDP6jU}EG(~@oFpNE}YesNoW6OoVh?mvAyeF$3P zheh0KYj&%Wl0~t=4HuX-98>TSRjQB*@%TIekvAcP6Z={ zoktkqrnJho(8)cBziKsOXl$dcN9x92U8UJ`FInzp1+d+<`*pzG*B_wGqU`GlB)fHp;8W!uhNA)hTrw<6_P%kEsWh74QbOQh zKsT3p+b9R;{!qzUIBluiuKRx3RcFLFFR6b(UZ)A-umKRfiv(0Xo=}!zVU&GAU&z*_ z+PB-VWrrLNsTmCC9T z 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 diff --git a/src/ApiHost1/appsettings.json b/src/ApiHost1/appsettings.json index aface782..b9cdf03f 100644 --- a/src/ApiHost1/appsettings.json +++ b/src/ApiHost1/appsettings.json @@ -23,6 +23,11 @@ "SenderProductName": "SaaStack", "SenderEmailAddress": "noreply@saastack.com", "SenderDisplayName": "Support" + }, + "SSOProvidersService": { + "SSOUserTokens": { + "AesSecret": "V7z5SZnhHRa7z68adsvazQjeIbSiWWcR+4KuAUikhe0=::u4ErEVotb170bM8qKWyT8A==" + } } }, "Hosts": { diff --git a/src/Application.Interfaces/Audits.Designer.cs b/src/Application.Interfaces/Audits.Designer.cs index 225054d9..dbfd696d 100644 --- a/src/Application.Interfaces/Audits.Designer.cs +++ b/src/Application.Interfaces/Audits.Designer.cs @@ -130,5 +130,32 @@ public static string PasswordCredentialsApplication_Authenticate_Succeeded { return ResourceManager.GetString("PasswordCredentialsApplication_Authenticate_Succeeded", resourceCulture); } } + + ///

+ /// Looks up a localized string similar to SingleSignOn.AutoRegistered. + /// + public static string SingleSignOnApplication_Authenticate_AccountOnboarded { + get { + return ResourceManager.GetString("SingleSignOnApplication_Authenticate_AccountOnboarded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication.Failed.AccountSuspended. + /// + public static string SingleSignOnApplication_Authenticate_AccountSuspended { + get { + return ResourceManager.GetString("SingleSignOnApplication_Authenticate_AccountSuspended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication.Passed. + /// + public static string SingleSignOnApplication_Authenticate_Succeeded { + get { + return ResourceManager.GetString("SingleSignOnApplication_Authenticate_Succeeded", resourceCulture); + } + } } } diff --git a/src/Application.Interfaces/Audits.resx b/src/Application.Interfaces/Audits.resx index 9ea57fe6..e7167c26 100644 --- a/src/Application.Interfaces/Audits.resx +++ b/src/Application.Interfaces/Audits.resx @@ -48,4 +48,13 @@ EndUser.PlatformRolesAssigned + + SingleSignOn.AutoRegistered + + + Authentication.Failed.AccountSuspended + + + Authentication.Passed + \ No newline at end of file diff --git a/src/Application.Resources.Shared/Identity.cs b/src/Application.Resources.Shared/Identity.cs index 0d64b32d..627f3ea5 100644 --- a/src/Application.Resources.Shared/Identity.cs +++ b/src/Application.Resources.Shared/Identity.cs @@ -4,15 +4,18 @@ namespace Application.Resources.Shared; public class AuthenticateTokens { - public required string AccessToken { get; set; } + public required AuthenticateToken AccessToken { get; set; } - public required DateTime AccessTokenExpiresOn { get; set; } + public required AuthenticateToken RefreshToken { get; set; } - public required string RefreshToken { get; set; } + public required string UserId { get; set; } +} - public required DateTime RefreshTokenExpiresOn { get; set; } +public class AuthenticateToken +{ + public required DateTime ExpiresOn { get; set; } - public required string UserId { get; set; } + public required string Value { get; set; } } public class APIKey : IIdentifiableResource @@ -26,4 +29,27 @@ public class APIKey : IIdentifiableResource public required string UserId { get; set; } public required string Id { get; set; } +} + +public class AuthToken +{ + public AuthToken(TokenType type, string value, DateTime? expiresOn) + { + Type = type; + Value = value; + ExpiresOn = expiresOn; + } + + public DateTime? ExpiresOn { get; } + + public TokenType Type { get; } + + public string Value { get; } +} + +public enum TokenType +{ + AccessToken = 1, + RefreshToken = 2, + IdToken = 3 } \ No newline at end of file diff --git a/src/Application.Services.Shared/IEndUsersService.cs b/src/Application.Services.Shared/IEndUsersService.cs index 3c3a4853..86ec2275 100644 --- a/src/Application.Services.Shared/IEndUsersService.cs +++ b/src/Application.Services.Shared/IEndUsersService.cs @@ -6,15 +6,18 @@ namespace Application.Services.Shared; public interface IEndUsersService { - Task> GetPersonAsync(ICallerContext caller, string id, CancellationToken cancellationToken); + Task, Error>> FindPersonByEmailAsync(ICallerContext caller, string emailAddress, + CancellationToken cancellationToken); - Task> GetMembershipsAsync(ICallerContext context, string id, + Task> GetMembershipsAsync(ICallerContext caller, string id, CancellationToken cancellationToken); - Task> RegisterMachineAsync(ICallerContext context, string name, string? timezone, + Task> GetPersonAsync(ICallerContext caller, string id, CancellationToken cancellationToken); + + Task> RegisterMachineAsync(ICallerContext caller, string name, string? timezone, string? countryCode, CancellationToken cancellationToken); Task> RegisterPersonAsync(ICallerContext caller, string emailAddress, - string firstName, string lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, + string firstName, string? lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/src/Common/Extensions/EnumExtensions.cs b/src/Common/Extensions/EnumExtensions.cs index f0cb892c..45fab797 100644 --- a/src/Common/Extensions/EnumExtensions.cs +++ b/src/Common/Extensions/EnumExtensions.cs @@ -24,7 +24,7 @@ public static TTargetEnum ToEnum(this TSourceEnum sour /// Converts the to an value of the , /// and in the case where no value can be found, uses the /// - public static TTargetEnum ToEnumOrDefault(this string value, TTargetEnum defaultValue) + public static TTargetEnum ToEnumOrDefault(this string? value, TTargetEnum defaultValue) { if (value.HasNoValue()) { diff --git a/src/Domain.Interfaces/Domain.Interfaces.csproj b/src/Domain.Interfaces/Domain.Interfaces.csproj index 5be2f664..7379efbe 100644 --- a/src/Domain.Interfaces/Domain.Interfaces.csproj +++ b/src/Domain.Interfaces/Domain.Interfaces.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Domain.Interfaces/Validations/CommonValidations.cs b/src/Domain.Interfaces/Validations/CommonValidations.cs index 23f1dc15..039dfd1d 100644 --- a/src/Domain.Interfaces/Validations/CommonValidations.cs +++ b/src/Domain.Interfaces/Validations/CommonValidations.cs @@ -1,5 +1,6 @@ using Common; using Common.Extensions; +using PhoneNumbers; namespace Domain.Interfaces.Validations; @@ -14,6 +15,34 @@ public static class CommonValidations public static readonly Validation FeatureLevel = new(@"^[\w\d]{4,30}$", 4, 30); public static readonly Validation Identifier = new(@"^[\w]{1,20}_[\d\w]{10,22}$", 12, 43); public static readonly Validation IdentifierPrefix = new(@"^[^\W_]*$", 1, 20); + + /// + /// Validations for International + /// + public static readonly Validation PhoneNumber = new(value => + { + if (!value.HasValue()) + { + return false; + } + + if (!value.StartsWith("+")) + { + return false; + } + + var util = PhoneNumberUtil.GetInstance(); + try + { + var number = util.Parse(value, null); + return util.IsValidNumber(number); + } + catch (NumberParseException) + { + return false; + } + }); + public static readonly Validation RoleLevel = new(@"^[\w\d]{4,30}$", 4, 30); public static readonly Validation Timezone = new(Timezones.Exists); public static readonly Validation Url = new(s => Uri.IsWellFormedUriString(s, UriKind.Absolute)); diff --git a/src/Domain.Shared/Address.cs b/src/Domain.Shared/Address.cs new file mode 100644 index 00000000..0d914579 --- /dev/null +++ b/src/Domain.Shared/Address.cs @@ -0,0 +1,68 @@ +using Common; +using Domain.Common.ValueObjects; +using Domain.Interfaces; + +namespace Domain.Shared; + +public sealed class Address : ValueObjectBase
+{ + public static readonly Address Default = Create(CountryCodes.Default).Value; + + public static Result Create(string line1, string line2, string line3, string city, string state, + CountryCodeIso3166 countryCode, string zip) + { + return new Address(line1, line2, line3, city, state, countryCode, zip); + } + + public static Result Create(CountryCodeIso3166 countryCode) + { + return new Address(countryCode); + } + + private Address(CountryCodeIso3166 countryCode) : this(string.Empty, string.Empty, string.Empty, + string.Empty, string.Empty, countryCode, string.Empty) + { + } + + private Address(string? line1, string? line2, string? line3, string? city, string? state, + CountryCodeIso3166 countryCode, string? zip) + { + Line1 = line1; + Line2 = line2; + Line3 = line3; + City = city; + State = state; + CountryCode = countryCode; + Zip = zip; + } + + public string? City { get; } + + public CountryCodeIso3166 CountryCode { get; } + + public string? Line1 { get; } + + public string? Line2 { get; } + + public string? Line3 { get; } + + public string? State { get; } + + public string? Zip { get; } + + public static ValueObjectFactory
Rehydrate() + { + return (property, _) => + { + var parts = RehydrateToList(property, false); + return new Address(parts[0], parts[1], parts[2], parts[3], parts[4], + CountryCodes.FindOrDefault(parts[5]), + parts[6]); + }; + } + + protected override IEnumerable GetAtomicValues() + { + return new object?[] { Line1, Line2, Line3, City, State, CountryCode.Alpha3, Zip }; + } +} \ No newline at end of file diff --git a/src/Domain.Shared/PhoneNumber.cs b/src/Domain.Shared/PhoneNumber.cs new file mode 100644 index 00000000..39fa9a3d --- /dev/null +++ b/src/Domain.Shared/PhoneNumber.cs @@ -0,0 +1,38 @@ +using Common; +using Common.Extensions; +using Domain.Common.Extensions; +using Domain.Common.ValueObjects; +using Domain.Interfaces; +using Domain.Interfaces.Validations; + +namespace Domain.Shared; + +public sealed class PhoneNumber : SingleValueObjectBase +{ + public static Result Create(string phoneNumber) + { + if (phoneNumber.IsNotValuedParameter(nameof(phoneNumber), out var error1)) + { + return error1; + } + + if (phoneNumber.IsInvalidParameter(CommonValidations.PhoneNumber, nameof(phoneNumber), + Resources.PhoneNumber_InvalidPhoneNumber, out var error2)) + { + return error2; + } + + return new PhoneNumber(phoneNumber); + } + + private PhoneNumber(string phoneNumber) : base(phoneNumber) + { + } + + public string Number => Value; + + public static ValueObjectFactory Rehydrate() + { + return (property, _) => new PhoneNumber(property); + } +} \ No newline at end of file diff --git a/src/Domain.Shared/Resources.Designer.cs b/src/Domain.Shared/Resources.Designer.cs index 4244e0e5..1ffaea96 100644 --- a/src/Domain.Shared/Resources.Designer.cs +++ b/src/Domain.Shared/Resources.Designer.cs @@ -86,6 +86,15 @@ internal static string Features_InvalidFeature { } } + /// + /// Looks up a localized string similar to The PhoneNumber value is not a valid international phone number. + /// + internal static string PhoneNumber_InvalidPhoneNumber { + get { + return ResourceManager.GetString("PhoneNumber_InvalidPhoneNumber", resourceCulture); + } + } + /// /// Looks up a localized string similar to The Role value is invalid. /// @@ -94,5 +103,14 @@ internal static string Roles_InvalidRole { return ResourceManager.GetString("Roles_InvalidRole", resourceCulture); } } + + /// + /// Looks up a localized string similar to The Timezone value is invalid. + /// + internal static string Timezone_InvalidTimezone { + get { + return ResourceManager.GetString("Timezone_InvalidTimezone", resourceCulture); + } + } } } diff --git a/src/Domain.Shared/Resources.resx b/src/Domain.Shared/Resources.resx index 3ba331dc..45d7e04c 100644 --- a/src/Domain.Shared/Resources.resx +++ b/src/Domain.Shared/Resources.resx @@ -36,4 +36,10 @@ The Feature value is invalid + + The Timezone value is invalid + + + The PhoneNumber value is not a valid international phone number + \ No newline at end of file diff --git a/src/Domain.Shared/Timezone.cs b/src/Domain.Shared/Timezone.cs new file mode 100644 index 00000000..25f98479 --- /dev/null +++ b/src/Domain.Shared/Timezone.cs @@ -0,0 +1,45 @@ +using Common; +using Common.Extensions; +using Domain.Common.Extensions; +using Domain.Common.ValueObjects; +using Domain.Interfaces; +using Domain.Interfaces.Validations; + +namespace Domain.Shared; + +public sealed class Timezone : SingleValueObjectBase +{ + public static readonly Timezone Default = Create(Timezones.Default).Value; + + public static Result Create(string timezone) + { + if (timezone.IsNotValuedParameter(nameof(timezone), out var error1)) + { + return error1; + } + + if (timezone.IsInvalidParameter(CommonValidations.Timezone, nameof(timezone), + Resources.Timezone_InvalidTimezone, out var error2)) + { + return error2; + } + + return new Timezone(Timezones.FindOrDefault(timezone)); + } + + public static Result Create(TimezoneIANA timezone) + { + return new Timezone(timezone); + } + + private Timezone(TimezoneIANA timezone) : base(timezone) + { + } + + public TimezoneIANA Code => Value; + + public static ValueObjectFactory Rehydrate() + { + return (property, _) => new Timezone(Timezones.FindOrDefault(property)); + } +} \ No newline at end of file diff --git a/src/EndUsersApplication.UnitTests/EndUsersApplicationSpec.cs b/src/EndUsersApplication.UnitTests/EndUsersApplicationSpec.cs index e509de31..cc429d87 100644 --- a/src/EndUsersApplication.UnitTests/EndUsersApplicationSpec.cs +++ b/src/EndUsersApplication.UnitTests/EndUsersApplicationSpec.cs @@ -48,7 +48,7 @@ public async Task WhenGetPersonAndUnregistered_ThenReturnsUser() { var user = EndUserRoot.Create(_recorder.Object, _idFactory.Object, UserClassification.Person).Value; _repository.Setup(rep => rep.LoadAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult>(user)); + .ReturnsAsync(user); var result = await _application.GetPersonAsync(_caller.Object, "anid", CancellationToken.None); @@ -156,11 +156,11 @@ public async Task WhenAssignPlatformRolesAsync_ThenAssigns() assignee.Register(Roles.Create(PlatformRoles.Standard).Value, Features.Create(PlatformFeatures.Basic).Value, Optional.None); _repository.Setup(rep => rep.LoadAsync("anassigneeid".ToId(), It.IsAny())) - .Returns(Task.FromResult>(assignee)); + .ReturnsAsync(assignee); var assigner = EndUserRoot.Create(_recorder.Object, _idFactory.Object, UserClassification.Person).Value; assigner.Register(Roles.Create(PlatformRoles.Operations).Value, Features.Create(), Optional.None); _repository.Setup(rep => rep.LoadAsync("anassignerid".ToId(), It.IsAny())) - .Returns(Task.FromResult>(assigner)); + .ReturnsAsync(assigner); var result = await _application.AssignPlatformRolesAsync(_caller.Object, "anassigneeid", new List { PlatformRoles.TestingOnly.Name }, @@ -183,13 +183,13 @@ public async Task WhenAssignTenantRolesAsync_ThenAssigns() assignee.AddMembership("anorganizationid".ToId(), Roles.Create(TenantRoles.Member).Value, Features.Create(TenantFeatures.Basic).Value); _repository.Setup(rep => rep.LoadAsync("anassigneeid".ToId(), It.IsAny())) - .Returns(Task.FromResult>(assignee)); + .ReturnsAsync(assignee); var assigner = EndUserRoot.Create(_recorder.Object, _idFactory.Object, UserClassification.Person).Value; assigner.Register(Roles.Create(PlatformRoles.Operations).Value, Features.Create(), Optional.None); assigner.AddMembership("anorganizationid".ToId(), Roles.Create(TenantRoles.Owner).Value, Features.Create(TenantFeatures.Basic).Value); _repository.Setup(rep => rep.LoadAsync("anassignerid".ToId(), It.IsAny())) - .Returns(Task.FromResult>(assigner)); + .ReturnsAsync(assigner); var result = await _application.AssignTenantRolesAsync(_caller.Object, "anorganizationid", "anassigneeid", new List { TenantRoles.TestingOnly.Name }, @@ -201,4 +201,31 @@ public async Task WhenAssignTenantRolesAsync_ThenAssigns() .ContainInOrder(TenantRoles.Member.Name, TenantRoles.TestingOnly.Name); } #endif + + [Fact] + public async Task WhenFindPersonByEmailAsyncAndNotExists_ThenReturnsNone() + { + _repository.Setup(rep => rep.FindByEmailAddressAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Optional.None()); + + var result = + await _application.FindPersonByEmailAsync(_caller.Object, "auser@company.com", CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Should().BeNone(); + } + + [Fact] + public async Task WhenFindPersonByEmailAsyncAndExists_ThenReturns() + { + var endUser = EndUserRoot.Create(_recorder.Object, _idFactory.Object, UserClassification.Person).Value; + _repository.Setup(rep => rep.FindByEmailAddressAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(endUser.ToOptional()); + + var result = + await _application.FindPersonByEmailAsync(_caller.Object, "auser@company.com", CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Value.Id.Should().Be("anid"); + } } \ No newline at end of file diff --git a/src/EndUsersApplication/EndUsersApplication.cs b/src/EndUsersApplication/EndUsersApplication.cs index 6e25eed0..259f243c 100644 --- a/src/EndUsersApplication/EndUsersApplication.cs +++ b/src/EndUsersApplication/EndUsersApplication.cs @@ -110,7 +110,7 @@ public async Task> RegisterMachineAsync(ICaller } public async Task> RegisterPersonAsync(ICallerContext context, string emailAddress, - string firstName, string lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, + string firstName, string? lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, CancellationToken cancellationToken) { if (!termsAndConditionsAccepted) @@ -169,6 +169,33 @@ public async Task> RegisterPersonAsync(ICallerC CountryCodes.FindOrDefault(countryCode)); } + public async Task, Error>> FindPersonByEmailAsync(ICallerContext context, + string emailAddress, CancellationToken cancellationToken) + { + //TODO: find the profile of this person by email address from the profilesService + //And then, if not, lookup a endUser that has the email address as an invited guest + + var match = EmailAddress.Create(emailAddress); + if (!match.IsSuccessful) + { + return match.Error; + } + + var retrieved = await _repository.FindByEmailAddressAsync(match.Value, cancellationToken); + if (!retrieved.IsSuccessful) + { + return retrieved.Error; + } + + if (retrieved.Value.HasValue) + { + var endUser = retrieved.Value.Value; + return endUser.ToUser().ToOptional(); + } + + return Optional.None; + } + public async Task> AssignPlatformRolesAsync(ICallerContext context, string id, List roles, CancellationToken cancellationToken) { diff --git a/src/EndUsersApplication/IEndUsersApplication.cs b/src/EndUsersApplication/IEndUsersApplication.cs index fc1bf4b6..dbbe4fb2 100644 --- a/src/EndUsersApplication/IEndUsersApplication.cs +++ b/src/EndUsersApplication/IEndUsersApplication.cs @@ -22,6 +22,9 @@ Task> RegisterMachineAsync(ICallerContext conte string? countryCode, CancellationToken cancellationToken); Task> RegisterPersonAsync(ICallerContext context, string emailAddress, - string firstName, string lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, + string firstName, string? lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, + CancellationToken cancellationToken); + + Task, Error>> FindPersonByEmailAsync(ICallerContext context, string emailAddress, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/src/EndUsersApplication/Persistence/IEndUserRepository.cs b/src/EndUsersApplication/Persistence/IEndUserRepository.cs index ce90ff52..58b8fe6f 100644 --- a/src/EndUsersApplication/Persistence/IEndUserRepository.cs +++ b/src/EndUsersApplication/Persistence/IEndUserRepository.cs @@ -1,6 +1,7 @@ using Application.Persistence.Interfaces; using Common; using Domain.Common.ValueObjects; +using Domain.Shared; using EndUsersDomain; namespace EndUsersApplication.Persistence; @@ -10,4 +11,7 @@ public interface IEndUserRepository : IApplicationRepository Task> LoadAsync(Identifier id, CancellationToken cancellationToken); Task> SaveAsync(EndUserRoot endUser, CancellationToken cancellationToken); + + Task, Error>> FindByEmailAddressAsync(EmailAddress emailAddress, + CancellationToken cancellationToken); } \ No newline at end of file diff --git a/src/EndUsersInfrastructure/ApplicationServices/EndUsersInProcessServiceClient.cs b/src/EndUsersInfrastructure/ApplicationServices/EndUsersInProcessServiceClient.cs index 90f70118..cb35928f 100644 --- a/src/EndUsersInfrastructure/ApplicationServices/EndUsersInProcessServiceClient.cs +++ b/src/EndUsersInfrastructure/ApplicationServices/EndUsersInProcessServiceClient.cs @@ -25,24 +25,30 @@ public async Task> GetPersonAsync(ICallerContext caller, return await _endUsersApplication.GetPersonAsync(caller, id, cancellationToken); } - public async Task> GetMembershipsAsync(ICallerContext context, string id, + public async Task, Error>> FindPersonByEmailAsync(ICallerContext caller, + string emailAddress, CancellationToken cancellationToken) + { + return await _endUsersApplication.FindPersonByEmailAsync(caller, emailAddress, cancellationToken); + } + + public async Task> GetMembershipsAsync(ICallerContext caller, string id, CancellationToken cancellationToken) { - return await _endUsersApplication.GetMembershipsAsync(context, id, cancellationToken); + return await _endUsersApplication.GetMembershipsAsync(caller, id, cancellationToken); } public async Task> RegisterPersonAsync(ICallerContext caller, string emailAddress, - string firstName, string lastName, - string? timezone, string? countryCode, bool termsAndConditionsAccepted, CancellationToken cancellationToken) + string firstName, string? lastName, string? timezone, string? countryCode, bool termsAndConditionsAccepted, + CancellationToken cancellationToken) { return await _endUsersApplication.RegisterPersonAsync(caller, emailAddress, firstName, lastName, timezone, countryCode, termsAndConditionsAccepted, cancellationToken); } - public async Task> RegisterMachineAsync(ICallerContext context, string name, + public async Task> RegisterMachineAsync(ICallerContext caller, string name, string? timezone, string? countryCode, CancellationToken cancellationToken) { - return await _endUsersApplication.RegisterMachineAsync(context, name, timezone, countryCode, cancellationToken); + return await _endUsersApplication.RegisterMachineAsync(caller, name, timezone, countryCode, cancellationToken); } } \ No newline at end of file diff --git a/src/EndUsersInfrastructure/Persistence/EndUserRepository.cs b/src/EndUsersInfrastructure/Persistence/EndUserRepository.cs index 80f4a65c..55efedbc 100644 --- a/src/EndUsersInfrastructure/Persistence/EndUserRepository.cs +++ b/src/EndUsersInfrastructure/Persistence/EndUserRepository.cs @@ -3,11 +3,13 @@ using Common.Extensions; using Domain.Common.ValueObjects; using Domain.Interfaces; +using Domain.Shared; using EndUsersApplication.Persistence; using EndUsersApplication.Persistence.ReadModels; using EndUsersDomain; using Infrastructure.Persistence.Common; using Infrastructure.Persistence.Interfaces; +using QueryAny; namespace EndUsersInfrastructure.Persistence; @@ -47,4 +49,36 @@ public async Task> SaveAsync(EndUserRoot endUser, Can return endUser; } + + public async Task, Error>> FindByEmailAddressAsync(EmailAddress emailAddress, + CancellationToken cancellationToken) + { + var query = Query.From() + .Where(at => at.Username, ConditionOperator.EqualTo, emailAddress.Address); + return await FindFirstByQueryAsync(query, cancellationToken); + } + + private async Task, Error>> FindFirstByQueryAsync(QueryClause query, + CancellationToken cancellationToken) + { + var queried = await _userQueries.QueryAsync(query, false, cancellationToken); + if (!queried.IsSuccessful) + { + return queried.Error; + } + + var matching = queried.Value.Results.FirstOrDefault(); + if (matching.NotExists()) + { + return Optional.None; + } + + var users = await _users.LoadAsync(matching.Id.Value.ToId(), cancellationToken); + if (!users.IsSuccessful) + { + return users.Error; + } + + return users.Value.ToOptional(); + } } \ No newline at end of file diff --git a/src/IdentityApplication.UnitTests/APIKeysApplicationSpec.cs b/src/IdentityApplication.UnitTests/APIKeysApplicationSpec.cs index 28e23eb4..49b2518b 100644 --- a/src/IdentityApplication.UnitTests/APIKeysApplicationSpec.cs +++ b/src/IdentityApplication.UnitTests/APIKeysApplicationSpec.cs @@ -28,7 +28,7 @@ public class APIKeysApplicationSpec private readonly Mock _endUsersService; private readonly Mock _idFactory; private readonly Mock _recorder; - private readonly Mock _repository; + private readonly Mock _repository; private readonly Mock _tokensService; public APIKeysApplicationSpec() @@ -61,7 +61,7 @@ public APIKeysApplicationSpec() _apiKeyHasherService.Setup(khs => khs.ValidateAPIKeyHash(It.IsAny())) .Returns(true); _endUsersService = new Mock(); - _repository = new Mock(); + _repository = new Mock(); _repository.Setup(rep => rep.SaveAsync(It.IsAny(), It.IsAny())) .Returns((APIKeyRoot root, CancellationToken _) => Task.FromResult>(root)); diff --git a/src/IdentityApplication.UnitTests/AuthTokensApplicationSpec.cs b/src/IdentityApplication.UnitTests/AuthTokensApplicationSpec.cs index b502cc1a..3f8ccf9c 100644 --- a/src/IdentityApplication.UnitTests/AuthTokensApplicationSpec.cs +++ b/src/IdentityApplication.UnitTests/AuthTokensApplicationSpec.cs @@ -141,9 +141,10 @@ public async Task WhenRefreshTokenAsyncAndTokensExist_ThenReturnsRefreshedTokens var result = await _application.RefreshTokenAsync(_caller.Object, "arefreshtoken1", CancellationToken.None); - result.Value.AccessToken.Should().Be("anaccesstoken2"); - result.Value.RefreshToken.Should().Be("arefreshtoken2"); - result.Value.AccessTokenExpiresOn.Should().Be(expiresOn2); + result.Value.AccessToken.Value.Should().Be("anaccesstoken2"); + result.Value.AccessToken.ExpiresOn.Should().Be(expiresOn2); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken2"); + result.Value.RefreshToken.ExpiresOn.Should().Be(expiresOn2); _jwtTokensService.Verify(jts => jts.IssueTokensAsync(user)); _repository.Verify(rep => rep.SaveAsync(It.Is(at => at.Id == "anid" diff --git a/src/IdentityApplication.UnitTests/PasswordCredentialsApplicationSpec.cs b/src/IdentityApplication.UnitTests/PasswordCredentialsApplicationSpec.cs index 5f490c49..b0ad59c0 100644 --- a/src/IdentityApplication.UnitTests/PasswordCredentialsApplicationSpec.cs +++ b/src/IdentityApplication.UnitTests/PasswordCredentialsApplicationSpec.cs @@ -266,10 +266,10 @@ public async Task WhenAuthenticateAsyncWithCorrectPassword_ThenReturnsError() await _application.AuthenticateAsync(_caller.Object, "ausername", "apassword", CancellationToken.None); result.Should().BeSuccess(); - result.Value.AccessToken.Should().Be("anaccesstoken"); - result.Value.RefreshToken.Should().Be("arefreshtoken"); - result.Value.AccessTokenExpiresOn.Should().Be(expiresOn); - result.Value.RefreshTokenExpiresOn.Should().Be(expiresOn); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(expiresOn); + result.Value.RefreshToken.ExpiresOn.Should().Be(expiresOn); _repository.Verify(rep => rep.SaveAsync(It.IsAny(), It.IsAny())); _recorder.Verify(rec => rec.AuditAgainst(It.IsAny(), "auserid", Audits.PasswordCredentialsApplication_Authenticate_Succeeded, It.IsAny(), diff --git a/src/IdentityApplication.UnitTests/SSOProvidersServiceSpec.cs b/src/IdentityApplication.UnitTests/SSOProvidersServiceSpec.cs new file mode 100644 index 00000000..6596a63e --- /dev/null +++ b/src/IdentityApplication.UnitTests/SSOProvidersServiceSpec.cs @@ -0,0 +1,166 @@ +using Application.Interfaces; +using Application.Resources.Shared; +using Common; +using Common.Extensions; +using Domain.Common.Identity; +using Domain.Common.ValueObjects; +using Domain.Interfaces.Entities; +using Domain.Services.Shared.DomainServices; +using Domain.Shared; +using FluentAssertions; +using IdentityApplication.ApplicationServices; +using IdentityApplication.Persistence; +using IdentityDomain; +using JetBrains.Annotations; +using Moq; +using UnitTesting.Common; +using Xunit; + +namespace IdentityApplication.UnitTests; + +[UsedImplicitly] +public class SSOProvidersServiceSpec +{ + [Trait("Category", "Unit")] + public class GivenNoAuthProviders + { + private readonly SSOProvidersService _service; + + public GivenNoAuthProviders() + { + var recorder = new Mock(); + var idFactory = new Mock(); + var repository = new Mock(); + var encryptionService = new Mock(); + encryptionService.Setup(es => es.Encrypt(It.IsAny())) + .Returns((string value) => value); + encryptionService.Setup(es => es.Decrypt(It.IsAny())) + .Returns((string value) => value); + + _service = new SSOProvidersService(recorder.Object, idFactory.Object, encryptionService.Object, + new List(), + repository.Object); + } + + [Fact] + public async Task WhenFindByNameAsyncAndNotRegistered_ThenReturnsNone() + { + var result = await _service.FindByNameAsync("aname", CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Should().BeNone(); + } + + [Fact] + public async Task WhenSaveUserInfoAsyncAndProviderNotRegistered_ThenReturnsError() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, CountryCodes.Default); + + var result = + await _service.SaveUserInfoAsync("aprovidername", "auserid".ToId(), userInfo, CancellationToken.None); + + result.Should().BeError(ErrorCode.EntityNotFound, + Resources.SSOProvidersService_UnknownProvider.Format("aprovidername")); + } + } + + [Trait("Category", "Unit")] + public class GivenAuthProviders + { + private readonly Mock _repository; + private readonly SSOProvidersService _service; + + public GivenAuthProviders() + { + var recorder = new Mock(); + var idFactory = new Mock(); + idFactory.Setup(idf => idf.Create(It.IsAny())) + .Returns("anid".ToId()); + _repository = new Mock(); + var encryptionService = new Mock(); + encryptionService.Setup(es => es.Encrypt(It.IsAny())) + .Returns((string value) => value); + encryptionService.Setup(es => es.Decrypt(It.IsAny())) + .Returns((string value) => value); + + _service = new SSOProvidersService(recorder.Object, idFactory.Object, encryptionService.Object, + new List + { + new TestSSOAuthenticationProvider() + }, + _repository.Object); + } + + [Fact] + public async Task WhenFindByNameAsyncAndNotRegistered_ThenReturnsNone() + { + var result = await _service.FindByNameAsync("aname", CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Should().BeNone(); + } + + [Fact] + public async Task WhenFindByNameAsyncRegistered_ThenReturnsProvider() + { + var result = await _service.FindByNameAsync(TestSSOAuthenticationProvider.Name, CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Value.Should().BeOfType(); + } + + [Fact] + public async Task WhenSaveUserInfoAsyncAndProviderNotRegistered_ThenReturnsError() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, CountryCodes.Default); + + var result = + await _service.SaveUserInfoAsync("aprovidername", "auserid".ToId(), userInfo, CancellationToken.None); + + result.Should().BeError(ErrorCode.EntityNotFound, + Resources.SSOProvidersService_UnknownProvider.Format("aprovidername")); + } + + [Fact] + public async Task WhenSaveUserInfoAsyncAndUserNotExists_ThenCreatesAndSavesDetails() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, CountryCodes.Default); + _repository.Setup(rep => + rep.FindUserInfoByUserIdAsync(It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(Optional.None); + + var result = + await _service.SaveUserInfoAsync(TestSSOAuthenticationProvider.Name, "auserid".ToId(), userInfo, + CancellationToken.None); + + result.Should().BeSuccess(); + _repository.Verify(rep => rep.SaveAsync(It.Is(user => + user.Id == "anid" + && user.UserId == "auserid" + && user.EmailAddress.Value.Address == "auser@company.com" + && user.Name.Value.FirstName == "afirstname" + && user.Name.Value.LastName == Optional.None + && user.Timezone.Value == Timezones.Default + && user.Address.Value.CountryCode == CountryCodes.Default + ), It.IsAny())); + } + } +} + +public class TestSSOAuthenticationProvider : ISSOAuthenticationProvider +{ + public const string Name = "atestprovider"; + + public Task> AuthenticateAsync(ICallerContext context, string authCode, + string? emailAddress, + CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + + public string ProviderName => Name; +} \ No newline at end of file diff --git a/src/IdentityApplication.UnitTests/SingleSignOnApplicationSpec.cs b/src/IdentityApplication.UnitTests/SingleSignOnApplicationSpec.cs new file mode 100644 index 00000000..1e25fea4 --- /dev/null +++ b/src/IdentityApplication.UnitTests/SingleSignOnApplicationSpec.cs @@ -0,0 +1,279 @@ +using Application.Interfaces; +using Application.Resources.Shared; +using Application.Services.Shared; +using Common; +using Domain.Common.ValueObjects; +using FluentAssertions; +using IdentityApplication.ApplicationServices; +using Moq; +using UnitTesting.Common; +using Xunit; + +namespace IdentityApplication.UnitTests; + +[Trait("Category", "Unit")] +public class SingleSignOnApplicationSpec +{ + private readonly SingleSignOnApplication _application; + private readonly Mock _authTokensService; + private readonly Mock _caller; + private readonly Mock _endUsersService; + private readonly Mock _ssoProvider; + private readonly Mock _ssoProvidersService; + + public SingleSignOnApplicationSpec() + { + var recorder = new Mock(); + _caller = new Mock(); + _endUsersService = new Mock(); + _ssoProvider = new Mock(); + _ssoProvidersService = new Mock(); + _ssoProvidersService.Setup(sps => sps.FindByNameAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(_ssoProvider.Object.ToOptional()); + _authTokensService = new Mock(); + + _application = new SingleSignOnApplication(recorder.Object, _endUsersService.Object, + _ssoProvidersService.Object, + _authTokensService.Object); + } + + [Fact] + public async Task WhenAuthenticateAndNoProvider_ThenReturnsError() + { + _ssoProvidersService.Setup(sp => sp.FindByNameAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(Optional.None); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeError(ErrorCode.NotAuthenticated); + _endUsersService.Verify( + eus => eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + } + + [Fact] + public async Task WhenAuthenticateAndProviderErrors_ThenReturnsError() + { + _ssoProvider.Setup(sp => + sp.AuthenticateAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(Error.Unexpected("amessage")); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeError(ErrorCode.Unexpected, "amessage"); + _endUsersService.Verify( + eus => eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + } + + [Fact] + public async Task WhenAuthenticateAndPersonExistsButNotRegisteredYet_ThenIssuesToken() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, + CountryCodes.Default); + _ssoProvider.Setup(sp => + sp.AuthenticateAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(userInfo); + var endUser = new EndUser + { + Id = "anexistinguserid" + }; + _endUsersService.Setup(eus => + eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(endUser.ToOptional()); + _endUsersService.Setup(eus => + eus.GetMembershipsAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new EndUserWithMemberships + { + Id = "amembershipsuserid", + Status = EndUserStatus.Unregistered, + Access = EndUserAccess.Enabled + }); + var expiresOn = DateTime.UtcNow; + _authTokensService.Setup(ats => ats.IssueTokensAsync(It.IsAny(), + It.IsAny(), It.IsAny())) + .ReturnsAsync(new AccessTokens("anaccesstoken", expiresOn, "arefreshtoken", expiresOn)); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeError(ErrorCode.NotAuthenticated); + _endUsersService.Verify(eus => + eus.FindPersonByEmailAsync(_caller.Object, "auser@company.com", It.IsAny())); + _endUsersService.Verify(eus => eus.RegisterPersonAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _ssoProvidersService.Verify( + sps => sps.SaveUserInfoAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + _endUsersService.Verify(eus => + eus.GetMembershipsAsync(_caller.Object, "anexistinguserid", It.IsAny())); + _authTokensService.Verify( + ats => ats.IssueTokensAsync(It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + } + + [Fact] + public async Task WhenAuthenticateAndPersonExistsButSuspended_ThenIssuesToken() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, + CountryCodes.Default); + _ssoProvider.Setup(sp => + sp.AuthenticateAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(userInfo); + var endUser = new EndUser + { + Id = "anexistinguserid" + }; + _endUsersService.Setup(eus => + eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(endUser.ToOptional()); + _endUsersService.Setup(eus => + eus.GetMembershipsAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new EndUserWithMemberships + { + Id = "amembershipsuserid", + Status = EndUserStatus.Registered, + Access = EndUserAccess.Suspended + }); + var expiresOn = DateTime.UtcNow; + _authTokensService.Setup(ats => ats.IssueTokensAsync(It.IsAny(), + It.IsAny(), It.IsAny())) + .ReturnsAsync(new AccessTokens("anaccesstoken", expiresOn, "arefreshtoken", expiresOn)); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeError(ErrorCode.EntityExists, Resources.SingleSignOnApplication_AccountSuspended); + _endUsersService.Verify(eus => + eus.FindPersonByEmailAsync(_caller.Object, "auser@company.com", It.IsAny())); + _endUsersService.Verify(eus => eus.RegisterPersonAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _ssoProvidersService.Verify( + sps => sps.SaveUserInfoAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + _endUsersService.Verify(eus => + eus.GetMembershipsAsync(_caller.Object, "anexistinguserid", It.IsAny())); + _authTokensService.Verify( + ats => ats.IssueTokensAsync(It.IsAny(), It.IsAny(), + It.IsAny()), Times.Never); + } + + [Fact] + public async Task WhenAuthenticateAndPersonNotExists_ThenRegistersPersonAndIssuesToken() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, + CountryCodes.Default); + _ssoProvider.Setup(sp => + sp.AuthenticateAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(userInfo); + _endUsersService.Setup(eus => + eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(Optional.None()); + _endUsersService.Setup(eus => eus.RegisterPersonAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(new RegisteredEndUser + { + Id = "aregistereduserid" + }); + _endUsersService.Setup(eus => + eus.GetMembershipsAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new EndUserWithMemberships + { + Id = "amembershipsuserid", + Status = EndUserStatus.Registered, + Access = EndUserAccess.Enabled + }); + var expiresOn = DateTime.UtcNow; + _authTokensService.Setup(ats => ats.IssueTokensAsync(It.IsAny(), + It.IsAny(), It.IsAny())) + .ReturnsAsync(new AccessTokens("anaccesstoken", expiresOn, "arefreshtoken", expiresOn)); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(expiresOn); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.RefreshToken.ExpiresOn.Should().Be(expiresOn); + _endUsersService.Verify(eus => + eus.FindPersonByEmailAsync(_caller.Object, "auser@company.com", It.IsAny())); + _endUsersService.Verify(eus => eus.RegisterPersonAsync(_caller.Object, "auser@company.com", "afirstname", null, + Timezones.Default.ToString(), CountryCodes.Default.ToString(), true, It.IsAny())); + _ssoProvidersService.Verify(sps => sps.SaveUserInfoAsync("aprovidername", "aregistereduserid".ToId(), + It.Is(ui => ui == userInfo), It.IsAny())); + _endUsersService.Verify(eus => + eus.GetMembershipsAsync(_caller.Object, "aregistereduserid", It.IsAny())); + _authTokensService.Verify(ats => ats.IssueTokensAsync(_caller.Object, It.Is(eu => + eu.Id == "amembershipsuserid" + ), It.IsAny())); + } + + [Fact] + public async Task WhenAuthenticateAndPersonExists_ThenIssuesToken() + { + var userInfo = new SSOUserInfo(new List(), "auser@company.com", "afirstname", null, + Timezones.Default, + CountryCodes.Default); + _ssoProvider.Setup(sp => + sp.AuthenticateAsync(It.IsAny(), It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(userInfo); + var endUser = new EndUser + { + Id = "anexistinguserid" + }; + _endUsersService.Setup(eus => + eus.FindPersonByEmailAsync(It.IsAny(), It.IsAny(), + It.IsAny())) + .ReturnsAsync(endUser.ToOptional()); + _endUsersService.Setup(eus => + eus.GetMembershipsAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(new EndUserWithMemberships + { + Id = "amembershipsuserid", + Status = EndUserStatus.Registered, + Access = EndUserAccess.Enabled + }); + var expiresOn = DateTime.UtcNow; + _authTokensService.Setup(ats => ats.IssueTokensAsync(It.IsAny(), + It.IsAny(), It.IsAny())) + .ReturnsAsync(new AccessTokens("anaccesstoken", expiresOn, "arefreshtoken", expiresOn)); + + var result = await _application.AuthenticateAsync(_caller.Object, "aprovidername", "anauthcode", null, + CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(expiresOn); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.RefreshToken.ExpiresOn.Should().Be(expiresOn); + _endUsersService.Verify(eus => + eus.FindPersonByEmailAsync(_caller.Object, "auser@company.com", It.IsAny())); + _endUsersService.Verify(eus => eus.RegisterPersonAsync(It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), + It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); + _ssoProvidersService.Verify(sps => sps.SaveUserInfoAsync("aprovidername", "anexistinguserid".ToId(), + It.Is(ui => ui == userInfo), It.IsAny())); + _endUsersService.Verify(eus => + eus.GetMembershipsAsync(_caller.Object, "anexistinguserid", It.IsAny())); + _authTokensService.Verify(ats => ats.IssueTokensAsync(_caller.Object, It.Is(eu => + eu.Id == "amembershipsuserid" + ), It.IsAny())); + } +} \ No newline at end of file diff --git a/src/IdentityApplication/APIKeysApplication.cs b/src/IdentityApplication/APIKeysApplication.cs index b48b755f..b94500ea 100644 --- a/src/IdentityApplication/APIKeysApplication.cs +++ b/src/IdentityApplication/APIKeysApplication.cs @@ -19,11 +19,11 @@ public class APIKeysApplication : IAPIKeysApplication private readonly IEndUsersService _endUsersService; private readonly IIdentifierFactory _identifierFactory; private readonly IRecorder _recorder; - private readonly IAPIKeyRepository _repository; + private readonly IAPIKeysRepository _repository; private readonly ITokensService _tokensService; public APIKeysApplication(IRecorder recorder, IIdentifierFactory identifierFactory, ITokensService tokensService, - IAPIKeyHasherService apiKeyHasherService, IEndUsersService endUsersService, IAPIKeyRepository repository) + IAPIKeyHasherService apiKeyHasherService, IEndUsersService endUsersService, IAPIKeysRepository repository) { _recorder = recorder; _identifierFactory = identifierFactory; diff --git a/src/IdentityApplication/ApplicationServices/ISSOAuthenticationProvider.cs b/src/IdentityApplication/ApplicationServices/ISSOAuthenticationProvider.cs new file mode 100644 index 00000000..17df541c --- /dev/null +++ b/src/IdentityApplication/ApplicationServices/ISSOAuthenticationProvider.cs @@ -0,0 +1,45 @@ +using Application.Interfaces; +using Application.Resources.Shared; +using Common; + +namespace IdentityApplication.ApplicationServices; + +/// +/// Defines a Single Sign On provider of authentication services +/// +public interface ISSOAuthenticationProvider +{ + string ProviderName { get; } + + Task> AuthenticateAsync(ICallerContext context, string authCode, string? emailAddress, + CancellationToken cancellationToken); +} + +/// +/// Provides the information about a user from a 3rd party system +/// +public class SSOUserInfo +{ + public SSOUserInfo(IReadOnlyList tokens, string emailAddress, string firstName, string? lastName, + TimezoneIANA timezone, CountryCodeIso3166 countryCode) + { + Tokens = tokens; + EmailAddress = emailAddress; + FirstName = firstName; + LastName = lastName; + Timezone = timezone; + CountryCode = countryCode; + } + + public CountryCodeIso3166 CountryCode { get; } + + public string EmailAddress { get; } + + public string FirstName { get; } + + public string? LastName { get; } + + public TimezoneIANA Timezone { get; } + + public IReadOnlyList Tokens { get; } +} \ No newline at end of file diff --git a/src/IdentityApplication/ApplicationServices/ISSOProvidersService.cs b/src/IdentityApplication/ApplicationServices/ISSOProvidersService.cs new file mode 100644 index 00000000..c396cb2f --- /dev/null +++ b/src/IdentityApplication/ApplicationServices/ISSOProvidersService.cs @@ -0,0 +1,16 @@ +using Common; +using Domain.Common.ValueObjects; + +namespace IdentityApplication.ApplicationServices; + +/// +/// Defines a service for accessing registered s +/// +public interface ISSOProvidersService +{ + Task, Error>> FindByNameAsync(string name, + CancellationToken cancellationToken); + + Task> SaveUserInfoAsync(string providerName, Identifier userId, SSOUserInfo userInfo, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/IdentityApplication/ApplicationServices/SSOProvidersService.cs b/src/IdentityApplication/ApplicationServices/SSOProvidersService.cs new file mode 100644 index 00000000..036fa1c7 --- /dev/null +++ b/src/IdentityApplication/ApplicationServices/SSOProvidersService.cs @@ -0,0 +1,130 @@ +using Common; +using Common.Extensions; +using Domain.Common.Identity; +using Domain.Common.ValueObjects; +using Domain.Services.Shared.DomainServices; +using Domain.Shared; +using IdentityApplication.Persistence; +using IdentityDomain; +using PersonName = Domain.Shared.PersonName; + +namespace IdentityApplication.ApplicationServices; + +/// +/// Provides a service to manage registered s +/// +public class SSOProvidersService : ISSOProvidersService +{ + private readonly IEnumerable _authenticationProviders; + private readonly IIdentifierFactory _identifierFactory; + private readonly IEncryptionService _encryptionService; + private readonly IRecorder _recorder; + private readonly ISSOUsersRepository _repository; + + public SSOProvidersService(IRecorder recorder, IIdentifierFactory identifierFactory, + IEncryptionService encryptionService, + IEnumerable authenticationProviders, + ISSOUsersRepository repository) + { + _recorder = recorder; + _identifierFactory = identifierFactory; + _encryptionService = encryptionService; + _repository = repository; + _authenticationProviders = authenticationProviders; + } + + public Task, Error>> FindByNameAsync(string name, + CancellationToken cancellationToken) + { + var provider = + _authenticationProviders.FirstOrDefault(provider => provider.ProviderName.EqualsIgnoreCase(name)); + return Task.FromResult, Error>>(provider.ToOptional()); + } + + public async Task> SaveUserInfoAsync(string providerName, Identifier userId, SSOUserInfo userInfo, + CancellationToken cancellationToken) + { + var retrievedProvider = await FindByNameAsync(providerName, cancellationToken); + if (!retrievedProvider.IsSuccessful) + { + return retrievedProvider.Error; + } + + if (!retrievedProvider.Value.HasValue) + { + return Error.EntityNotFound(Resources.SSOProvidersService_UnknownProvider.Format(providerName)); + } + + var provider = retrievedProvider.Value.Value; + var retrievedUser = + await _repository.FindUserInfoByUserIdAsync(provider.ProviderName, userId, cancellationToken); + if (!retrievedUser.IsSuccessful) + { + return retrievedUser.Error; + } + + SSOUserRoot user; + if (retrievedUser.Value.HasValue) + { + user = retrievedUser.Value.Value; + } + else + { + var created = SSOUserRoot.Create(_recorder, _identifierFactory, _encryptionService, providerName, userId); + if (!created.IsSuccessful) + { + return created.Error; + } + + user = created.Value; + } + + var name = PersonName.Create(userInfo.FirstName, userInfo.LastName); + if (!name.IsSuccessful) + { + return name.Error; + } + + var emailAddress = EmailAddress.Create(userInfo.EmailAddress); + if (!emailAddress.IsSuccessful) + { + return emailAddress.Error; + } + + var timezone = Timezone.Create(userInfo.Timezone); + if (!timezone.IsSuccessful) + { + return timezone.Error; + } + + var address = Address.Create(userInfo.CountryCode); + if (!address.IsSuccessful) + { + return address.Error; + } + + var tokens = SSOAuthTokens.Create(userInfo.Tokens + .Select(tok => + SSOAuthToken.Create(tok.Type.ToEnumOrDefault(SSOAuthTokenType.AccessToken), tok.Value, tok.ExpiresOn) + .Value) + .ToList()); + if (!tokens.IsSuccessful) + { + return tokens.Error; + } + + var updated = user.UpdateDetails(tokens.Value, emailAddress.Value, name.Value, timezone.Value, address.Value); + if (!updated.IsSuccessful) + { + return updated.Error; + } + + var saved = await _repository.SaveAsync(user, cancellationToken); + if (!saved.IsSuccessful) + { + return saved.Error; + } + + return Result.Ok; + } +} \ No newline at end of file diff --git a/src/IdentityApplication/AuthTokensApplication.cs b/src/IdentityApplication/AuthTokensApplication.cs index c8ef265b..fe589085 100644 --- a/src/IdentityApplication/AuthTokensApplication.cs +++ b/src/IdentityApplication/AuthTokensApplication.cs @@ -79,7 +79,7 @@ public async Task> IssueTokensAsync(ICallerContext c return tokens; } - public async Task> RefreshTokenAsync(ICallerContext context, string refreshToken, + public async Task> RefreshTokenAsync(ICallerContext context, string refreshToken, CancellationToken cancellationToken) { var retrieved = await _repository.FindByRefreshTokenAsync(refreshToken, cancellationToken); @@ -123,7 +123,20 @@ public async Task> RefreshTokenAsync(ICallerContext _recorder.TraceInformation(context.ToCall(), "AuthTokens were refreshed for {Id}", updated.Value.Id); - return tokens; + return new AuthenticateTokens + { + UserId = user.Id, + AccessToken = new AuthenticateToken + { + Value = tokens.AccessToken, + ExpiresOn = tokens.AccessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = tokens.RefreshToken, + ExpiresOn = tokens.RefreshTokenExpiresOn + } + }; } public async Task> RevokeRefreshTokenAsync(ICallerContext context, string refreshToken, diff --git a/src/IdentityApplication/IAuthTokensApplication.cs b/src/IdentityApplication/IAuthTokensApplication.cs index 8aa2e430..c73bb218 100644 --- a/src/IdentityApplication/IAuthTokensApplication.cs +++ b/src/IdentityApplication/IAuthTokensApplication.cs @@ -10,7 +10,7 @@ public interface IAuthTokensApplication Task> IssueTokensAsync(ICallerContext context, EndUserWithMemberships user, CancellationToken cancellationToken); - Task> RefreshTokenAsync(ICallerContext context, string refreshToken, + Task> RefreshTokenAsync(ICallerContext context, string refreshToken, CancellationToken cancellationToken); Task> RevokeRefreshTokenAsync(ICallerContext context, string refreshToken, diff --git a/src/IdentityApplication/ISingleSignOnApplication.cs b/src/IdentityApplication/ISingleSignOnApplication.cs new file mode 100644 index 00000000..aa81a6d8 --- /dev/null +++ b/src/IdentityApplication/ISingleSignOnApplication.cs @@ -0,0 +1,11 @@ +using Application.Interfaces; +using Application.Resources.Shared; +using Common; + +namespace IdentityApplication; + +public interface ISingleSignOnApplication +{ + Task> AuthenticateAsync(ICallerContext context, string providerName, + string authCode, string? username, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/IdentityApplication/PasswordCredentialsApplication.cs b/src/IdentityApplication/PasswordCredentialsApplication.cs index 7ec46a40..4fe472fb 100644 --- a/src/IdentityApplication/PasswordCredentialsApplication.cs +++ b/src/IdentityApplication/PasswordCredentialsApplication.cs @@ -78,25 +78,25 @@ public async Task> AuthenticateAsync(ICallerCo { await DelayForRandomPeriodAsync(MinAuthenticateDelayInSecs, MaxAuthenticateDelayInSecs, cancellationToken); - var fetched = await _repository.FindCredentialsByUsernameAsync(username, cancellationToken); - if (!fetched.IsSuccessful) + var retrieved = await _repository.FindCredentialsByUsernameAsync(username, cancellationToken); + if (!retrieved.IsSuccessful) { return Error.NotAuthenticated(); } - if (!fetched.Value.HasValue) + if (!retrieved.Value.HasValue) { return Error.NotAuthenticated(); } - var credentials = fetched.Value.Value; - var retrieved = await _endUsersService.GetMembershipsAsync(context, credentials.UserId, cancellationToken); - if (!retrieved.IsSuccessful) + var credentials = retrieved.Value.Value; + var registered = await _endUsersService.GetMembershipsAsync(context, credentials.UserId, cancellationToken); + if (!registered.IsSuccessful) { return Error.NotAuthenticated(); } - var user = retrieved.Value; + var user = registered.Value; if (user.Status != EndUserStatus.Registered) { return Error.NotAuthenticated(); @@ -154,10 +154,16 @@ public async Task> AuthenticateAsync(ICallerCo var tokens = issued.Value; return new Result(new AuthenticateTokens { - AccessToken = tokens.AccessToken, - RefreshToken = tokens.RefreshToken, - AccessTokenExpiresOn = tokens.AccessTokenExpiresOn, - RefreshTokenExpiresOn = tokens.RefreshTokenExpiresOn, + AccessToken = new AuthenticateToken + { + Value = tokens.AccessToken, + ExpiresOn = tokens.AccessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = tokens.RefreshToken, + ExpiresOn = tokens.RefreshTokenExpiresOn + }, UserId = user.Id }); diff --git a/src/IdentityApplication/Persistence/IAPIKeyRepository.cs b/src/IdentityApplication/Persistence/IAPIKeysRepository.cs similarity index 85% rename from src/IdentityApplication/Persistence/IAPIKeyRepository.cs rename to src/IdentityApplication/Persistence/IAPIKeysRepository.cs index cf7a5d1f..31634123 100644 --- a/src/IdentityApplication/Persistence/IAPIKeyRepository.cs +++ b/src/IdentityApplication/Persistence/IAPIKeysRepository.cs @@ -4,7 +4,7 @@ namespace IdentityApplication.Persistence; -public interface IAPIKeyRepository : IApplicationRepository +public interface IAPIKeysRepository : IApplicationRepository { Task, Error>> FindByAPIKeyTokenAsync(string keyToken, CancellationToken cancellationToken); diff --git a/src/IdentityApplication/Persistence/ISSOUsersRepository.cs b/src/IdentityApplication/Persistence/ISSOUsersRepository.cs new file mode 100644 index 00000000..a3152ae3 --- /dev/null +++ b/src/IdentityApplication/Persistence/ISSOUsersRepository.cs @@ -0,0 +1,14 @@ +using Application.Persistence.Interfaces; +using Common; +using Domain.Common.ValueObjects; +using IdentityDomain; + +namespace IdentityApplication.Persistence; + +public interface ISSOUsersRepository : IApplicationRepository +{ + Task, Error>> FindUserInfoByUserIdAsync(string providerName, Identifier userId, + CancellationToken cancellationToken); + + Task> SaveAsync(SSOUserRoot user, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/IdentityApplication/Persistence/ReadModels/SSOUser.cs b/src/IdentityApplication/Persistence/ReadModels/SSOUser.cs new file mode 100644 index 00000000..fd46ad49 --- /dev/null +++ b/src/IdentityApplication/Persistence/ReadModels/SSOUser.cs @@ -0,0 +1,25 @@ +using Application.Persistence.Common; +using Common; +using QueryAny; + +namespace IdentityApplication.Persistence.ReadModels; + +[EntityName("SSOUser")] +public class SSOUser : ReadModelEntity +{ + public Optional CountryCode { get; set; } + + public Optional EmailAddress { get; set; } + + public Optional FirstName { get; set; } + + public Optional LastName { get; set; } + + public Optional ProviderName { get; set; } + + public Optional Timezone { get; set; } + + public Optional Tokens { get; set; } + + public Optional UserId { get; set; } +} \ No newline at end of file diff --git a/src/IdentityApplication/Resources.Designer.cs b/src/IdentityApplication/Resources.Designer.cs index 1a673758..c1255367 100644 --- a/src/IdentityApplication/Resources.Designer.cs +++ b/src/IdentityApplication/Resources.Designer.cs @@ -103,5 +103,23 @@ internal static string PasswordCredentialsApplication_RegistrationNotVerified { return ResourceManager.GetString("PasswordCredentialsApplication_RegistrationNotVerified", resourceCulture); } } + + /// + /// Looks up a localized string similar to The user account is suspended. + /// + internal static string SingleSignOnApplication_AccountSuspended { + get { + return ResourceManager.GetString("SingleSignOnApplication_AccountSuspended", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The '{0}' is not registered. + /// + internal static string SSOProvidersService_UnknownProvider { + get { + return ResourceManager.GetString("SSOProvidersService_UnknownProvider", resourceCulture); + } + } } } diff --git a/src/IdentityApplication/Resources.resx b/src/IdentityApplication/Resources.resx index f3cb7ca9..aef53748 100644 --- a/src/IdentityApplication/Resources.resx +++ b/src/IdentityApplication/Resources.resx @@ -39,4 +39,10 @@ The user account ID is not a valid identifier + + The user account is suspended + + + The '{0}' is not registered + \ No newline at end of file diff --git a/src/IdentityApplication/SingleSignOnApplication.cs b/src/IdentityApplication/SingleSignOnApplication.cs new file mode 100644 index 00000000..63ae366b --- /dev/null +++ b/src/IdentityApplication/SingleSignOnApplication.cs @@ -0,0 +1,132 @@ +using Application.Common; +using Application.Interfaces; +using Application.Resources.Shared; +using Application.Services.Shared; +using Common; +using Domain.Common.ValueObjects; +using IdentityApplication.ApplicationServices; + +namespace IdentityApplication; + +public class SingleSignOnApplication : ISingleSignOnApplication +{ + private readonly IAuthTokensService _authTokensService; + private readonly IEndUsersService _endUsersService; + private readonly IRecorder _recorder; + private readonly ISSOProvidersService _ssoProvidersService; + + public SingleSignOnApplication(IRecorder recorder, IEndUsersService endUsersService, + ISSOProvidersService ssoProvidersService, IAuthTokensService authTokensService) + { + _recorder = recorder; + _endUsersService = endUsersService; + _ssoProvidersService = ssoProvidersService; + _authTokensService = authTokensService; + } + + public async Task> AuthenticateAsync(ICallerContext context, string providerName, + string authCode, string? username, CancellationToken cancellationToken) + { + var retrieved = await _ssoProvidersService.FindByNameAsync(providerName, cancellationToken); + if (!retrieved.IsSuccessful) + { + return retrieved.Error; + } + + if (!retrieved.Value.HasValue) + { + return Error.NotAuthenticated(); + } + + var provider = retrieved.Value.Value; + var authenticated = await provider.AuthenticateAsync(context, authCode, username, cancellationToken); + if (!authenticated.IsSuccessful) + { + return authenticated.Error; + } + + var userInfo = authenticated.Value; + var userExists = + await _endUsersService.FindPersonByEmailAsync(context, userInfo.EmailAddress, cancellationToken); + if (!userExists.IsSuccessful) + { + return userExists.Error; + } + + string registeredUserId; + if (!userExists.Value.HasValue) + { + var autoRegistered = await _endUsersService.RegisterPersonAsync(context, userInfo.EmailAddress, + userInfo.FirstName, userInfo.LastName, userInfo.Timezone.ToString(), userInfo.CountryCode.ToString(), + true, + cancellationToken); + if (!autoRegistered.IsSuccessful) + { + return autoRegistered.Error; + } + + registeredUserId = autoRegistered.Value.Id; + + _recorder.AuditAgainst(context.ToCall(), autoRegistered.Value.Id, + Audits.SingleSignOnApplication_Authenticate_AccountOnboarded, + "User {Id} was registered automatically from SSO {Provider}", autoRegistered.Value.Id, providerName); + } + else + { + registeredUserId = userExists.Value.Value.Id; + } + + var registered = await _endUsersService.GetMembershipsAsync(context, registeredUserId, cancellationToken); + if (!registered.IsSuccessful) + { + return Error.NotAuthenticated(); + } + + var user = registered.Value; + if (user.Status != EndUserStatus.Registered) + { + return Error.NotAuthenticated(); + } + + if (user.Access == EndUserAccess.Suspended) + { + _recorder.AuditAgainst(context.ToCall(), user.Id, + Audits.SingleSignOnApplication_Authenticate_AccountSuspended, + "User {Id} tried to authenticate with SSO {Provider} with a suspended account", user.Id, providerName); + return Error.EntityExists(Resources.SingleSignOnApplication_AccountSuspended); + } + + var saved = await _ssoProvidersService.SaveUserInfoAsync(providerName, registeredUserId.ToId(), userInfo, + cancellationToken); + if (!saved.IsSuccessful) + { + return saved.Error; + } + + _recorder.AuditAgainst(context.ToCall(), user.Id, + Audits.SingleSignOnApplication_Authenticate_Succeeded, + "User {Id} succeeded to authenticate with SSO {Provider}", user.Id, providerName); + + var issued = await _authTokensService.IssueTokensAsync(context, user, cancellationToken); + if (!issued.IsSuccessful) + { + return issued.Error; + } + + var tokens = issued.Value; + return new Result(new AuthenticateTokens + { + AccessToken = new AuthenticateToken + { + Value = tokens.AccessToken, + ExpiresOn = tokens.AccessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = tokens.RefreshToken, + ExpiresOn = tokens.RefreshTokenExpiresOn + }, + UserId = user.Id + }); + } +} \ No newline at end of file diff --git a/src/IdentityDomain.UnitTests/SSOAuthTokenSpec.cs b/src/IdentityDomain.UnitTests/SSOAuthTokenSpec.cs new file mode 100644 index 00000000..b9264b5c --- /dev/null +++ b/src/IdentityDomain.UnitTests/SSOAuthTokenSpec.cs @@ -0,0 +1,30 @@ +using Common; +using FluentAssertions; +using UnitTesting.Common; +using Xunit; + +namespace IdentityDomain.UnitTests; + +[Trait("Category", "Unit")] +public class SSOAuthTokenSpec +{ + [Fact] + public void WhenCreateAndValueIsEmpty_ThenReturnsError() + { + var result = SSOAuthToken.Create(SSOAuthTokenType.AccessToken, string.Empty, null); + + result.Should().BeError(ErrorCode.Validation); + } + + [Fact] + public void WhenCreate_ThenReturns() + { + var expiresOn = DateTime.UtcNow; + var result = SSOAuthToken.Create(SSOAuthTokenType.AccessToken, "atoken", expiresOn); + + result.Should().BeSuccess(); + result.Value.Type.Should().Be(SSOAuthTokenType.AccessToken); + result.Value.Value.Should().Be("atoken"); + result.Value.ExpiresOn.Should().Be(expiresOn); + } +} \ No newline at end of file diff --git a/src/IdentityDomain.UnitTests/SSOUserRootSpec.cs b/src/IdentityDomain.UnitTests/SSOUserRootSpec.cs new file mode 100644 index 00000000..6c3ea990 --- /dev/null +++ b/src/IdentityDomain.UnitTests/SSOUserRootSpec.cs @@ -0,0 +1,62 @@ +using Common; +using Common.Extensions; +using Domain.Common.Identity; +using Domain.Common.ValueObjects; +using Domain.Interfaces.Entities; +using Domain.Services.Shared.DomainServices; +using Domain.Shared; +using FluentAssertions; +using Moq; +using UnitTesting.Common; +using Xunit; + +namespace IdentityDomain.UnitTests; + +[Trait("Category", "Unit")] +public class SSOUserRootSpec +{ + private readonly SSOUserRoot _user; + + public SSOUserRootSpec() + { + var recorder = new Mock(); + var idFactory = new Mock(); + idFactory.Setup(idf => idf.Create(It.IsAny())) + .Returns("anid".ToId()); + var encryptionService = new Mock(); + encryptionService.Setup(es => es.Encrypt(It.IsAny())) + .Returns((string value) => value); + encryptionService.Setup(es => es.Decrypt(It.IsAny())) + .Returns((string value) => value); + _user = SSOUserRoot.Create(recorder.Object, idFactory.Object, encryptionService.Object, "aprovidername", + "auserid".ToId()).Value; + } + + [Fact] + public void WhenConstructed_ThenAssigned() + { + _user.ProviderName.Should().Be("aprovidername"); + _user.UserId.Should().Be("auserid".ToId()); + } + + [Fact] + public void WhenUpdateDetails_ThenUpdates() + { + var expiresOn = DateTime.UtcNow; + var tokens = SSOAuthTokens.Create(new List + { + SSOAuthToken.Create(SSOAuthTokenType.AccessToken, "anaccesstoken", expiresOn).Value + }).Value; + + _user.UpdateDetails(tokens, EmailAddress.Create("auser@company.com").Value, + PersonName.Create("afirstname", null).Value, Timezone.Default, Address.Default); + + _user.UserId.Should().Be("auserid".ToId()); + _user.EmailAddress.Value.Address.Should().Be("auser@company.com"); + _user.Name.Value.FirstName.Text.Should().Be("afirstname"); + _user.Name.Value.LastName.Should().BeNone(); + _user.Timezone.Value.Code.Should().Be(Timezones.Default); + _user.Address.Value.CountryCode.Should().Be(CountryCodes.Default); + _user.Events.Last().Should().BeOfType(); + } +} \ No newline at end of file diff --git a/src/IdentityDomain/Events.cs b/src/IdentityDomain/Events.cs index 30652a7a..d34af954 100644 --- a/src/IdentityDomain/Events.cs +++ b/src/IdentityDomain/Events.cs @@ -276,10 +276,10 @@ public static TokensRefreshed Create(Identifier id, Identifier userId, string ac public required DateTime AccessTokenExpiresOn { get; set; } - public required DateTime RefreshTokenExpiresOn { get; set; } - public required string RefreshToken { get; set; } + public required DateTime RefreshTokenExpiresOn { get; set; } + public required string UserId { get; set; } public required string RootId { get; set; } @@ -376,4 +376,64 @@ public static KeyVerified Create(Identifier id, bool isVerified) public DateTime OccurredUtc { get; set; } } } + + public static class SSOUsers + { + public class Created : IDomainEvent + { + public static Created Create(Identifier id, string providerName, Identifier userId) + { + return new Created + { + RootId = id, + ProviderName = providerName, + UserId = userId, + OccurredUtc = DateTime.UtcNow + }; + } + + public required string ProviderName { get; set; } + + public required string UserId { get; set; } + + public required string RootId { get; set; } + + public DateTime OccurredUtc { get; set; } + } + + public class TokensUpdated : IDomainEvent + { + public static TokensUpdated Create(Identifier id, string tokens, EmailAddress emailAddress, + PersonName name, Timezone timezone, Address address) + { + return new TokensUpdated + { + RootId = id, + Tokens = tokens, + EmailAddress = emailAddress, + FirstName = name.FirstName, + LastName = name.LastName.ValueOrDefault?.Text, + Timezone = timezone.Code.ToString(), + CountryCode = address.CountryCode.ToString(), + OccurredUtc = DateTime.UtcNow + }; + } + + public required string CountryCode { get; set; } + + public required string EmailAddress { get; set; } + + public required string FirstName { get; set; } + + public string? LastName { get; set; } + + public required string Timezone { get; set; } + + public required string Tokens { get; set; } + + public required string RootId { get; set; } + + public DateTime OccurredUtc { get; set; } + } + } } \ No newline at end of file diff --git a/src/IdentityDomain/SSOAuthToken.cs b/src/IdentityDomain/SSOAuthToken.cs new file mode 100644 index 00000000..675713b8 --- /dev/null +++ b/src/IdentityDomain/SSOAuthToken.cs @@ -0,0 +1,47 @@ +using Common; +using Common.Extensions; +using Domain.Common.ValueObjects; +using Domain.Interfaces; + +namespace IdentityDomain; + +public sealed class SSOAuthToken : ValueObjectBase +{ + public static Result Create(SSOAuthTokenType type, string value, DateTime? expiresOn) + { + if (value.IsNotValuedParameter(nameof(value), out var error1)) + { + return error1; + } + + return new SSOAuthToken(type, value, expiresOn); + } + + private SSOAuthToken(SSOAuthTokenType type, string value, DateTime? expiresOn) + { + Type = type; + Value = value; + ExpiresOn = expiresOn; + } + + public DateTime? ExpiresOn { get; } + + public SSOAuthTokenType Type { get; } + + public string Value { get; } + + public static ValueObjectFactory Rehydrate() + { + return (property, _) => + { + var parts = RehydrateToList(property, false); + return new SSOAuthToken(parts[0].ToEnumOrDefault(SSOAuthTokenType.AccessToken), parts[1]!, + parts[2]?.FromIso8601()); + }; + } + + protected override IEnumerable GetAtomicValues() + { + return new object?[] { Type, Value, ExpiresOn }; + } +} \ No newline at end of file diff --git a/src/IdentityDomain/SSOAuthTokenType.cs b/src/IdentityDomain/SSOAuthTokenType.cs new file mode 100644 index 00000000..3008f3be --- /dev/null +++ b/src/IdentityDomain/SSOAuthTokenType.cs @@ -0,0 +1,8 @@ +namespace IdentityDomain; + +public enum SSOAuthTokenType +{ + AccessToken = 0, + RefreshToken = 1, + IdToken = 2 +} \ No newline at end of file diff --git a/src/IdentityDomain/SSOAuthTokens.cs b/src/IdentityDomain/SSOAuthTokens.cs new file mode 100644 index 00000000..8b5bd86b --- /dev/null +++ b/src/IdentityDomain/SSOAuthTokens.cs @@ -0,0 +1,26 @@ +using Common; +using Domain.Common.ValueObjects; +using Domain.Interfaces; + +namespace IdentityDomain; + +public sealed class SSOAuthTokens : SingleValueObjectBase> +{ + public static Result Create(List value) + { + return new SSOAuthTokens(value); + } + + private SSOAuthTokens(List value) : base(value) + { + } + + public static ValueObjectFactory Rehydrate() + { + return (property, container) => + { + var items = RehydrateToList(property, true, true); + return new SSOAuthTokens(items.Select(item => SSOAuthToken.Rehydrate()(item!, container)).ToList()); + }; + } +} \ No newline at end of file diff --git a/src/IdentityDomain/SSOUserRoot.cs b/src/IdentityDomain/SSOUserRoot.cs new file mode 100644 index 00000000..1af67565 --- /dev/null +++ b/src/IdentityDomain/SSOUserRoot.cs @@ -0,0 +1,131 @@ +using Common; +using Common.Extensions; +using Domain.Common.Entities; +using Domain.Common.Identity; +using Domain.Common.ValueObjects; +using Domain.Interfaces; +using Domain.Interfaces.Entities; +using Domain.Interfaces.ValueObjects; +using Domain.Services.Shared.DomainServices; +using Domain.Shared; + +namespace IdentityDomain; + +public sealed class SSOUserRoot : AggregateRootBase +{ + private readonly IEncryptionService _encryptionService; + + public static Result Create(IRecorder recorder, IIdentifierFactory idFactory, + IEncryptionService encryptionService, + string providerName, Identifier userId) + { + var root = new SSOUserRoot(recorder, idFactory, encryptionService); + root.RaiseCreateEvent(IdentityDomain.Events.SSOUsers.Created.Create(root.Id, providerName, userId)); + return root; + } + + private SSOUserRoot(IRecorder recorder, IIdentifierFactory idFactory, IEncryptionService encryptionService) : base( + recorder, idFactory) + { + _encryptionService = encryptionService; + } + + private SSOUserRoot(IRecorder recorder, IIdentifierFactory idFactory, IEncryptionService encryptionService, + ISingleValueObject identifier) : base( + recorder, idFactory, identifier) + { + _encryptionService = encryptionService; + } + + public Optional
Address { get; private set; } + + public Optional EmailAddress { get; private set; } + + public Optional Name { get; private set; } + + public Optional ProviderName { get; private set; } + + public Optional Timezone { get; private set; } + + public Optional Tokens { get; private set; } + + public Identifier UserId { get; private set; } = Identifier.Empty(); + + public static AggregateRootFactory Rehydrate() + { + return (identifier, container, _) => new SSOUserRoot(container.Resolve(), + container.Resolve(), container.Resolve(), identifier); + } + + public override Result EnsureInvariants() + { + var ensureInvariants = base.EnsureInvariants(); + if (!ensureInvariants.IsSuccessful) + { + return ensureInvariants.Error; + } + + return Result.Ok; + } + + protected override Result OnStateChanged(IDomainEvent @event, bool isReconstituting) + { + switch (@event) + { + case Events.SSOUsers.Created created: + { + ProviderName = created.ProviderName; + UserId = created.UserId.ToId(); + return Result.Ok; + } + + case Events.SSOUsers.TokensUpdated changed: + { + var emailAddress = Domain.Shared.EmailAddress.Create(changed.EmailAddress); + if (!emailAddress.IsSuccessful) + { + return emailAddress.Error; + } + + var name = PersonName.Create(changed.FirstName, changed.LastName); + if (!name.IsSuccessful) + { + return name.Error; + } + + var timezone = Domain.Shared.Timezone.Create(changed.Timezone); + if (!timezone.IsSuccessful) + { + return timezone.Error; + } + + var address = Domain.Shared.Address.Create(CountryCodes.FindOrDefault(changed.CountryCode)); + if (!address.IsSuccessful) + { + return address.Error; + } + + var tokens = _encryptionService.Decrypt(changed.Tokens); + Name = name.Value; + EmailAddress = emailAddress.Value; + Timezone = timezone.Value; + Address = address.Value; + Tokens = tokens; + Recorder.TraceDebug(null, "User {Id} has updated their tokens", Id); + return Result.Ok; + } + + default: + return HandleUnKnownStateChangedEvent(@event); + } + } + + public Result UpdateDetails(SSOAuthTokens tokens, EmailAddress emailAddress, + PersonName name, Timezone timezone, Address address) + { + var secureTokens = _encryptionService.Encrypt(tokens.ToJson(false)!); + return RaiseChangeEvent( + IdentityDomain.Events.SSOUsers.TokensUpdated.Create(Id, secureTokens, emailAddress, name, timezone, + address)); + } +} \ No newline at end of file diff --git a/src/IdentityInfrastructure.IntegrationTests/AuthTokensApiSpec.cs b/src/IdentityInfrastructure.IntegrationTests/AuthTokensApiSpec.cs index fc82fe54..27d50002 100644 --- a/src/IdentityInfrastructure.IntegrationTests/AuthTokensApiSpec.cs +++ b/src/IdentityInfrastructure.IntegrationTests/AuthTokensApiSpec.cs @@ -43,28 +43,28 @@ await Api.PostAsync(new ConfirmRegistrationPersonPasswordRequest Password = "1Password!" }); - oldTokens.Content.Value.AccessToken.Should().NotBeNull(); - oldTokens.Content.Value.RefreshToken.Should().NotBeNull(); - oldTokens.Content.Value.AccessTokenExpiresOnUtc.Should() + oldTokens.Content.Value.Tokens!.AccessToken.Value.Should().NotBeNull(); + oldTokens.Content.Value.Tokens.AccessToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry)); - oldTokens.Content.Value.RefreshTokenExpiresOnUtc.Should() + oldTokens.Content.Value.Tokens.RefreshToken.Value.Should().NotBeNull(); + oldTokens.Content.Value.Tokens.RefreshToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultRefreshTokenExpiry)); await Task.Delay(TimeSpan .FromSeconds(1)); //HACK: to ensure that the new token is not the same (in time) as the old token - var oldAccessToken = oldTokens.Content.Value.AccessToken; - var oldRefreshToken = oldTokens.Content.Value.RefreshToken; + var oldAccessToken = oldTokens.Content.Value.Tokens.AccessToken.Value; + var oldRefreshToken = oldTokens.Content.Value.Tokens.RefreshToken.Value; var newTokens = await Api.PostAsync(new RefreshTokenRequest { - RefreshToken = oldRefreshToken! + RefreshToken = oldRefreshToken }); - newTokens.Content.Value.AccessToken.Should().NotBeNull().And.NotBe(oldAccessToken); - newTokens.Content.Value.RefreshToken.Should().NotBeNull().And.NotBe(oldRefreshToken); - newTokens.Content.Value.AccessTokenExpiresOnUtc.Should() + newTokens.Content.Value.Tokens!.AccessToken.Value.Should().NotBeNull().And.NotBe(oldAccessToken); + newTokens.Content.Value.Tokens.AccessToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry)); - newTokens.Content.Value.RefreshTokenExpiresOnUtc.Should() + newTokens.Content.Value.Tokens.RefreshToken.Value.Should().NotBeNull().And.NotBe(oldRefreshToken); + newTokens.Content.Value.Tokens.RefreshToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultRefreshTokenExpiry)); } @@ -74,11 +74,13 @@ public async Task WhenRevokeRefreshToken_ThenRevokes() var user = await LoginUserAsync(); var oldRefreshToken = user.RefreshToken; - await Api.DeleteAsync(new RevokeRefreshTokenRequest + var revoked = await Api.DeleteAsync(new RevokeRefreshTokenRequest { RefreshToken = oldRefreshToken }); + revoked.StatusCode.Should().Be(HttpStatusCode.NoContent); + var refreshed = await Api.PostAsync(new RefreshTokenRequest { RefreshToken = oldRefreshToken diff --git a/src/IdentityInfrastructure.IntegrationTests/PasswordCredentialsApiSpec.cs b/src/IdentityInfrastructure.IntegrationTests/PasswordCredentialsApiSpec.cs index f9f8f445..9051d4d5 100644 --- a/src/IdentityInfrastructure.IntegrationTests/PasswordCredentialsApiSpec.cs +++ b/src/IdentityInfrastructure.IntegrationTests/PasswordCredentialsApiSpec.cs @@ -90,11 +90,11 @@ await Api.PostAsync(new ConfirmRegistrationPersonPasswordRequest Password = "1Password!" }); - result.Content.Value.AccessToken.Should().NotBeNull(); - result.Content.Value.RefreshToken.Should().NotBeNull(); - result.Content.Value.AccessTokenExpiresOnUtc.Should() + result.Content.Value.Tokens!.AccessToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.AccessToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry)); - result.Content.Value.RefreshTokenExpiresOnUtc.Should() + result.Content.Value.Tokens.RefreshToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.RefreshToken.ExpiresOn.Should() .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultRefreshTokenExpiry)); } @@ -122,7 +122,7 @@ await Api.PostAsync(new ConfirmRegistrationPersonPasswordRequest Password = "1Password!" }); - var accessToken = authenticate.Content.Value.AccessToken!; + var accessToken = authenticate.Content.Value.Tokens!.AccessToken.Value; #if TESTINGONLY var result = await Api.GetAsync(new GetCallerWithTokenOrAPIKeyTestingOnlyRequest(), diff --git a/src/IdentityInfrastructure.IntegrationTests/SingleSignOnApiSpec.cs b/src/IdentityInfrastructure.IntegrationTests/SingleSignOnApiSpec.cs new file mode 100644 index 00000000..536189e6 --- /dev/null +++ b/src/IdentityInfrastructure.IntegrationTests/SingleSignOnApiSpec.cs @@ -0,0 +1,149 @@ +using System.Net; +using ApiHost1; +using FluentAssertions; +using IdentityInfrastructure.ApplicationServices; +using Infrastructure.Interfaces; +using Infrastructure.Web.Api.Common.Extensions; +using Infrastructure.Web.Api.Operations.Shared.Identities; +using Infrastructure.Web.Api.Operations.Shared.TestingOnly; +using IntegrationTesting.WebApi.Common; +using Microsoft.Extensions.DependencyInjection; +using UnitTesting.Common.Validation; +using Xunit; + +namespace IdentityInfrastructure.IntegrationTests; + +[Trait("Category", "Integration.Web")] +[Collection("API")] +public class SingleSignOnApiSpec : WebApiSpec +{ + public SingleSignOnApiSpec(WebApiSetup setup) : base(setup, OverrideDependencies) + { + EmptyAllRepositories(); + } + + [Fact] + public async Task WhenAuthenticateAndUnknownProvider_ThenReturnsError() + { + var result = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Provider = "anunknownprovider", + AuthCode = "1234567890" + }); + + result.Content.Error.Status.Should().Be((int)HttpStatusCode.Unauthorized); + } + + [Fact] + public async Task WhenAuthenticateAndNoUsername_ThenReturnsError() + { +#if TESTINGONLY + var result = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Username = null, + Provider = FakeSSOAuthenticationProvider.SSOName, + AuthCode = "1234567890" + }); + + result.Content.Error.Status.Should().Be((int)HttpStatusCode.BadRequest); + result.Content.Error.Detail.Should().Be(Resources.TestSSOAuthenticationProvider_MissingUsername); +#endif + } + + [Fact] + public async Task WhenAuthenticateAndWrongAuthCode_ThenReturnsError() + { +#if TESTINGONLY + var result = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Username = "auser@company.com", + Provider = FakeSSOAuthenticationProvider.SSOName, + AuthCode = "awrongcode" + }); + + result.Content.Error.Status.Should().Be((int)HttpStatusCode.Unauthorized); +#endif + } + + [Fact] + public async Task WhenAuthenticateAndUserNotExists_ThenRegistersAndReturnsUser() + { +#if TESTINGONLY + var result = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Username = "auser@company.com", + Provider = FakeSSOAuthenticationProvider.SSOName, + AuthCode = "1234567890" + }); + + result.Content.Value.Tokens!.UserId.Should().NotBeNull(); + result.Content.Value.Tokens.AccessToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.AccessToken.ExpiresOn.Should() + .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry)); + result.Content.Value.Tokens.RefreshToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.RefreshToken.ExpiresOn.Should() + .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultRefreshTokenExpiry)); +#endif + } + + [Fact] + public async Task WhenAuthenticateAndUserExists_ThenReturnsTokens() + { +#if TESTINGONLY + var person = await Api.PostAsync(new RegisterPersonPasswordRequest + { + EmailAddress = "auser@company.com", + FirstName = "afirstname", + LastName = "alastname", + Password = "1Password!", + TermsAndConditionsAccepted = true + }); + + var token = NotificationsService.LastRegistrationConfirmationToken; + await Api.PostAsync(new ConfirmRegistrationPersonPasswordRequest + { + Token = token! + }); + + var result = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Username = "auser@company.com", + Provider = FakeSSOAuthenticationProvider.SSOName, + AuthCode = "1234567890" + }); + + result.Content.Value.Tokens!.UserId.Should().Be(person.Content.Value.Credential!.User.Id); + result.Content.Value.Tokens.AccessToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.AccessToken.ExpiresOn.Should() + .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry)); + result.Content.Value.Tokens.RefreshToken.Value.Should().NotBeNull(); + result.Content.Value.Tokens.RefreshToken.ExpiresOn.Should() + .BeNear(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultRefreshTokenExpiry)); +#endif + } + + [Fact] + public async Task WhenCallingSecureApiAfterAuthenticate_ThenReturnsResponse() + { +#if TESTINGONLY + var authenticate = await Api.PostAsync(new AuthenticateSingleSignOnRequest + { + Username = "auser@company.com", + Provider = FakeSSOAuthenticationProvider.SSOName, + AuthCode = "1234567890" + }); + + var accessToken = authenticate.Content.Value.Tokens!.AccessToken.Value; + + var result = await Api.GetAsync(new GetCallerWithTokenOrAPIKeyTestingOnlyRequest(), + req => req.SetJWTBearerToken(accessToken)); + + result.StatusCode.Should().Be(HttpStatusCode.OK); + result.Content.Value.CallerId.Should().Be(authenticate.Content.Value.Tokens.UserId); +#endif + } + + private static void OverrideDependencies(IServiceCollection services) + { + } +} \ No newline at end of file diff --git a/src/IdentityInfrastructure.UnitTests/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidatorSpec.cs b/src/IdentityInfrastructure.UnitTests/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidatorSpec.cs index 03bd56e5..90bb9062 100644 --- a/src/IdentityInfrastructure.UnitTests/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidatorSpec.cs +++ b/src/IdentityInfrastructure.UnitTests/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidatorSpec.cs @@ -19,7 +19,8 @@ public AuthenticateSingleSignOnRequestValidatorSpec() _dto = new AuthenticateSingleSignOnRequest { Provider = "aprovider", - AuthCode = "anauthcode" + AuthCode = "anauthcode", + Username = null }; } @@ -50,4 +51,31 @@ public void WhenAuthCodeIsEmpty_ThenThrows() .Should().Throw() .WithMessageLike(Resources.AuthenticateSingleSignOnRequestValidator_InvalidAuthCode); } + + [Fact] + public void WhenUsernameIsNull_ThenSucceeds() + { + _dto.Username = null; + + _validator.ValidateAndThrow(_dto); + } + + [Fact] + public void WhenUsernameIsValid_ThenSucceeds() + { + _dto.Username = "auser@company.com"; + + _validator.ValidateAndThrow(_dto); + } + + [Fact] + public void WhenUsernameIsInvalid_ThenThrows() + { + _dto.Username = "notanemail"; + + _validator + .Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateSingleSignOnRequestValidator_InvalidUsername); + } } \ No newline at end of file diff --git a/src/IdentityInfrastructure.UnitTests/ApplicationServices/FakeSSOAuthenticationProviderSpec.cs b/src/IdentityInfrastructure.UnitTests/ApplicationServices/FakeSSOAuthenticationProviderSpec.cs new file mode 100644 index 00000000..51d46dd1 --- /dev/null +++ b/src/IdentityInfrastructure.UnitTests/ApplicationServices/FakeSSOAuthenticationProviderSpec.cs @@ -0,0 +1,64 @@ +#if TESTINGONLY +using Application.Interfaces; +using Application.Resources.Shared; +using Common; +using FluentAssertions; +using IdentityInfrastructure.ApplicationServices; +using Infrastructure.Interfaces; +using Moq; +using UnitTesting.Common; +using Xunit; + +namespace IdentityInfrastructure.UnitTests.ApplicationServices; + +[Trait("Category", "Unit")] +public class FakeSSOAuthenticationProviderSpec +{ + private readonly Mock _caller; + private readonly FakeSSOAuthenticationProvider _provider; + + public FakeSSOAuthenticationProviderSpec() + { + _caller = new Mock(); + _provider = new FakeSSOAuthenticationProvider(); + } + + [Fact] + public async Task WhenAuthenticateAsyncAndNoUsername_ThenReturnsError() + { + var result = + await _provider.AuthenticateAsync(_caller.Object, "1234567890", null, CancellationToken.None); + + result.Should().BeError(ErrorCode.RuleViolation, Resources.TestSSOAuthenticationProvider_MissingUsername); + } + + [Fact] + public async Task WhenAuthenticateAsyncAndWrongAuthCode_ThenReturnsError() + { + var result = + await _provider.AuthenticateAsync(_caller.Object, "awrongcode", null, CancellationToken.None); + + result.Should().BeError(ErrorCode.RuleViolation, Resources.TestSSOAuthenticationProvider_MissingUsername); + } + + [Fact] + public async Task WhenAuthenticateAsync_ThenReturnsTokens() + { + var result = + await _provider.AuthenticateAsync(_caller.Object, "1234567890", "anemailaddress", CancellationToken.None); + + result.Should().BeSuccess(); + result.Value.Tokens.Count.Should().Be(1); + result.Value.Tokens[0].Type.Should().Be(TokenType.AccessToken); + result.Value.Tokens[0].Value.Should().NotBeNull(); + result.Value.Tokens[0].ExpiresOn.Should() + .BeCloseTo(DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry), + TimeSpan.FromMinutes(1)); + result.Value.EmailAddress.Should().Be("anemailaddress"); + result.Value.FirstName.Should().Be("anemailaddress"); + result.Value.LastName.Should().Be("asurname"); + result.Value.Timezone.Should().Be(Timezones.Default); + result.Value.CountryCode.Should().Be(CountryCodes.Default); + } +} +#endif \ No newline at end of file diff --git a/src/IdentityInfrastructure/Api/AuthTokens/AuthTokensApi.cs b/src/IdentityInfrastructure/Api/AuthTokens/AuthTokensApi.cs index f08b137d..fe9c5d8d 100644 --- a/src/IdentityInfrastructure/Api/AuthTokens/AuthTokensApi.cs +++ b/src/IdentityInfrastructure/Api/AuthTokens/AuthTokensApi.cs @@ -1,5 +1,5 @@ +using Application.Resources.Shared; using IdentityApplication; -using IdentityApplication.ApplicationServices; using Infrastructure.Interfaces; using Infrastructure.Web.Api.Common.Extensions; using Infrastructure.Web.Api.Interfaces; @@ -19,30 +19,27 @@ public AuthTokensApi(ICallerContextFactory contextFactory, _authTokensApplication = authTokensApplication; } - public async Task Revoke(RevokeRefreshTokenRequest request, + public async Task> Refresh(RefreshTokenRequest request, CancellationToken cancellationToken) { var tokens = - await _authTokensApplication.RevokeRefreshTokenAsync(_contextFactory.Create(), request.RefreshToken, + await _authTokensApplication.RefreshTokenAsync(_contextFactory.Create(), request.RefreshToken, cancellationToken); - return () => tokens.HandleApplicationResult(); + return () => tokens.HandleApplicationResult(tok => + new PostResult(new RefreshTokenResponse + { + Tokens = tok + })); } - public async Task> Refresh(RefreshTokenRequest request, + public async Task Revoke(RevokeRefreshTokenRequest request, CancellationToken cancellationToken) { var tokens = - await _authTokensApplication.RefreshTokenAsync(_contextFactory.Create(), request.RefreshToken, + await _authTokensApplication.RevokeRefreshTokenAsync(_contextFactory.Create(), request.RefreshToken, cancellationToken); - return () => tokens.HandleApplicationResult(x => - new PostResult(new RefreshTokenResponse - { - AccessToken = x.AccessToken, - RefreshToken = x.RefreshToken, - AccessTokenExpiresOnUtc = x.AccessTokenExpiresOn, - RefreshTokenExpiresOnUtc = x.RefreshTokenExpiresOn - })); + return () => tokens.HandleApplicationResult(); } } \ No newline at end of file diff --git a/src/IdentityInfrastructure/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidator.cs b/src/IdentityInfrastructure/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidator.cs index 86953ee3..c8419906 100644 --- a/src/IdentityInfrastructure/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidator.cs +++ b/src/IdentityInfrastructure/Api/PasswordCredentials/AuthenticateSingleSignOnRequestValidator.cs @@ -1,4 +1,6 @@ +using Common.Extensions; using FluentValidation; +using Infrastructure.Web.Api.Common.Validation; using Infrastructure.Web.Api.Operations.Shared.Identities; namespace IdentityInfrastructure.Api.PasswordCredentials; @@ -13,5 +15,10 @@ public AuthenticateSingleSignOnRequestValidator() RuleFor(req => req.AuthCode) .NotEmpty() .WithMessage(Resources.AuthenticateSingleSignOnRequestValidator_InvalidAuthCode); + RuleFor(req => req.Username) + .NotEmpty() + .IsEmailAddress() + .When(req => req.Username.HasValue()) + .WithMessage(Resources.AuthenticateSingleSignOnRequestValidator_InvalidUsername); } } \ No newline at end of file diff --git a/src/IdentityInfrastructure/Api/PasswordCredentials/PasswordCredentialsApi.cs b/src/IdentityInfrastructure/Api/PasswordCredentials/PasswordCredentialsApi.cs index 0ecdc4ee..1c18b98e 100644 --- a/src/IdentityInfrastructure/Api/PasswordCredentials/PasswordCredentialsApi.cs +++ b/src/IdentityInfrastructure/Api/PasswordCredentials/PasswordCredentialsApi.cs @@ -32,11 +32,7 @@ await _passwordCredentialsApplication.AuthenticateAsync(_contextFactory.Create() return () => authenticated.HandleApplicationResult(tok => new PostResult(new AuthenticateResponse { - AccessToken = tok.AccessToken, - RefreshToken = tok.RefreshToken, - AccessTokenExpiresOnUtc = tok.AccessTokenExpiresOn, - RefreshTokenExpiresOnUtc = tok.RefreshTokenExpiresOn, - UserId = tok.UserId + Tokens = tok })); } diff --git a/src/IdentityInfrastructure/Api/SSO/SingleSignOnApi.cs b/src/IdentityInfrastructure/Api/SSO/SingleSignOnApi.cs new file mode 100644 index 00000000..a6b6498b --- /dev/null +++ b/src/IdentityInfrastructure/Api/SSO/SingleSignOnApi.cs @@ -0,0 +1,35 @@ +using Application.Resources.Shared; +using IdentityApplication; +using Infrastructure.Interfaces; +using Infrastructure.Web.Api.Common.Extensions; +using Infrastructure.Web.Api.Interfaces; +using Infrastructure.Web.Api.Operations.Shared.Identities; + +namespace IdentityInfrastructure.Api.SSO; + +public class SingleSignOnApi : IWebApiService +{ + private readonly ICallerContextFactory _contextFactory; + private readonly ISingleSignOnApplication _singleSignOnApplication; + + public SingleSignOnApi(ICallerContextFactory contextFactory, + ISingleSignOnApplication singleSignOnApplication) + { + _contextFactory = contextFactory; + _singleSignOnApplication = singleSignOnApplication; + } + + public async Task> Authenticate( + AuthenticateSingleSignOnRequest request, CancellationToken cancellationToken) + { + var authenticated = + await _singleSignOnApplication.AuthenticateAsync(_contextFactory.Create(), request.Provider, + request.AuthCode, request.Username, cancellationToken); + + return () => authenticated.HandleApplicationResult(tok => + new PostResult(new AuthenticateResponse + { + Tokens = tok + })); + } +} \ No newline at end of file diff --git a/src/IdentityInfrastructure/ApplicationServices/FakeOAuth2Service.cs b/src/IdentityInfrastructure/ApplicationServices/FakeOAuth2Service.cs new file mode 100644 index 00000000..97280204 --- /dev/null +++ b/src/IdentityInfrastructure/ApplicationServices/FakeOAuth2Service.cs @@ -0,0 +1,66 @@ +#if TESTINGONLY +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using Application.Interfaces; +using Application.Resources.Shared; +using Common; +using IdentityApplication.ApplicationServices; +using Infrastructure.Interfaces; +using Infrastructure.Shared; + +namespace IdentityInfrastructure.ApplicationServices; + +/// +/// Provides a fake example OAuth2 service that returns a set of OAuth tokens +/// +public class FakeOAuth2Service : IOAuth2Service +{ + public Task, Error>> ExchangeCodeForTokensAsync(ICallerContext context, + OAuth2CodeTokenExchangeOptions options, + CancellationToken cancellationToken) + { + if (options.Code != "1234567890") + { + return Task.FromResult, Error>>(Error.RuleViolation()); + } + + return Task.FromResult, Error>>(new List + { + CreateAccessToken(options) + }); + } + + public static AuthToken CreateAccessToken(OAuth2CodeTokenExchangeOptions options) + { + var expiresOn = DateTime.UtcNow.Add(AuthenticationConstants.Tokens.DefaultAccessTokenExpiry); + var accessToken = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken( + claims: new Claim[] + { + new(ClaimTypes.Email, options.CodeVerifier!), + new(ClaimTypes.GivenName, options.CodeVerifier!), + new(ClaimTypes.Surname, "asurname"), + new(AuthenticationConstants.Claims.ForTimezone, Timezones.Default.ToString()), + new(ClaimTypes.Country, CountryCodes.Default.ToString()) + }, expires: expiresOn, + issuer: options.ServiceName + )); + + return new AuthToken(TokenType.AccessToken, accessToken, expiresOn); + } + + public static SSOUserInfo GetInfoFromToken(List tokens) + { + var accessToken = tokens.Single(tok => tok.Type == TokenType.AccessToken).Value; + + var claims = new JwtSecurityTokenHandler().ReadJwtToken(accessToken).Claims.ToArray(); + var emailAddress = claims.Single(c => c.Type == ClaimTypes.Email).Value; + var firstName = claims.Single(c => c.Type == ClaimTypes.GivenName).Value; + var lastName = claims.Single(c => c.Type == ClaimTypes.Surname).Value; + var timezone = + Timezones.FindOrDefault(claims.Single(c => c.Type == AuthenticationConstants.Claims.ForTimezone).Value); + var country = CountryCodes.FindOrDefault(claims.Single(c => c.Type == ClaimTypes.Country).Value); + + return new SSOUserInfo(tokens, emailAddress, firstName, lastName, timezone, country); + } +} +#endif \ No newline at end of file diff --git a/src/IdentityInfrastructure/ApplicationServices/FakeSSOAuthenticationProvider.cs b/src/IdentityInfrastructure/ApplicationServices/FakeSSOAuthenticationProvider.cs new file mode 100644 index 00000000..f9d12654 --- /dev/null +++ b/src/IdentityInfrastructure/ApplicationServices/FakeSSOAuthenticationProvider.cs @@ -0,0 +1,53 @@ +#if TESTINGONLY +using Application.Interfaces; +using Common; +using Common.Extensions; +using IdentityApplication.ApplicationServices; +using Infrastructure.Shared; + +namespace IdentityInfrastructure.ApplicationServices; + +/// +/// Provides a fake example that can be copied for real providers, +/// such as Google, Microsoft, Facebook and others +/// +public class FakeSSOAuthenticationProvider : ISSOAuthenticationProvider +{ + public const string SSOName = "testsso"; + private const string ServiceName = "FakeOAuth2Service"; + private readonly IOAuth2Service _auth2Service; + + public FakeSSOAuthenticationProvider() : this(new FakeOAuth2Service()) + { + } + + private FakeSSOAuthenticationProvider(IOAuth2Service auth2Service) + { + _auth2Service = auth2Service; + } + + public async Task> AuthenticateAsync(ICallerContext context, string authCode, + string? emailAddress, CancellationToken cancellationToken) + { + if (emailAddress.HasNoValue()) + { + return Error.RuleViolation(Resources.TestSSOAuthenticationProvider_MissingUsername); + } + + var retrievedTokens = + await _auth2Service.ExchangeCodeForTokensAsync(context, + new OAuth2CodeTokenExchangeOptions(ServiceName, authCode, emailAddress), + cancellationToken); + if (!retrievedTokens.IsSuccessful) + { + return Error.NotAuthenticated(); + } + + var tokens = retrievedTokens.Value; + + return FakeOAuth2Service.GetInfoFromToken(tokens); + } + + public string ProviderName => SSOName; +} +#endif \ No newline at end of file diff --git a/src/IdentityInfrastructure/IdentityInfrastructure.csproj b/src/IdentityInfrastructure/IdentityInfrastructure.csproj index 005be3e1..b3de063a 100644 --- a/src/IdentityInfrastructure/IdentityInfrastructure.csproj +++ b/src/IdentityInfrastructure/IdentityInfrastructure.csproj @@ -7,6 +7,7 @@ + @@ -20,6 +21,9 @@ <_Parameter1>$(AssemblyName).UnitTests + + <_Parameter1>IdentityInfrastructure.IntegrationTests + diff --git a/src/IdentityInfrastructure/IdentityModule.cs b/src/IdentityInfrastructure/IdentityModule.cs index d4fe63eb..451027c5 100644 --- a/src/IdentityInfrastructure/IdentityModule.cs +++ b/src/IdentityInfrastructure/IdentityModule.cs @@ -2,7 +2,9 @@ using Application.Persistence.Interfaces; using Application.Services.Shared; using Common; +using Common.Configuration; using Domain.Interfaces; +using Domain.Services.Shared.DomainServices; using IdentityApplication; using IdentityApplication.ApplicationServices; using IdentityApplication.Persistence; @@ -13,6 +15,7 @@ using IdentityInfrastructure.DomainServices; using IdentityInfrastructure.Persistence; using IdentityInfrastructure.Persistence.ReadModels; +using Infrastructure.Common.DomainServices; using Infrastructure.Hosting.Common.Extensions; using Infrastructure.Persistence.Interfaces; using Infrastructure.Web.Hosting.Common; @@ -51,11 +54,15 @@ public Action RegisterServices services.RegisterUnshared(); services.RegisterUnshared(); services.RegisterUnshared(); + services.RegisterUnshared(c => new AesEncryptionService(c + .ResolveForUnshared().Platform + .GetString("ApplicationServices:SSOProvidersService:SSOUserTokens:AesSecret"))); services.RegisterUnshared(); services.RegisterUnshared(); services.RegisterUnshared(); services.RegisterUnshared(); + services.RegisterUnshared(); services.RegisterUnshared(c => new PasswordCredentialsRepository( c.ResolveForUnshared(), c.ResolveForUnshared(), @@ -74,7 +81,7 @@ public Action RegisterServices c => new AuthTokensProjection(c.ResolveForUnshared(), c.ResolveForUnshared(), c.ResolveForPlatform())); - services.RegisterUnshared(c => new APIKeyRepository( + services.RegisterUnshared(c => new APIKeysRepository( c.ResolveForUnshared(), c.ResolveForUnshared(), c.ResolveForUnshared>(), @@ -83,9 +90,23 @@ public Action RegisterServices c => new APIKeyProjection(c.ResolveForUnshared(), c.ResolveForUnshared(), c.ResolveForPlatform())); + services.RegisterUnshared(c => new SSOUsersRepository( + c.ResolveForUnshared(), + c.ResolveForUnshared(), + c.ResolveForUnshared>(), + c.ResolveForPlatform())); + services.RegisterUnTenantedEventing( + c => new SSOUserProjection(c.ResolveForUnshared(), + c.ResolveForUnshared(), + c.ResolveForPlatform())); services.RegisterUnshared(); services.RegisterUnshared(); + services.RegisterUnshared(); +#if TESTINGONLY + // EXTEND: replace these registrations with your own OAuth2 implementations + services.RegisterUnshared(); +#endif }; } } diff --git a/src/IdentityInfrastructure/Persistence/APIKeyRepository.cs b/src/IdentityInfrastructure/Persistence/APIKeysRepository.cs similarity index 94% rename from src/IdentityInfrastructure/Persistence/APIKeyRepository.cs rename to src/IdentityInfrastructure/Persistence/APIKeysRepository.cs index 492f3bac..3eb69357 100644 --- a/src/IdentityInfrastructure/Persistence/APIKeyRepository.cs +++ b/src/IdentityInfrastructure/Persistence/APIKeysRepository.cs @@ -12,12 +12,12 @@ namespace IdentityInfrastructure.Persistence; -public class APIKeyRepository : IAPIKeyRepository +public class APIKeysRepository : IAPIKeysRepository { private readonly SnapshottingQueryStore _apiKeyQueries; private readonly IEventSourcingDddCommandStore _apiKeys; - public APIKeyRepository(IRecorder recorder, IDomainFactory domainFactory, + public APIKeysRepository(IRecorder recorder, IDomainFactory domainFactory, IEventSourcingDddCommandStore apiKeyStore, IDataStore store) { _apiKeyQueries = new SnapshottingQueryStore(recorder, domainFactory, store); diff --git a/src/IdentityInfrastructure/Persistence/ReadModels/SSOUserProjection.cs b/src/IdentityInfrastructure/Persistence/ReadModels/SSOUserProjection.cs new file mode 100644 index 00000000..7d0fd844 --- /dev/null +++ b/src/IdentityInfrastructure/Persistence/ReadModels/SSOUserProjection.cs @@ -0,0 +1,53 @@ +using Application.Persistence.Common.Extensions; +using Application.Persistence.Interfaces; +using Common; +using Domain.Common.ValueObjects; +using Domain.Interfaces; +using Domain.Interfaces.Entities; +using IdentityApplication.Persistence.ReadModels; +using IdentityDomain; +using Infrastructure.Persistence.Common; +using Infrastructure.Persistence.Interfaces; + +namespace IdentityInfrastructure.Persistence.ReadModels; + +public class SSOUserProjection : IReadModelProjection +{ + private readonly IReadModelProjectionStore _users; + + public SSOUserProjection(IRecorder recorder, IDomainFactory domainFactory, IDataStore store) + { + _users = new ReadModelProjectionStore(recorder, domainFactory, store); + } + + public Type RootAggregateType => typeof(SSOUserRoot); + + public async Task> ProjectEventAsync(IDomainEvent changeEvent, + CancellationToken cancellationToken) + { + switch (changeEvent) + { + case Events.SSOUsers.Created e: + return await _users.HandleCreateAsync(e.RootId.ToId(), dto => + { + dto.UserId = e.UserId; + dto.ProviderName = e.ProviderName; + }, + cancellationToken); + + case Events.SSOUsers.TokensUpdated e: + return await _users.HandleUpdateAsync(e.RootId.ToId(), dto => + { + dto.Tokens = e.Tokens; + dto.EmailAddress = e.EmailAddress; + dto.FirstName = e.FirstName; + dto.LastName = e.LastName; + dto.Timezone = e.Timezone; + dto.CountryCode = e.CountryCode; + }, cancellationToken); + + default: + return false; + } + } +} \ No newline at end of file diff --git a/src/IdentityInfrastructure/Persistence/SSOUsersRepository.cs b/src/IdentityInfrastructure/Persistence/SSOUsersRepository.cs new file mode 100644 index 00000000..b1b0402c --- /dev/null +++ b/src/IdentityInfrastructure/Persistence/SSOUsersRepository.cs @@ -0,0 +1,74 @@ +using Application.Persistence.Interfaces; +using Common; +using Common.Extensions; +using Domain.Common.ValueObjects; +using Domain.Interfaces; +using IdentityApplication.Persistence; +using IdentityApplication.Persistence.ReadModels; +using IdentityDomain; +using Infrastructure.Persistence.Common; +using Infrastructure.Persistence.Interfaces; +using QueryAny; + +namespace IdentityInfrastructure.Persistence; + +public class SSOUsersRepository : ISSOUsersRepository +{ + private readonly ISnapshottingQueryStore _userQueries; + private readonly IEventSourcingDddCommandStore _users; + + public SSOUsersRepository(IRecorder recorder, IDomainFactory domainFactory, + IEventSourcingDddCommandStore usersStore, IDataStore store) + { + _userQueries = new SnapshottingQueryStore(recorder, domainFactory, store); + _users = usersStore; + } + + public async Task> DestroyAllAsync(CancellationToken cancellationToken) + { + return await Tasks.WhenAllAsync( + _userQueries.DestroyAllAsync(cancellationToken), + _users.DestroyAllAsync(cancellationToken)); + } + + public async Task, Error>> FindUserInfoByUserIdAsync(string providerName, + Identifier userId, CancellationToken cancellationToken) + { + var query = Query.From() + .Where(usr => usr.UserId, ConditionOperator.EqualTo, userId) + .AndWhere(usr => usr.ProviderName, ConditionOperator.EqualTo, providerName); + return await FindFirstByQueryAsync(query, cancellationToken); + } + + public async Task> SaveAsync(SSOUserRoot user, CancellationToken cancellationToken) + { + await _users.SaveAsync(user, cancellationToken); + + return user; + } + + private async Task, Error>> FindFirstByQueryAsync( + QueryClause query, + CancellationToken cancellationToken) + { + var queried = await _userQueries.QueryAsync(query, false, cancellationToken); + if (!queried.IsSuccessful) + { + return queried.Error; + } + + var matching = queried.Value.Results.FirstOrDefault(); + if (matching.NotExists()) + { + return Optional.None; + } + + var users = await _users.LoadAsync(matching.Id.Value.ToId(), cancellationToken); + if (!users.IsSuccessful) + { + return users.Error; + } + + return users.Value.ToOptional(); + } +} \ No newline at end of file diff --git a/src/IdentityInfrastructure/Resources.Designer.cs b/src/IdentityInfrastructure/Resources.Designer.cs index 45610723..3ce49531 100644 --- a/src/IdentityInfrastructure/Resources.Designer.cs +++ b/src/IdentityInfrastructure/Resources.Designer.cs @@ -95,6 +95,15 @@ internal static string AuthenticateSingleSignOnRequestValidator_InvalidProvider } } + /// + /// Looks up a localized string similar to The 'Username' is invalid. + /// + internal static string AuthenticateSingleSignOnRequestValidator_InvalidUsername { + get { + return ResourceManager.GetString("AuthenticateSingleSignOnRequestValidator_InvalidUsername", resourceCulture); + } + } + /// /// Looks up a localized string similar to The 'Token' is either missing or invalid. /// @@ -211,5 +220,14 @@ internal static string RevokeRefreshTokenRequestValidator_InvalidToken { return ResourceManager.GetString("RevokeRefreshTokenRequestValidator_InvalidToken", resourceCulture); } } + + /// + /// Looks up a localized string similar to The 'Username' must be provided for this authentication attempt. + /// + internal static string TestSSOAuthenticationProvider_MissingUsername { + get { + return ResourceManager.GetString("TestSSOAuthenticationProvider_MissingUsername", resourceCulture); + } + } } } diff --git a/src/IdentityInfrastructure/Resources.resx b/src/IdentityInfrastructure/Resources.resx index 9041af7a..6d972222 100644 --- a/src/IdentityInfrastructure/Resources.resx +++ b/src/IdentityInfrastructure/Resources.resx @@ -75,4 +75,10 @@ The 'AuthCode' is invalid or missing + + The 'Username' is invalid + + + The 'Username' must be provided for this authentication attempt + \ No newline at end of file diff --git a/src/Infrastructure.Interfaces/AuthenticationConstants.cs b/src/Infrastructure.Interfaces/AuthenticationConstants.cs index 880e6137..0befe229 100644 --- a/src/Infrastructure.Interfaces/AuthenticationConstants.cs +++ b/src/Infrastructure.Interfaces/AuthenticationConstants.cs @@ -11,6 +11,7 @@ public static class Claims public const string ForRole = ClaimTypes.Role; public const string PlatformPrefix = "Platform"; public const string TenantPrefix = "Tenant"; + public const string ForTimezone = "zoneinfo"; } public static class Authorization @@ -30,7 +31,6 @@ public static class Cookies public static class Providers { public const string Credentials = "credentials"; - public const string SingleSignOn = "sso"; } public static class Tokens diff --git a/src/Infrastructure.Shared/ApplicationServices/OAuth2HttpServiceClient.cs b/src/Infrastructure.Shared/ApplicationServices/OAuth2HttpServiceClient.cs new file mode 100644 index 00000000..17e1b0af --- /dev/null +++ b/src/Infrastructure.Shared/ApplicationServices/OAuth2HttpServiceClient.cs @@ -0,0 +1,70 @@ +using Application.Common; +using Application.Interfaces; +using Application.Resources.Shared; +using Common; +using Common.Extensions; +using Infrastructure.Web.Api.Operations.Shared._3rdParties; +using Infrastructure.Web.Interfaces.Clients; + +namespace Infrastructure.Shared.ApplicationServices; + +/// +/// Provides a general purpose OAuth2 service client for exchanging authorization codes for tokens. +/// Assumes The OAuth 2.0 Authorization Framework +/// +public class OAuth2HttpServiceClient : IOAuth2Service +{ + private readonly string _clientId; + private readonly string? _clientSecret; + private readonly IRecorder _recorder; + private readonly string _redirectUri; + private readonly IServiceClient _serviceClient; + + public OAuth2HttpServiceClient(IRecorder recorder, IServiceClient serviceClient, string clientId, + string? clientSecret, string redirectUri) + { + _recorder = recorder; + _serviceClient = serviceClient; + _clientId = clientId; + _clientSecret = clientSecret; + _redirectUri = redirectUri; + } + + public async Task, Error>> ExchangeCodeForTokensAsync(ICallerContext context, + OAuth2CodeTokenExchangeOptions options, CancellationToken cancellationToken) + { + try + { + var response = await _serviceClient.PostAsync(context, new ExchangeOAuth2CodeForTokensRequest + { + GrantType = "authorization_code", + Code = options.Code, + ClientId = _clientId, + ClientSecret = _clientSecret, + Scope = options.Scope, + RedirectUri = _redirectUri + }, null, cancellationToken); + + var tokens = new List(); + if (!response.IsSuccessful) + { + return Error.NotAuthenticated(response.Error.Detail ?? response.Error.Title); + } + + var expiresOn = DateTime.UtcNow.Add(TimeSpan.FromSeconds(response.Value.ExpiresIn)); + tokens.Add(new AuthToken(TokenType.AccessToken, response.Value.AccessToken!, expiresOn)); + if (response.Value.RefreshToken.HasValue()) + { + tokens.Add(new AuthToken(TokenType.RefreshToken, response.Value.AccessToken!, null)); + } + + return tokens; + } + catch (Exception ex) + { + _recorder.TraceError(context.ToCall(), ex, "Failed to exchange OAuth2 code with OAuth2 server {Server}", + options.ServiceName); + return Error.Unexpected(ex.Message); + } + } +} \ No newline at end of file diff --git a/src/Infrastructure.Shared/IOAuth2Service.cs b/src/Infrastructure.Shared/IOAuth2Service.cs new file mode 100644 index 00000000..24885bc0 --- /dev/null +++ b/src/Infrastructure.Shared/IOAuth2Service.cs @@ -0,0 +1,41 @@ +using Application.Interfaces; +using Application.Resources.Shared; +using Common; +using Common.Extensions; + +namespace Infrastructure.Shared; + +/// +/// Defines a service for exchanging OAuth2 codes for tokens +/// +public interface IOAuth2Service +{ + Task, Error>> ExchangeCodeForTokensAsync(ICallerContext context, + OAuth2CodeTokenExchangeOptions options, + CancellationToken cancellationToken); +} + +/// +/// Defines options for token exchange +/// +public class OAuth2CodeTokenExchangeOptions +{ + public OAuth2CodeTokenExchangeOptions(string serviceName, string code, string? codeVerifier = null, + string? scope = null) + { + serviceName.ThrowIfNotValuedParameter(nameof(serviceName)); + code.ThrowIfNotValuedParameter(nameof(code)); + ServiceName = serviceName; + Code = code; + CodeVerifier = codeVerifier; + Scope = scope; + } + + public string Code { get; } + + public string? CodeVerifier { get; } + + public string? Scope { get; } + + public string ServiceName { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure.Shared/Infrastructure.Shared.csproj b/src/Infrastructure.Shared/Infrastructure.Shared.csproj index b0446aab..3475be91 100644 --- a/src/Infrastructure.Shared/Infrastructure.Shared.csproj +++ b/src/Infrastructure.Shared/Infrastructure.Shared.csproj @@ -30,6 +30,8 @@ + + diff --git a/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensRequest.cs b/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensRequest.cs new file mode 100644 index 00000000..f490d50b --- /dev/null +++ b/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensRequest.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; +using Infrastructure.Web.Api.Interfaces; + +namespace Infrastructure.Web.Api.Operations.Shared._3rdParties; + +[Route("/auth/token", ServiceOperation.Post)] +public class ExchangeOAuth2CodeForTokensRequest : UnTenantedRequest +{ + [JsonPropertyName("client_id")] public required string ClientId { get; set; } + + [JsonPropertyName("client_secret")] public string? ClientSecret { get; set; } + + [JsonPropertyName("code")] public required string Code { get; set; } + + [JsonPropertyName("grant_type")] public required string GrantType { get; set; } + + [JsonPropertyName("redirect_uri")] public required string RedirectUri { get; set; } + + [JsonPropertyName("scope")] public string? Scope { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensResponse.cs b/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensResponse.cs new file mode 100644 index 00000000..f654e26e --- /dev/null +++ b/src/Infrastructure.Web.Api.Operations.Shared/3rdParties/ExchangeOAuth2CodeForTokensResponse.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; +using Infrastructure.Web.Api.Interfaces; + +namespace Infrastructure.Web.Api.Operations.Shared._3rdParties; + +public class ExchangeOAuth2CodeForTokensResponse : IWebResponse +{ + [JsonPropertyName("access_token")] public string? AccessToken { get; set; } + + [JsonPropertyName("expires_in")] public int ExpiresIn { get; set; } + + [JsonPropertyName("refresh_token")] public string? RefreshToken { get; set; } + + [JsonPropertyName("token_type")] public string? TokenType { get; set; } +} \ No newline at end of file diff --git a/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateResponse.cs b/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateResponse.cs index d734ebef..24152ebf 100644 --- a/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateResponse.cs +++ b/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateResponse.cs @@ -1,16 +1,9 @@ +using Application.Resources.Shared; using Infrastructure.Web.Api.Interfaces; namespace Infrastructure.Web.Api.Operations.Shared.Identities; public class AuthenticateResponse : IWebResponse { - public string? AccessToken { get; set; } - - public DateTime? AccessTokenExpiresOnUtc { get; set; } - - public string? RefreshToken { get; set; } - - public DateTime? RefreshTokenExpiresOnUtc { get; set; } - - public string? UserId { get; set; } + public AuthenticateTokens? Tokens { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateSingleSignOnRequest.cs b/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateSingleSignOnRequest.cs index 11415830..0e250c93 100644 --- a/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateSingleSignOnRequest.cs +++ b/src/Infrastructure.Web.Api.Operations.Shared/Identities/AuthenticateSingleSignOnRequest.cs @@ -8,4 +8,6 @@ public class AuthenticateSingleSignOnRequest : UnTenantedRequest { public required string RefreshToken { get; set; } diff --git a/src/Infrastructure.Web.Api.Operations.Shared/Identities/RefreshTokenResponse.cs b/src/Infrastructure.Web.Api.Operations.Shared/Identities/RefreshTokenResponse.cs index 0936bc7a..c295b1bc 100644 --- a/src/Infrastructure.Web.Api.Operations.Shared/Identities/RefreshTokenResponse.cs +++ b/src/Infrastructure.Web.Api.Operations.Shared/Identities/RefreshTokenResponse.cs @@ -1,14 +1,9 @@ +using Application.Resources.Shared; using Infrastructure.Web.Api.Interfaces; namespace Infrastructure.Web.Api.Operations.Shared.Identities; public class RefreshTokenResponse : IWebResponse { - public string? AccessToken { get; set; } - - public DateTime? AccessTokenExpiresOnUtc { get; set; } - - public string? RefreshToken { get; set; } - - public DateTime? RefreshTokenExpiresOnUtc { get; set; } + public AuthenticateTokens? Tokens { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure.Web.Api.Operations.Shared/Identities/RevokeRefreshTokenRequest.cs b/src/Infrastructure.Web.Api.Operations.Shared/Identities/RevokeRefreshTokenRequest.cs index cf5c39d1..7e37990f 100644 --- a/src/Infrastructure.Web.Api.Operations.Shared/Identities/RevokeRefreshTokenRequest.cs +++ b/src/Infrastructure.Web.Api.Operations.Shared/Identities/RevokeRefreshTokenRequest.cs @@ -2,7 +2,7 @@ namespace Infrastructure.Web.Api.Operations.Shared.Identities; -[Route("tokens/{RefreshToken}", ServiceOperation.Delete)] +[Route("/tokens/{RefreshToken}", ServiceOperation.Delete)] public class RevokeRefreshTokenRequest : UnTenantedDeleteRequest { public required string RefreshToken { get; set; } diff --git a/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticateRequestValidatorSpec.cs b/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticateRequestValidatorSpec.cs index e33d598e..b1959431 100644 --- a/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticateRequestValidatorSpec.cs +++ b/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticateRequestValidatorSpec.cs @@ -2,6 +2,7 @@ using FluentValidation; using Infrastructure.Interfaces; using Infrastructure.Web.Api.Operations.Shared.BackEndForFrontEnd; +using JetBrains.Annotations; using UnitTesting.Common.Validation; using WebsiteHost; using WebsiteHost.Api.AuthN; @@ -9,100 +10,169 @@ namespace Infrastructure.Web.Website.UnitTests.Api.AuthN; -[Trait("Category", "Unit")] +[UsedImplicitly] public class AuthenticateRequestValidatorSpec { - private readonly AuthenticateRequest _dto; - private readonly AuthenticateRequestValidator _validator; - - public AuthenticateRequestValidatorSpec() + [Trait("Category", "Unit")] + public class GivenCredentialsProvider { - _validator = new AuthenticateRequestValidator(); - _dto = new AuthenticateRequest + private readonly AuthenticateRequest _dto; + private readonly AuthenticateRequestValidator _validator; + + public GivenCredentialsProvider() { - Provider = AuthenticationConstants.Providers.Credentials, - Username = "auser@company.com", - Password = "1Password!" - }; - } + _validator = new AuthenticateRequestValidator(); + _dto = new AuthenticateRequest + { + Provider = AuthenticationConstants.Providers.Credentials, + Username = "auser@company.com", + Password = "1Password!" + }; + } + + [Fact] + public void WhenAllProperties_ThenSucceeds() + { + _validator.ValidateAndThrow(_dto); + } - [Fact] - public void WhenAllProperties_ThenSucceeds() - { - _validator.ValidateAndThrow(_dto); - } + [Fact] + public void WhenProviderIsEmpty_ThenThrows() + { + _dto.Provider = string.Empty; - [Fact] - public void WhenProviderIsEmpty_TheThrows() - { - _dto.Provider = string.Empty; + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidProvider); + } - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidProvider); - } + [Fact] + public void WhenUsernameIsEmpty_ThenThrows() + { + _dto.Provider = AuthenticationConstants.Providers.Credentials; + _dto.Username = string.Empty; - [Fact] - public void WhenProviderIsCredentialsAndUsernameIsEmpty_TheThrows() - { - _dto.Provider = AuthenticationConstants.Providers.Credentials; - _dto.Username = string.Empty; + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidUsername); + } - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidUsername); - } + [Fact] + public void WhenUsernameIsNotValid_ThenThrows() + { + _dto.Provider = AuthenticationConstants.Providers.Credentials; + _dto.Username = "notanemail"; - [Fact] - public void WhenProviderIsCredentialsAndUsernameIsNotValid_TheThrows() - { - _dto.Provider = AuthenticationConstants.Providers.Credentials; - _dto.Username = "notanemail"; + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidUsername); + } - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidUsername); - } + [Fact] + public void WhenPasswordIsEmpty_ThenThrows() + { + _dto.Provider = AuthenticationConstants.Providers.Credentials; + _dto.Password = string.Empty; - [Fact] - public void WhenProviderIsCredentialsAndPasswordIsEmpty_TheThrows() - { - _dto.Provider = AuthenticationConstants.Providers.Credentials; - _dto.Password = string.Empty; + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidPassword); + } - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidPassword); + [Fact] + public void WhenPasswordIsNotValid_ThenThrows() + { + _dto.Provider = AuthenticationConstants.Providers.Credentials; + _dto.Password = "notapassword"; + + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidPassword); + } } - [Fact] - public void WhenProviderIsCredentialsAndPasswordIsNotValid_TheThrows() + [Trait("Category", "Unit")] + public class GivenAnotherProvider { - _dto.Provider = AuthenticationConstants.Providers.Credentials; - _dto.Password = "notapassword"; + private readonly AuthenticateRequest _dto; + private readonly AuthenticateRequestValidator _validator; - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidPassword); - } + public GivenAnotherProvider() + { + _validator = new AuthenticateRequestValidator(); + _dto = new AuthenticateRequest + { + Provider = "aprovider", + AuthCode = "anauthcode" + }; + } + + [Fact] + public void WhenAllProperties_ThenSucceeds() + { + _validator.ValidateAndThrow(_dto); + } - [Fact] - public void WhenProviderIsSingleSignOnAndAuthCodeIsEmpty_TheThrows() - { - _dto.Provider = AuthenticationConstants.Providers.SingleSignOn; - _dto.AuthCode = string.Empty; + [Fact] + public void WhenProviderIsEmpty_ThenThrows() + { + _dto.Provider = string.Empty; - _validator.Invoking(x => x.ValidateAndThrow(_dto)) - .Should().Throw() - .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidAuthCode); - } + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidProvider); + } - [Fact] - public void WhenProviderIsSingleSignOnAndAuthCodeIsNotEmpty_TheSucceeds() - { - _dto.Provider = AuthenticationConstants.Providers.SingleSignOn; - _dto.AuthCode = "anauthcode"; + [Fact] + public void WhenAuthCodeIsEmpty_ThenThrows() + { + _dto.Provider = "aprovider"; + _dto.AuthCode = string.Empty; + + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidAuthCode); + } + + [Fact] + public void WhenAuthCodeIsNotEmpty_ThenSucceeds() + { + _dto.Provider = "aprovider"; + _dto.AuthCode = "anauthcode"; + + _validator.ValidateAndThrow(_dto); + } + + [Fact] + public void WhenUsernameIsNotValid_ThenThrows() + { + _dto.Provider = "aprovider"; + _dto.AuthCode = "anauthcode"; + _dto.Username = "notanemail"; + + _validator.Invoking(x => x.ValidateAndThrow(_dto)) + .Should().Throw() + .WithMessageLike(Resources.AuthenticateRequestValidator_InvalidUsername); + } + + [Fact] + public void WhenUsernameIsNull_ThenSucceeds() + { + _dto.Provider = "aprovider"; + _dto.AuthCode = "anauthcode"; + _dto.Username = null; + + _validator.ValidateAndThrow(_dto); + } + + [Fact] + public void WhenUsernameIsValid_ThenSucceeds() + { + _dto.Provider = "aprovider"; + _dto.AuthCode = "anauthcode"; + _dto.Username = "auser@company.com"; - _validator.ValidateAndThrow(_dto); + _validator.ValidateAndThrow(_dto); + } } } \ No newline at end of file diff --git a/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticationApiSpec.cs b/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticationApiSpec.cs index 0d161e05..349af595 100644 --- a/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticationApiSpec.cs +++ b/src/Infrastructure.Web.Website.UnitTests/Api/AuthN/AuthenticationApiSpec.cs @@ -66,11 +66,17 @@ public async Task WhenAuthenticate_ThenSetsCookies() It.IsAny())) .ReturnsAsync(new AuthenticateTokens { - AccessToken = "anaccesstoken", - RefreshToken = "arefreshtoken", UserId = "auserid", - AccessTokenExpiresOn = accessTokenExpiresOn, - RefreshTokenExpiresOn = refreshTokenExpiresOn + AccessToken = new AuthenticateToken + { + Value = "anaccesstoken", + ExpiresOn = accessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = "arefreshtoken", + ExpiresOn = refreshTokenExpiresOn + } }); await _api.Authenticate(new AuthenticateRequest @@ -126,11 +132,17 @@ public async Task WhenRefreshAndCookieExists_ThenSetsCookies() It.IsAny())) .ReturnsAsync(new AuthenticateTokens { - AccessToken = "anaccesstoken", - RefreshToken = "arefreshtoken", UserId = "auserid", - AccessTokenExpiresOn = accessTokenExpiresOn, - RefreshTokenExpiresOn = refreshTokenExpiresOn + AccessToken = new AuthenticateToken + { + Value = "anaccesstoken", + ExpiresOn = accessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = "arefreshtoken", + ExpiresOn = refreshTokenExpiresOn + } }); await _api.RefreshToken(new RefreshTokenRequest(), CancellationToken.None); @@ -145,6 +157,5 @@ public async Task WhenRefreshAndCookieExists_ThenSetsCookies() c.Append(AuthenticationConstants.Cookies.RefreshToken, "arefreshtoken", It.Is(opt => opt.Expires!.Value.DateTime == refreshTokenExpiresOn ))); - } } \ No newline at end of file diff --git a/src/Infrastructure.Web.Website.UnitTests/Application/AuthenticationApplicationSpec.cs b/src/Infrastructure.Web.Website.UnitTests/Application/AuthenticationApplicationSpec.cs index 17ef4195..d74b9a2d 100644 --- a/src/Infrastructure.Web.Website.UnitTests/Application/AuthenticationApplicationSpec.cs +++ b/src/Infrastructure.Web.Website.UnitTests/Application/AuthenticationApplicationSpec.cs @@ -1,4 +1,5 @@ using Application.Interfaces; +using Application.Resources.Shared; using Common; using FluentAssertions; using Infrastructure.Interfaces; @@ -48,21 +49,30 @@ public async Task WhenAuthenticateWithCredentials_ThenAuthenticates() null, It.IsAny())) .Returns(Task.FromResult>(new AuthenticateResponse { - UserId = "auserid", - AccessToken = "anaccesstoken", - RefreshToken = "arefreshtoken", - AccessTokenExpiresOnUtc = accessTokenExpiresOn, - RefreshTokenExpiresOnUtc = refreshTokenExpiresOn + Tokens = new AuthenticateTokens + { + UserId = "auserid", + AccessToken = new AuthenticateToken + { + Value = "anaccesstoken", + ExpiresOn = accessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = "arefreshtoken", + ExpiresOn = refreshTokenExpiresOn + } + } })); var result = await _application.AuthenticateAsync(_caller.Object, AuthenticationConstants.Providers.Credentials, null, "ausername", "apassword", CancellationToken.None); - result.Value.AccessToken.Should().Be("anaccesstoken"); - result.Value.RefreshToken.Should().Be("arefreshtoken"); - result.Value.AccessTokenExpiresOn.Should().Be(accessTokenExpiresOn); - result.Value.RefreshTokenExpiresOn.Should().Be(refreshTokenExpiresOn); result.Value.UserId.Should().Be("auserid"); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(accessTokenExpiresOn); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.RefreshToken.ExpiresOn.Should().Be(refreshTokenExpiresOn); _serviceClient.Verify(sc => sc.PostAsync(_caller.Object, It.Is(req => req.Username == "ausername" && req.Password == "apassword" @@ -80,22 +90,31 @@ public async Task WhenAuthenticateWithSingleSignOn_ThenAuthenticates() null, It.IsAny())) .Returns(Task.FromResult>(new AuthenticateResponse { - UserId = "auserid", - AccessToken = "anaccesstoken", - RefreshToken = "arefreshtoken", - AccessTokenExpiresOnUtc = accessTokenExpiresOn, - RefreshTokenExpiresOnUtc = refreshTokenExpiresOn + Tokens = new AuthenticateTokens + { + UserId = "auserid", + AccessToken = new AuthenticateToken + { + Value = "anaccesstoken", + ExpiresOn = accessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = "arefreshtoken", + ExpiresOn = refreshTokenExpiresOn + } + } + })); - var result = await _application.AuthenticateAsync(_caller.Object, - AuthenticationConstants.Providers.SingleSignOn, - "anauthcode", null, null, CancellationToken.None); + var result = await _application.AuthenticateAsync(_caller.Object, "aprovider", "anauthcode", null, null, + CancellationToken.None); - result.Value.AccessToken.Should().Be("anaccesstoken"); - result.Value.RefreshToken.Should().Be("arefreshtoken"); - result.Value.AccessTokenExpiresOn.Should().Be(accessTokenExpiresOn); - result.Value.RefreshTokenExpiresOn.Should().Be(refreshTokenExpiresOn); result.Value.UserId.Should().Be("auserid"); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(accessTokenExpiresOn); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.RefreshToken.ExpiresOn.Should().Be(refreshTokenExpiresOn); _serviceClient.Verify(sc => sc.PostAsync(_caller.Object, It.Is(req => req.AuthCode == "anauthcode" ), null, It.IsAny())); @@ -125,20 +144,30 @@ public async Task WhenRefreshTokenCookieExists_ThenRefreshesAndSetsCookie() null, It.IsAny())) .Returns(Task.FromResult>(new RefreshTokenResponse { - AccessToken = "anaccesstoken", - RefreshToken = "arefreshtoken", - AccessTokenExpiresOnUtc = accessTokenExpiresOn, - RefreshTokenExpiresOnUtc = refreshTokenExpiresOn + Tokens = new AuthenticateTokens + { + UserId = "auserid", + AccessToken = new AuthenticateToken + { + Value = "anaccesstoken", + ExpiresOn = accessTokenExpiresOn + }, + RefreshToken = new AuthenticateToken + { + Value = "arefreshtoken", + ExpiresOn = refreshTokenExpiresOn + } + } })); var result = await _application.RefreshTokenAsync(_caller.Object, "arefreshtoken", CancellationToken.None); result.Should().BeSuccess(); - result.Value.AccessToken.Should().Be("anaccesstoken"); - result.Value.RefreshToken.Should().Be("arefreshtoken"); - result.Value.AccessTokenExpiresOn.Should().Be(accessTokenExpiresOn); - result.Value.RefreshTokenExpiresOn.Should().Be(refreshTokenExpiresOn); - result.Value.UserId.Should().BeNull(); + result.Value.UserId.Should().Be("auserid"); + result.Value.AccessToken.Value.Should().Be("anaccesstoken"); + result.Value.AccessToken.ExpiresOn.Should().Be(accessTokenExpiresOn); + result.Value.RefreshToken.Value.Should().Be("arefreshtoken"); + result.Value.RefreshToken.ExpiresOn.Should().Be(refreshTokenExpiresOn); _serviceClient.Verify( sc => sc.PostAsync(_caller.Object, It.Is(req => req.RefreshToken == "arefreshtoken" diff --git a/src/IntegrationTesting.WebApi.Common/WebApiSpec.cs b/src/IntegrationTesting.WebApi.Common/WebApiSpec.cs index 47423f9f..723c61c5 100644 --- a/src/IntegrationTesting.WebApi.Common/WebApiSpec.cs +++ b/src/IntegrationTesting.WebApi.Common/WebApiSpec.cs @@ -210,8 +210,8 @@ await Api.PostAsync(new ConfirmRegistrationPersonPasswordRequest Password = password }); - var accessToken = login.Content.Value.AccessToken!; - var refreshToken = login.Content.Value.RefreshToken!; + var accessToken = login.Content.Value.Tokens!.AccessToken.Value; + var refreshToken = login.Content.Value.Tokens.RefreshToken.Value; var user = person.Content.Value.Credential!.User; return new LoginDetails(accessToken, refreshToken, user); diff --git a/src/SaaStack.sln.DotSettings b/src/SaaStack.sln.DotSettings index 0392cffc..00ac5194 100644 --- a/src/SaaStack.sln.DotSettings +++ b/src/SaaStack.sln.DotSettings @@ -323,6 +323,7 @@ IANA MFA JWT + SSO <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="Configure" Suffix="" Style="AaBb" /></Policy> <Policy Inspect="True" Prefix="When" Suffix="" Style="AaBb_AaBb"><ExtraRule Prefix="" Suffix="" Style="AaBb" /><ExtraRule Prefix="Setup" Suffix="" Style="AaBb" /><ExtraRule Prefix="Configure" Suffix="" Style="AaBb" /></Policy> @@ -671,7 +672,7 @@ using Domain.Interfaces.Entities; using Domain.Interfaces.Services; using QueryAny; -// TODO: delete this attribute if your root aggregate is using event sourcing, instead of snapshotting +// TODO: DELETE this attribute if EventSourcing, LEAVE if Snapshotting [EntityName("$name$")] public sealed class $name$Root : AggregateRootBase { @@ -686,19 +687,19 @@ public sealed class $name$Root : AggregateRootBase { } - // TODO: delete this constructor if your root aggregate is using snapshotting, instead of event sourcing + // TODO: LEAVE this constructor if EventSourcing, DELETE if Snapshotting private $name$Root(IRecorder recorder, IIdentifierFactory idFactory, ISingleValueObject<string> identifier) : base(recorder, idFactory, identifier) { } - // TODO: delete this constructor if your root aggregate is using event sourcing, instead of snapshotting + // TODO: DELETE this constructor if EventSourcing, LEAVE if Snapshotting private $name$Root(Identifier identifier, IDependencyContainer container, RehydratingProperties rehydratingProperties) : base(identifier, container, rehydratingProperties) { $propertyname$ = rehydratingProperties.GetValueOrDefault<Name>(nameof($propertyname$)); OrganizationId = rehydratingProperties.GetValueOrDefault<Identifier>(nameof(OrganizationId))!; } - // TODO: delete this method if your root aggregate is using event sourcing, instead of snapshotting + // TODO: DELETE this method if EventSourcing, LEAVE if Snapshotting public override Dictionary<string, object?> Dehydrate() { var properties = base.Dehydrate(); @@ -707,12 +708,13 @@ public sealed class $name$Root : AggregateRootBase return properties; } - // TODO: delete this method if your root aggregate is using event sourcing, instead of snapshotting + // TODO: DELETE this method if EventSourcing, LEAVE if Snapshotting public static AggregateRootFactory<$name$Root> Rehydrate() { return (identifier, container, properties) => new $name$Root(identifier, container, properties); } - // TODO: delete this method if your root aggregate is using snapshotting, instead of event sourcing + + // TODO: LEAVE this method if EventSourcing, DELETE if Snapshotting public static AggregateRootFactory<$name$Root> Rehydrate() { return (identifier, container, properties) => new $name$Root(container.Resolve<IRecorder>(), container.Resolve<IIdentifierFactory>(), identifier); @@ -813,6 +815,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -824,6 +827,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -857,6 +861,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -897,6 +902,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -914,6 +920,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -921,6 +928,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True @@ -948,8 +956,10 @@ public void When$condition$_Then$outcome$() True True True + True True True + True True True True @@ -967,6 +977,7 @@ public void When$condition$_Then$outcome$() True True True + True True True True diff --git a/src/WebsiteHost/Api/AuthN/AuthenticateRequestValidator.cs b/src/WebsiteHost/Api/AuthN/AuthenticateRequestValidator.cs index db2336a3..d9cd846a 100644 --- a/src/WebsiteHost/Api/AuthN/AuthenticateRequestValidator.cs +++ b/src/WebsiteHost/Api/AuthN/AuthenticateRequestValidator.cs @@ -1,3 +1,4 @@ +using Common.Extensions; using Domain.Interfaces.Validations; using FluentValidation; using Infrastructure.Interfaces; @@ -13,19 +14,27 @@ public AuthenticateRequestValidator() RuleFor(req => req.Provider) .NotEmpty() .WithMessage(Resources.AuthenticateRequestValidator_InvalidProvider); - RuleFor(req => req.Username) - .NotEmpty() - .IsEmailAddress() - .When(req => req.Provider == AuthenticationConstants.Providers.Credentials) - .WithMessage(Resources.AuthenticateRequestValidator_InvalidUsername); - RuleFor(req => req.Password) - .NotEmpty() - .Matches(CommonValidations.Passwords.Password.Strict) - .When(req => req.Provider == AuthenticationConstants.Providers.Credentials) - .WithMessage(Resources.AuthenticateRequestValidator_InvalidPassword); - RuleFor(req => req.AuthCode) - .NotEmpty() - .When(req => req.Provider != AuthenticationConstants.Providers.Credentials) - .WithMessage(Resources.AuthenticateRequestValidator_InvalidAuthCode); + When(req => req.Provider == AuthenticationConstants.Providers.Credentials, () => + { + RuleFor(req => req.Username) + .NotEmpty() + .IsEmailAddress() + .WithMessage(Resources.AuthenticateRequestValidator_InvalidUsername); + RuleFor(req => req.Password) + .NotEmpty() + .Matches(CommonValidations.Passwords.Password.Strict) + .WithMessage(Resources.AuthenticateRequestValidator_InvalidPassword); + }); + When(req => req.Provider != AuthenticationConstants.Providers.Credentials, () => + { + RuleFor(req => req.AuthCode) + .NotEmpty() + .WithMessage(Resources.AuthenticateRequestValidator_InvalidAuthCode); + RuleFor(req => req.Username) + .NotEmpty() + .IsEmailAddress() + .When(req => req.Username.HasValue()) + .WithMessage(Resources.AuthenticateRequestValidator_InvalidUsername); + }); } } \ No newline at end of file diff --git a/src/WebsiteHost/Api/AuthN/AuthenticationApi.cs b/src/WebsiteHost/Api/AuthN/AuthenticationApi.cs index 54bd8226..5e28f6f0 100644 --- a/src/WebsiteHost/Api/AuthN/AuthenticationApi.cs +++ b/src/WebsiteHost/Api/AuthN/AuthenticationApi.cs @@ -69,10 +69,10 @@ await _authenticationApplication.RefreshTokenAsync(_contextFactory.Create(), ref private static void PopulateCookies(HttpResponse response, AuthenticateTokens tokens) { - response.Cookies.Append(AuthenticationConstants.Cookies.Token, tokens.AccessToken, - GetCookieOptions(tokens.AccessTokenExpiresOn)); - response.Cookies.Append(AuthenticationConstants.Cookies.RefreshToken, tokens.RefreshToken, - GetCookieOptions(tokens.RefreshTokenExpiresOn)); + response.Cookies.Append(AuthenticationConstants.Cookies.Token, tokens.AccessToken.Value, + GetCookieOptions(tokens.AccessToken.ExpiresOn)); + response.Cookies.Append(AuthenticationConstants.Cookies.RefreshToken, tokens.RefreshToken.Value, + GetCookieOptions(tokens.RefreshToken.ExpiresOn)); } private static void DeleteAuthenticationCookies(HttpResponse response) diff --git a/src/WebsiteHost/Application/AuthenticationApplication.cs b/src/WebsiteHost/Application/AuthenticationApplication.cs index a9eb6af5..e862762a 100644 --- a/src/WebsiteHost/Application/AuthenticationApplication.cs +++ b/src/WebsiteHost/Application/AuthenticationApplication.cs @@ -89,19 +89,11 @@ internal static class AuthenticationConversionExtensions { public static AuthenticateTokens ToTokens(this AuthenticateResponse response) { - var tokens = response.Convert(); - tokens.AccessTokenExpiresOn = response.AccessTokenExpiresOnUtc ?? DateTime.UtcNow; - tokens.RefreshTokenExpiresOn = response.RefreshTokenExpiresOnUtc ?? DateTime.UtcNow; - - return tokens; + return response.Tokens!; } public static AuthenticateTokens ToTokens(this RefreshTokenResponse response) { - var tokens = response.Convert(); - tokens.AccessTokenExpiresOn = response.AccessTokenExpiresOnUtc ?? DateTime.UtcNow; - tokens.RefreshTokenExpiresOn = response.RefreshTokenExpiresOnUtc ?? DateTime.UtcNow; - - return tokens; + return response.Tokens!; } } \ No newline at end of file