Skip to content

Commit e478ab6

Browse files
authored
Merge pull request #2022 from DuendeSoftware/beh/auth-scheme-diagnostic-entry
Auth Scheme Diagnostic Entry
2 parents 3b50856 + 433202d commit e478ab6

File tree

5 files changed

+108
-11
lines changed

5 files changed

+108
-11
lines changed

identity-server/src/IdentityServer/Configuration/DependencyInjection/BuilderExtensions/Core.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ public static IIdentityServerBuilder AddCoreServices(this IIdentityServerBuilder
213213
builder.Services.AddSingleton<LicenseExpirationChecker>();
214214

215215
builder.Services.AddSingleton<IDiagnosticEntry, AssemblyInfoDiagnosticEntry>();
216+
builder.Services.AddSingleton<IDiagnosticEntry, AuthSchemeInfoDiagnosticEntry>();
216217
builder.Services.AddSingleton<DiagnosticSummary>();
217218
builder.Services.AddHostedService<DiagnosticHostedService>();
218219

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) Duende Software. All rights reserved.
2+
// See LICENSE in the project root for license information.
3+
4+
using System.Text.Json;
5+
using Microsoft.AspNetCore.Authentication;
6+
7+
namespace Duende.IdentityServer.Licensing.V2.Diagnostics.DiagnosticEntries;
8+
9+
internal class AuthSchemeInfoDiagnosticEntry(IAuthenticationSchemeProvider authenticationSchemeProvider) : IDiagnosticEntry
10+
{
11+
public async Task WriteAsync(Utf8JsonWriter writer)
12+
{
13+
var schemes = await authenticationSchemeProvider.GetAllSchemesAsync();
14+
15+
writer.WriteStartObject("AuthSchemeInfo");
16+
writer.WriteStartArray("Schemes");
17+
foreach (var scheme in schemes)
18+
{
19+
writer.WriteStartObject();
20+
writer.WriteString(scheme.Name, scheme.HandlerType.FullName ?? "Unknown");
21+
writer.WriteEndObject();
22+
}
23+
writer.WriteEndArray();
24+
writer.WriteEndObject();
25+
}
26+
}

identity-server/test/IdentityServer.UnitTests/Licensing/v2/DiagnosticEntries/AssemblyInfoDiagnosticEntryTests.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) Duende Software. All rights reserved.
22
// See LICENSE in the project root for license information.
33

4-
using System.Buffers;
5-
using System.Text;
64
using System.Text.Json;
75
using Duende.IdentityServer.Licensing.V2.Diagnostics.DiagnosticEntries;
86

@@ -14,17 +12,10 @@ public class AssemblyInfoDiagnosticEntryTests
1412
public async Task WriteAsync_ShouldWriteAssemblyInfo()
1513
{
1614
var subject = new AssemblyInfoDiagnosticEntry();
17-
var bufferWriter = new ArrayBufferWriter<byte>();
18-
await using var writer = new Utf8JsonWriter(bufferWriter, new JsonWriterOptions { Indented = false });
19-
writer.WriteStartObject();
2015

21-
await subject.WriteAsync(writer);
16+
var result = await DiagnosticEntryTestHelper.WriteEntryToJson(subject);
2217

23-
writer.WriteEndObject();
24-
await writer.FlushAsync();
25-
var json = Encoding.UTF8.GetString(bufferWriter.WrittenSpan);
26-
var jsonDocument = JsonDocument.Parse(json);
27-
var assemblyInfo = jsonDocument.RootElement.GetProperty("AssemblyInfo");
18+
var assemblyInfo = result.RootElement.GetProperty("AssemblyInfo");
2819
assemblyInfo.GetProperty("AssemblyCount").ValueKind.ShouldBe(JsonValueKind.Number);
2920
var assemblies = assemblyInfo.GetProperty("Assemblies");
3021
assemblies.ValueKind.ShouldBe(JsonValueKind.Array);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright (c) Duende Software. All rights reserved.
2+
// See LICENSE in the project root for license information.
3+
4+
using Duende.IdentityServer.Licensing.V2.Diagnostics.DiagnosticEntries;
5+
using Microsoft.AspNetCore.Authentication;
6+
using UnitTests.Common;
7+
8+
namespace IdentityServer.UnitTests.Licensing.V2.DiagnosticEntries;
9+
10+
public class AuthSchemeInfoDiagnosticEntryTests
11+
{
12+
13+
private readonly MockAuthenticationSchemeProvider _mockAuthenticationSchemeProvider;
14+
private readonly AuthSchemeInfoDiagnosticEntry _subject;
15+
16+
public AuthSchemeInfoDiagnosticEntryTests()
17+
{
18+
_mockAuthenticationSchemeProvider = new MockAuthenticationSchemeProvider();
19+
_subject = new AuthSchemeInfoDiagnosticEntry(_mockAuthenticationSchemeProvider);
20+
}
21+
22+
[Fact]
23+
public async Task WriteAsync_ShouldWriteAuthSchemeInfo()
24+
{
25+
var testAuthenticationScheme = new AuthenticationScheme("TestScheme", "Test Scheme", typeof(MockAuthenticationHandler));
26+
_mockAuthenticationSchemeProvider.RemoveScheme("scheme");
27+
_mockAuthenticationSchemeProvider.AddScheme(testAuthenticationScheme);
28+
29+
var result = await DiagnosticEntryTestHelper.WriteEntryToJson(_subject);
30+
31+
var authSchemeInfo = result.RootElement.GetProperty("AuthSchemeInfo");
32+
var authSchemes = authSchemeInfo.GetProperty("Schemes");
33+
var firstEntry = authSchemes.EnumerateArray().First();
34+
firstEntry.GetProperty("TestScheme").GetString().ShouldBe("UnitTests.Common.MockAuthenticationHandler");
35+
}
36+
37+
[Fact]
38+
public async Task WriteAsync_ShouldWriteAllRegisteredAuthSchemes()
39+
{
40+
_mockAuthenticationSchemeProvider.RemoveScheme("scheme");
41+
_mockAuthenticationSchemeProvider.AddScheme(new AuthenticationScheme("FirstTestScheme", "First Test Scheme", typeof(MockAuthenticationHandler)));
42+
_mockAuthenticationSchemeProvider.AddScheme(new AuthenticationScheme("SecondTestScheme", "Second Test Scheme", typeof(MockAuthenticationHandler)));
43+
44+
var result = await DiagnosticEntryTestHelper.WriteEntryToJson(_subject);
45+
46+
var authSchemeInfo = result.RootElement.GetProperty("AuthSchemeInfo");
47+
var authSchemes = authSchemeInfo.GetProperty("Schemes");
48+
authSchemes.GetArrayLength().ShouldBe(2);
49+
}
50+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) Duende Software. All rights reserved.
2+
// See LICENSE in the project root for license information.
3+
4+
using System.Buffers;
5+
using System.Text;
6+
using System.Text.Json;
7+
using Duende.IdentityServer.Licensing.V2.Diagnostics;
8+
9+
namespace IdentityServer.UnitTests.Licensing.V2.DiagnosticEntries;
10+
11+
internal static class DiagnosticEntryTestHelper
12+
{
13+
public static async Task<JsonDocument> WriteEntryToJson(IDiagnosticEntry subject)
14+
{
15+
var bufferWriter = new ArrayBufferWriter<byte>();
16+
17+
await using var writer = new Utf8JsonWriter(bufferWriter, new JsonWriterOptions { Indented = false });
18+
writer.WriteStartObject();
19+
20+
await subject.WriteAsync(writer);
21+
22+
writer.WriteEndObject();
23+
await writer.FlushAsync();
24+
25+
var json = Encoding.UTF8.GetString(bufferWriter.WrittenSpan);
26+
27+
return JsonDocument.Parse(json);
28+
}
29+
}

0 commit comments

Comments
 (0)