Skip to content
This repository was archived by the owner on Sep 26, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2b87d22
Add very basic pkce endpoints and related actions on google auth
N-lson Mar 16, 2022
4719713
First version of code verifier and code challenge
N-lson Mar 16, 2022
f7440f2
More pkce stuff
N-lson Mar 17, 2022
94121e9
Add client secret
N-lson Mar 17, 2022
54b03c4
use HasClientSecret in AuthTokenHandler.cs
N-lson Mar 17, 2022
13934ca
Move Pkce stuff into existing AuthenticationAction
N-lson Mar 17, 2022
437406e
Add client_secret to authenticated action
N-lson Mar 17, 2022
c2e3310
Use HasClientSecret for everything
N-lson Mar 17, 2022
57a4e3d
A lot of renaming and remove client secret stuff from OctopusID
N-lson Mar 17, 2022
b54f2d0
code challenge/verifier improvements
N-lson Mar 17, 2022
8806827
Remove nonce comparison from Pkce action
N-lson Mar 17, 2022
6ba54d3
Check if state exists
N-lson Mar 17, 2022
028eb91
Validate on id token
N-lson Mar 17, 2022
919df03
Clean up
N-lson Mar 18, 2022
5df8a37
Updates for Okta
N-lson Mar 18, 2022
8e15436
AAD and OctopusID classes
N-lson Mar 22, 2022
32740b1
remove old store
N-lson Mar 22, 2022
a415e81
Add actions
N-lson Mar 22, 2022
096f66c
Use blob storage to store code verifier
N-lson Mar 29, 2022
e79f046
Update code verifier generation
N-lson Mar 30, 2022
28ffa70
Clean up
N-lson Apr 11, 2022
e593661
Update MessageContracts version
N-lson Apr 11, 2022
4762155
Remove imports
N-lson Apr 11, 2022
232a483
refactor wip
N-lson Apr 14, 2022
c2eea8e
Refactor into handler
N-lson Apr 14, 2022
e9548c1
Make pkce stuff in authentication action a bit clearer
N-lson Apr 14, 2022
c2f643f
Move cancellation token up
N-lson Apr 20, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Octopus.Client.Extensibility.Authentication.OctopusID.Configuration
{
[Description("Sign in to your Octopus Server with your Octopus ID. [Learn more](https://g.octopushq.com/AuthOctopusID).")]
public class OctopusIDConfigurationResource : OpenIDConnectConfigurationWithClientSecretResource
public class OctopusIDConfigurationResource : OpenIDConnectConfigurationResource
{
public OctopusIDConfigurationResource()
{
Expand Down
4 changes: 2 additions & 2 deletions source/Client.OpenIDConnect/Client.OpenIDConnect.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
</ItemGroup>

<ItemGroup>
<None Include="..\..\LICENSE.txt" Pack="true" PackagePath=""/>
<None Include="..\..\build\icon.png" Pack="true" PackagePath=""/>
<None Include="..\..\LICENSE.txt" Pack="true" PackagePath="" />
<None Include="..\..\build\icon.png" Pack="true" PackagePath="" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.ComponentModel;
using Octopus.Client.Extensibility.Attributes;
using Octopus.Client.Extensibility.Extensions.Infrastructure.Configuration;
using Octopus.Client.Model;

namespace Octopus.Client.Extensibility.Authentication.OpenIDConnect.Configuration
{
Expand All @@ -15,6 +16,11 @@ public class OpenIDConnectConfigurationResource : ExtensionConfigurationResource
[Writeable]
public string ClientId { get; set; }

[DisplayName("Client Secret")]
[Description("Follow our documentation to find the Client Secret for your identity provider")]
[Writeable]
public SensitiveValue ClientSecret { get; set; }

[Writeable]
[Description("Only change this if you need to change the OpenID Connect scope requested by Octopus")]
public string Scope { get; set; }
Expand Down

This file was deleted.

1 change: 1 addition & 0 deletions source/Server.AzureAD/AzureADApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public AzureADApi(
{
Add<AzureADUserAuthenticationAction>("POST", authenticationProvider.AuthenticateUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IAzureADConfigurationStore>(), null, "OpenIDConnect");
Add<AzureADUserAuthenticatedAction>("POST", configurationStore.RedirectUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IAzureADConfigurationStore>(), null, "OpenIDConnect");
Add<AzureADUserAuthenticatedPkceAction>("GET", configurationStore.RedirectUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IAzureADConfigurationStore>(), null, "OpenIDConnect");
}
}
}
1 change: 1 addition & 0 deletions source/Server.AzureAD/AzureADExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public override void Load(ContainerBuilder builder)
builder.RegisterType<AzureADStaticContentFolders>().As<IContributesStaticContentFolders>().InstancePerDependency();

builder.RegisterType<AzureADUserAuthenticationAction>().AsSelf().InstancePerDependency();
builder.RegisterType<AzureADUserAuthenticatedPkceAction>().AsSelf().InstancePerDependency();
builder.RegisterType<AzureADUserAuthenticatedAction>().AsSelf().InstancePerDependency();

builder.RegisterType<AzureADAuthenticationProvider>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Octopus.Server.Extensibility.Authentication.AzureAD.Configuration
{
class AzureADConfigurationSettings : OpenIdConnectConfigurationSettings<AzureADConfiguration, AzureADConfigurationResource, IAzureADConfigurationStore>, IAzureADConfigurationSettings
class AzureADConfigurationSettings : OpenIDConnectConfigurationSettings<AzureADConfiguration, AzureADConfigurationResource, IAzureADConfigurationStore>, IAzureADConfigurationSettings
{
public AzureADConfigurationSettings(IAzureADConfigurationStore configurationDocumentStore) : base(configurationDocumentStore)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Octopus.Server.Extensibility.Authentication.AzureAD.Configuration
{
class AzureADConfigurationStore : OpenIdConnectConfigurationWithRoleStore<AzureADConfiguration>, IAzureADConfigurationStore
class AzureADConfigurationStore : OpenIDConnectConfigurationWithRoleStore<AzureADConfiguration>, IAzureADConfigurationStore
{
public const string SingletonId = "authentication-aad";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Octopus.Server.Extensibility.Authentication.AzureAD.Configuration
{
class AzureADConfigureCommands : OpenIdConnectConfigureCommands<IAzureADConfigurationStore>
class AzureADConfigureCommands : OpenIDConnectConfigureCommands<IAzureADConfigurationStore>
{
public AzureADConfigureCommands(
ISystemLog log,
Expand Down
10 changes: 4 additions & 6 deletions source/Server.AzureAD/Web/AzureADUserAuthenticatedAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,24 @@ public AzureADUserAuthenticatedAction(
ISystemLog log,
IAzureADAuthTokenHandler authTokenHandler,
IAzureADPrincipalToUserResourceMapper principalToUserResourceMapper,
IUpdateableUserStore userStore,
IAzureADConfigurationStore configurationStore,
IAuthCookieCreator authCookieCreator,
IInvalidLoginTracker loginTracker,
ISleep sleep,
IAzureADIdentityCreator identityCreator,
IClock clock,
IUrlEncoder encoder) :
IUrlEncoder encoder,
IUserService userService) :
base(
log,
authTokenHandler,
principalToUserResourceMapper,
userStore,
configurationStore,
authCookieCreator,
loginTracker,
sleep,
identityCreator,
clock,
encoder)
encoder,
userService)
{
}

Expand Down
47 changes: 47 additions & 0 deletions source/Server.AzureAD/Web/AzureADUserAuthenticatedPkceAction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using Octopus.Diagnostics;
using Octopus.Server.Extensibility.Authentication.AzureAD.Configuration;
using Octopus.Server.Extensibility.Authentication.AzureAD.Identities;
using Octopus.Server.Extensibility.Authentication.AzureAD.Infrastructure;
using Octopus.Server.Extensibility.Authentication.AzureAD.Tokens;
using Octopus.Server.Extensibility.Authentication.HostServices;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Issuer;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Web;
using Octopus.Server.Extensibility.HostServices.Web;
using Octopus.Server.Extensibility.Mediator;
using Octopus.Time;

namespace Octopus.Server.Extensibility.Authentication.AzureAD.Web
{
class AzureADUserAuthenticatedPkceAction : UserAuthenticatedPkceAction<IAzureADConfigurationStore, IAzureADAuthTokenHandler, IAzureADIdentityCreator>
{
public AzureADUserAuthenticatedPkceAction(
ISystemLog log,
IAzureADAuthTokenHandler authTokenHandler,
IAzureADPrincipalToUserResourceMapper principalToUserResourceMapper,
IAzureADConfigurationStore configurationStore,
IAuthCookieCreator authCookieCreator,
IInvalidLoginTracker loginTracker,
ISleep sleep,
IAzureADIdentityCreator identityCreator,
IUrlEncoder encoder,
IIdentityProviderConfigDiscoverer identityProviderConfigDiscoverer,
IMediator mediator,
IUserService service)
: base(log,
authTokenHandler,
principalToUserResourceMapper,
configurationStore,
authCookieCreator,
loginTracker,
sleep,
identityCreator,
encoder,
identityProviderConfigDiscoverer,
mediator,
service)
{
}

protected override string ProviderName => AzureADAuthenticationProvider.ProviderName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Issuer;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Web;
using Octopus.Server.Extensibility.Extensions.Infrastructure.Web.Api;
using Octopus.Server.Extensibility.Mediator;

namespace Octopus.Server.Extensibility.Authentication.AzureAD.Web
{
Expand All @@ -16,7 +17,8 @@ public AzureADUserAuthenticationAction(
IIdentityProviderConfigDiscoverer identityProviderConfigDiscoverer,
IAzureADAuthorizationEndpointUrlBuilder urlBuilder,
IApiActionModelBinder modelBinder,
IAuthenticationConfigurationStore authenticationConfigurationStore) : base(log, configurationStore, identityProviderConfigDiscoverer, urlBuilder, modelBinder, authenticationConfigurationStore)
IAuthenticationConfigurationStore authenticationConfigurationStore,
IMediator mediator) : base(log, configurationStore, identityProviderConfigDiscoverer, urlBuilder, modelBinder, authenticationConfigurationStore, mediator)
{
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Octopus.Server.Extensibility.Authentication.GoogleApps.Configuration
{
class GoogleAppsConfigurationSettings : OpenIdConnectConfigurationSettings<GoogleAppsConfiguration, GoogleAppsConfigurationResource, IGoogleAppsConfigurationStore>, IGoogleAppsConfigurationSettings
class GoogleAppsConfigurationSettings : OpenIDConnectConfigurationSettings<GoogleAppsConfiguration, GoogleAppsConfigurationResource, IGoogleAppsConfigurationStore>, IGoogleAppsConfigurationSettings
{
public GoogleAppsConfigurationSettings(IGoogleAppsConfigurationStore configurationDocumentStore) : base(configurationDocumentStore)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Octopus.Server.Extensibility.Authentication.GoogleApps.Configuration
{
class GoogleAppsConfigurationStore : OpenIdConnectConfigurationStore<GoogleAppsConfiguration>, IGoogleAppsConfigurationStore
class GoogleAppsConfigurationStore : OpenIDConnectConfigurationStore<GoogleAppsConfiguration>, IGoogleAppsConfigurationStore
{
public const string SingletonId = "authentication-googleapps";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Octopus.Server.Extensibility.Authentication.GoogleApps.Configuration
{
class GoogleAppsConfigureCommands : OpenIdConnectConfigureCommands<IGoogleAppsConfigurationStore>
class GoogleAppsConfigureCommands : OpenIDConnectConfigureCommands<IGoogleAppsConfigurationStore>
{
public GoogleAppsConfigureCommands(
ISystemLog log,
Expand Down
1 change: 1 addition & 0 deletions source/Server.GoogleApps/GoogleAppsApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public GoogleAppsApi(
{
Add<GoogleAppsUserAuthenticationAction>("POST", authenticationProvider.AuthenticateUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IGoogleAppsConfigurationStore>(), null, "OpenIDConnect");
Add<GoogleAppsUserAuthenticatedAction>("POST", configurationStore.RedirectUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IGoogleAppsConfigurationStore>(), null, "OpenIDConnect");
Add<GoogleAppsUserAuthenticatedPkceAction>("GET", configurationStore.RedirectUri, RouteCategory.Raw, new AnonymousWhenEnabledEndpointInvocation<IGoogleAppsConfigurationStore>(), null, "OpenIDConnect");
}
}
}
1 change: 1 addition & 0 deletions source/Server.GoogleApps/GoogleAppsExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public override void Load(ContainerBuilder builder)
builder.RegisterType<GoogleKeyRetriever>().As<IGoogleKeyRetriever>().SingleInstance();

builder.RegisterType<GoogleAppsUserAuthenticationAction>().AsSelf().InstancePerDependency();
builder.RegisterType<GoogleAppsUserAuthenticatedPkceAction>().AsSelf().InstancePerDependency();
builder.RegisterType<GoogleAppsUserAuthenticatedAction>().AsSelf().InstancePerDependency();

builder.RegisterType<GoogleAppsAuthenticationProvider>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ public GoogleAppsAuthorizationEndpointUrlBuilder(IGoogleAppsConfigurationStore c
{
}

public override string Build(string requestDirectoryPath, IssuerConfiguration issuerConfiguration, string nonce, string? state = null)
public override string Build(string requestDirectoryPath, IssuerConfiguration issuerConfiguration, string? nonce = null, string? state = null, string? codeChallenge = null)
{
var url = base.Build(requestDirectoryPath, issuerConfiguration, nonce, state);
var url = base.Build(requestDirectoryPath, issuerConfiguration, nonce, state, codeChallenge);

var hd = ConfigurationStore.GetHostedDomain();
if (!string.IsNullOrWhiteSpace(hd))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,24 @@ public GoogleAppsUserAuthenticatedAction(
ISystemLog log,
IGoogleAuthTokenHandler authTokenHandler,
IPrincipalToUserResourceMapper principalToUserResourceMapper,
IUpdateableUserStore userStore,
IGoogleAppsConfigurationStore configurationStore,
IAuthCookieCreator authCookieCreator,
IInvalidLoginTracker loginTracker,
ISleep sleep,
IGoogleAppsIdentityCreator identityCreator,
IClock clock, IUrlEncoder encoder)
: base(log, authTokenHandler, principalToUserResourceMapper, userStore, configurationStore, authCookieCreator, loginTracker, sleep, identityCreator, clock, encoder)
IUrlEncoder encoder,
IUserService userService) :
base(
log,
authTokenHandler,
principalToUserResourceMapper,
configurationStore,
authCookieCreator,
loginTracker,
sleep,
identityCreator,
encoder,
userService)
{
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using Octopus.Diagnostics;
using Octopus.Server.Extensibility.Authentication.GoogleApps.Configuration;
using Octopus.Server.Extensibility.Authentication.GoogleApps.Identities;
using Octopus.Server.Extensibility.Authentication.GoogleApps.Tokens;
using Octopus.Server.Extensibility.Authentication.HostServices;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Infrastructure;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Issuer;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Web;
using Octopus.Server.Extensibility.HostServices.Web;
using Octopus.Server.Extensibility.Mediator;
using Octopus.Time;

namespace Octopus.Server.Extensibility.Authentication.GoogleApps.Web
{
class GoogleAppsUserAuthenticatedPkceAction
: UserAuthenticatedPkceAction<IGoogleAppsConfigurationStore, IGoogleAuthTokenHandler, IGoogleAppsIdentityCreator>
{
public GoogleAppsUserAuthenticatedPkceAction(
ISystemLog log,
IGoogleAuthTokenHandler authTokenHandler,
IPrincipalToUserResourceMapper principalToUserResourceMapper,
IGoogleAppsConfigurationStore configurationStore,
IAuthCookieCreator authCookieCreator,
IInvalidLoginTracker loginTracker,
ISleep sleep,
IGoogleAppsIdentityCreator identityCreator,
IUrlEncoder encoder,
IIdentityProviderConfigDiscoverer identityProviderConfigDiscoverer,
IMediator mediator,
IUserService service)
: base(log,
authTokenHandler,
principalToUserResourceMapper,
configurationStore,
authCookieCreator,
loginTracker,
sleep,
identityCreator,
encoder,
identityProviderConfigDiscoverer,
mediator,
service)
{
}

protected override string ProviderName => GoogleAppsAuthenticationProvider.ProviderName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Issuer;
using Octopus.Server.Extensibility.Authentication.OpenIDConnect.Common.Web;
using Octopus.Server.Extensibility.Extensions.Infrastructure.Web.Api;
using Octopus.Server.Extensibility.Mediator;

namespace Octopus.Server.Extensibility.Authentication.GoogleApps.Web
{
Expand All @@ -16,8 +17,9 @@ public GoogleAppsUserAuthenticationAction(
IIdentityProviderConfigDiscoverer identityProviderConfigDiscoverer,
IGoogleAppsAuthorizationEndpointUrlBuilder urlBuilder,
IApiActionModelBinder modelBinder,
IAuthenticationConfigurationStore authenticationConfigurationStore)
: base(log, configurationStore, identityProviderConfigDiscoverer, urlBuilder, modelBinder, authenticationConfigurationStore)
IAuthenticationConfigurationStore authenticationConfigurationStore,
IMediator mediator)
: base(log, configurationStore, identityProviderConfigDiscoverer, urlBuilder, modelBinder, authenticationConfigurationStore, mediator)
{
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@

namespace Octopus.Server.Extensibility.Authentication.OctopusID.Configuration
{
interface IOctopusIDConfigurationStore : IOpenIDConnectWithClientSecretConfigurationStore<OctopusIDConfiguration>,
IOpenIDConnectConfigurationWithRoleStore<OctopusIDConfiguration>
interface IOctopusIDConfigurationStore : IOpenIDConnectConfigurationWithRoleStore<OctopusIDConfiguration>
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Octopus.Server.Extensibility.Authentication.OctopusID.Configuration
{
class OctopusIDConfiguration : OpenIDConnectConfigurationWithClientSecret, IOpenIDConnectConfigurationWithRole
class OctopusIDConfiguration : OpenIDConnectConfiguration, IOpenIDConnectConfigurationWithRole
{
public static string DefaultRoleClaimType = "roles";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
namespace Octopus.Server.Extensibility.Authentication.OctopusID.Configuration
{
[Description("Sign in to your Octopus Server with an Octopus ID. [Learn more](https://g.octopushq.com/AuthOctopusID).")]
class OctopusIDConfigurationResource : OpenIDConnectConfigurationWithClientSecretResource
class OctopusIDConfigurationResource : OpenIDConnectConfigurationResource
{
[Writeable]
public override string? Issuer { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace Octopus.Server.Extensibility.Authentication.OctopusID.Configuration
{
class OctopusIDConfigurationSettings : OpenIdConnectConfigurationSettings<OctopusIDConfiguration, OctopusIDConfigurationResource, IOctopusIDConfigurationStore>, IOctopusIDConfigurationSettings
class OctopusIDConfigurationSettings : OpenIDConnectConfigurationSettings<OctopusIDConfiguration, OctopusIDConfigurationResource, IOctopusIDConfigurationStore>, IOctopusIDConfigurationSettings
{
public OctopusIDConfigurationSettings(IOctopusIDConfigurationStore configurationDocumentStore) : base(configurationDocumentStore)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Octopus.Server.Extensibility.Authentication.OctopusID.Configuration
{
class OctopusIDConfigurationStore : OpenIDConnectWithClientSecretConfigurationStore<OctopusIDConfiguration>, IOctopusIDConfigurationStore
class OctopusIDConfigurationStore : OpenIDConnectConfigurationStore<OctopusIDConfiguration>, IOctopusIDConfigurationStore
{
public const string SingletonId = "authentication-octopusid";

Expand Down
Loading