From cacdd90786915bef5e34ba1984b646083a93bbda Mon Sep 17 00:00:00 2001 From: jeromydean Date: Fri, 20 Mar 2026 19:33:01 -0400 Subject: [PATCH] Implemented OAuth 2.0 server metadata discovery Implemented PKCE helpers for WebAuthenticationBroker --- Avalonia.Controls.WebView.slnx | 1 + .../App.axaml | 8 + .../App.axaml.cs | 20 +++ ...lonia.Controls.WebView.Samples.Oidc.csproj | 22 +++ .../MainWindow.axaml | 39 +++++ .../MainWindow.axaml.cs | 94 ++++++++++++ .../Program.cs | 16 ++ .../README.md | 5 + .../app.manifest | 9 ++ .../OAuth2/AuthorizationCallbackParser.cs | 76 ++++++++++ .../OAuth2/AuthorizationCodePkceSession.cs | 138 ++++++++++++++++++ .../OAuth2/AuthorizationServerMetadata.cs | 33 +++++ .../AuthorizationServerMetadataClient.cs | 54 +++++++ .../OAuth2/AuthorizationServerTokenClient.cs | 65 +++++++++ .../OAuth2/OAuth2JsonContext.cs | 9 ++ .../OAuth2/OAuth2TokenResponse.cs | 33 +++++ src/Avalonia.Controls.WebView/OAuth2/Pkce.cs | 46 ++++++ src/Avalonia.Controls.WebView/README.md | 8 +- .../OAuth2Tests.cs | 99 +++++++++++++ 19 files changed, 774 insertions(+), 1 deletion(-) create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml.cs create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/Avalonia.Controls.WebView.Samples.Oidc.csproj create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/MainWindow.axaml create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/MainWindow.axaml.cs create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/Program.cs create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/README.md create mode 100644 samples/Avalonia.Controls.WebView.Samples.Oidc/app.manifest create mode 100644 src/Avalonia.Controls.WebView/OAuth2/AuthorizationCallbackParser.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/AuthorizationCodePkceSession.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/AuthorizationServerMetadata.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/AuthorizationServerMetadataClient.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/AuthorizationServerTokenClient.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/OAuth2JsonContext.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/OAuth2TokenResponse.cs create mode 100644 src/Avalonia.Controls.WebView/OAuth2/Pkce.cs create mode 100644 tests/Avalonia.Controls.WebView.Tests/OAuth2Tests.cs diff --git a/Avalonia.Controls.WebView.slnx b/Avalonia.Controls.WebView.slnx index ab5330a..a3fcdf3 100644 --- a/Avalonia.Controls.WebView.slnx +++ b/Avalonia.Controls.WebView.slnx @@ -17,6 +17,7 @@ + diff --git a/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml b/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml new file mode 100644 index 0000000..8b34271 --- /dev/null +++ b/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml @@ -0,0 +1,8 @@ + + + + + diff --git a/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml.cs b/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml.cs new file mode 100644 index 0000000..b90bf05 --- /dev/null +++ b/samples/Avalonia.Controls.WebView.Samples.Oidc/App.axaml.cs @@ -0,0 +1,20 @@ +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; + +namespace Avalonia.Controls.WebView.Samples.Oidc; + +public class App : Application +{ + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + desktop.MainWindow = new MainWindow(); + + base.OnFrameworkInitializationCompleted(); + } +} diff --git a/samples/Avalonia.Controls.WebView.Samples.Oidc/Avalonia.Controls.WebView.Samples.Oidc.csproj b/samples/Avalonia.Controls.WebView.Samples.Oidc/Avalonia.Controls.WebView.Samples.Oidc.csproj new file mode 100644 index 0000000..96e3f7c --- /dev/null +++ b/samples/Avalonia.Controls.WebView.Samples.Oidc/Avalonia.Controls.WebView.Samples.Oidc.csproj @@ -0,0 +1,22 @@ + + + WinExe + net10.0 + enable + Avalonia.Controls.WebView.Samples.Oidc + + + + app.manifest + + + + + + + + + + + + diff --git a/samples/Avalonia.Controls.WebView.Samples.Oidc/MainWindow.axaml b/samples/Avalonia.Controls.WebView.Samples.Oidc/MainWindow.axaml new file mode 100644 index 0000000..e403c63 --- /dev/null +++ b/samples/Avalonia.Controls.WebView.Samples.Oidc/MainWindow.axaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + +