diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/ApplicationWithCertificates.csproj b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/ApplicationWithCertificates.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/ApplicationWithCertificates.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Program.cs b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Program.cs
new file mode 100644
index 00000000..0ad594f8
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Program.cs
@@ -0,0 +1,28 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var appTenantId = "";
+ var appClientId = "";
+ var clientCertificatePath = "";
+ var credential = new ClientCertificateCredential(appTenantId, appClientId, clientCertificatePath);
+ var endpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [endpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Properties/launchSettings.json
new file mode 100644
index 00000000..a5bb7520
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "ApplicationWithCertificates": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55450;http://localhost:55451"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/index.html b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithCertificates/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/ApplicationWithClientSecrets.csproj b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/ApplicationWithClientSecrets.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/ApplicationWithClientSecrets.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Program.cs b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Program.cs
new file mode 100644
index 00000000..43cc89ef
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Program.cs
@@ -0,0 +1,28 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var appTenantId = "";
+ var appClientId = "";
+ var clientSecret = "";
+ var credential = new ClientSecretCredential(appTenantId, appClientId, clientSecret);
+ var endpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [endpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Properties/launchSettings.json
new file mode 100644
index 00000000..63b698b5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "ApplicationWithClientSecrets": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55457;http://localhost:55458"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/index.html b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithClientSecrets/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/ApplicationWithFerderatedIdentity.csproj b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/ApplicationWithFerderatedIdentity.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/ApplicationWithFerderatedIdentity.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Program.cs b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Program.cs
new file mode 100644
index 00000000..2b8df424
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Program.cs
@@ -0,0 +1,39 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Core;
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://testresource.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var appTenantId = Guid.NewGuid().ToString();
+ var appClientId = Guid.NewGuid().ToString();
+ var msiClientId = Guid.NewGuid().ToString();
+
+ var msiCredential = new ManagedIdentityCredential(msiClientId);
+
+ var credential = new ClientAssertionCredential(appTenantId, appClientId, async(ctoken) =>
+ {
+ // Entra ID US Government: api://AzureADTokenExchangeUSGov
+ // Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
+ var request = new TokenRequestContext([$"api://AzureADTokenExchange/.default"]);
+ var response = await msiCredential.GetTokenAsync(request, ctoken).ConfigureAwait(false);
+ return response.Token;
+ });
+ var endpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [endpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Properties/launchSettings.json
new file mode 100644
index 00000000..70d9bd76
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "ApplicationWithFerderatedIdentity": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55459;http://localhost:55460"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/index.html b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/ApplicationWithFerderatedIdentity/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/SovereignClouds/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/Program.cs b/samples/MicrosoftEntraAuth/SovereignClouds/Program.cs
new file mode 100644
index 00000000..04f9cd2c
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/Program.cs
@@ -0,0 +1,34 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var credentialOptions = new VisualStudioCodeCredentialOptions()
+ {
+ // Entra ID US Government
+ AuthorityHost = AzureAuthorityHosts.AzureGovernment,
+ // Entra ID China operated by 21Vianet
+ // AuthorityHost = AzureAuthorityHosts.AzureChina
+ };
+
+ var credential = new VisualStudioCredential();
+
+ var serviceEndpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [serviceEndpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/SovereignClouds/Properties/launchSettings.json
new file mode 100644
index 00000000..54affdf9
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "SovereignClouds": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:57120;http://localhost:57121"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/SovereignClouds.csproj b/samples/MicrosoftEntraAuth/SovereignClouds/SovereignClouds.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/SovereignClouds.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/index.html b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SovereignClouds/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Program.cs b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Program.cs
new file mode 100644
index 00000000..6218ee99
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Program.cs
@@ -0,0 +1,25 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var credential = new ManagedIdentityCredential();
+ var endpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [endpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Properties/launchSettings.json
new file mode 100644
index 00000000..1b5adb81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "SystemAssignedManagedIdentity": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55453;http://localhost:55454"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/SystemAssignedManagedIdentity.csproj b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/SystemAssignedManagedIdentity.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/SystemAssignedManagedIdentity.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/index.html b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/SystemAssignedManagedIdentity/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/UseSovereignClouds/Program.cs b/samples/MicrosoftEntraAuth/UseSovereignClouds/Program.cs
new file mode 100644
index 00000000..3751555c
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UseSovereignClouds/Program.cs
@@ -0,0 +1,2 @@
+// See https://aka.ms/new-console-template for more information
+Console.WriteLine("Hello, World!");
diff --git a/samples/MicrosoftEntraAuth/UseSovereignClouds/UseSovereignClouds.csproj b/samples/MicrosoftEntraAuth/UseSovereignClouds/UseSovereignClouds.csproj
new file mode 100644
index 00000000..2150e379
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UseSovereignClouds/UseSovereignClouds.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Program.cs b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Program.cs
new file mode 100644
index 00000000..f6986c54
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Program.cs
@@ -0,0 +1,26 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var userAssignedMsiClientId = "";
+ var credential = new ManagedIdentityCredential(userAssignedMsiClientId);
+ var endpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [endpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Properties/launchSettings.json
new file mode 100644
index 00000000..6ce042fb
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "UserAssignedManagedIdentity": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55455;http://localhost:55456"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/UserAssignedManagedIdentity.csproj b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/UserAssignedManagedIdentity.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/UserAssignedManagedIdentity.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/index.html b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/UserAssignedManagedIdentity/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/Hub/ChatSampleHub.cs b/samples/MicrosoftEntraAuth/VisualStudio/Hub/ChatSampleHub.cs
new file mode 100644
index 00000000..239b3d81
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/Hub/ChatSampleHub.cs
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Microsoft.AspNetCore.SignalR;
+
+public class ChatSampleHub : Hub
+{
+ public Task BroadcastMessage(string name, string message) =>
+ Clients.All.SendAsync("broadcastMessage", name, message);
+
+ public Task Echo(string name, string message) =>
+ Clients.Client(Context.ConnectionId)
+ .SendAsync("echo", name, $"{message} (echo from server)");
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/Program.cs b/samples/MicrosoftEntraAuth/VisualStudio/Program.cs
new file mode 100644
index 00000000..2a2450f1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/Program.cs
@@ -0,0 +1,25 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+using Azure.Identity;
+
+using Microsoft.Azure.SignalR;
+
+const string Endpoint = "https://.service.signalr.net";
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddSignalR().AddAzureSignalR(option =>
+{
+ var credential = new VisualStudioCredential();
+ var serviceEndpoint = new ServiceEndpoint(new Uri(Endpoint), credential);
+ option.Endpoints = [serviceEndpoint];
+});
+var app = builder.Build();
+
+app.UseHttpsRedirection();
+app.UseDefaultFiles();
+app.UseStaticFiles();
+app.UseRouting();
+
+app.MapHub("/chat");
+
+app.Run();
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/Properties/launchSettings.json b/samples/MicrosoftEntraAuth/VisualStudio/Properties/launchSettings.json
new file mode 100644
index 00000000..82c1c44c
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "VisualStudio": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55439;http://localhost:55440"
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/VisualStudio.csproj b/samples/MicrosoftEntraAuth/VisualStudio/VisualStudio.csproj
new file mode 100644
index 00000000..7d91a3c1
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/VisualStudio.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/css/site.css b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/css/site.css
new file mode 100644
index 00000000..418828c5
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/css/site.css
@@ -0,0 +1,82 @@
+/*html, body {
+ font-size: 16px;
+}
+
+@media all and (max-device-width: 720px) {
+ html, body {
+ font-size: 20px;
+ }
+}*/
+
+html, body {
+ padding: 0;
+ height: 100%;
+}
+
+#messages {
+ width: 100%;
+ border: 1px solid #ccc;
+ height: calc(100% - 120px);
+ float: none;
+ margin: 0px auto;
+ padding-left: 0px;
+ overflow-y: auto;
+}
+
+textarea:focus {
+ outline: none !important;
+}
+
+.system-message {
+ background: #87CEFA;
+}
+
+.broadcast-message {
+ display: inline-block;
+ background: yellow;
+ margin: auto;
+ padding: 5px 10px;
+}
+
+.message-entry {
+ overflow: auto;
+ margin: 8px 0;
+}
+
+.message-avatar {
+ display: inline-block;
+ padding: 10px;
+ max-width: 8em;
+ word-wrap: break-word;
+}
+
+.message-content {
+ display: inline-block;
+ background-color: #b2e281;
+ padding: 10px;
+ margin: 0 0.5em;
+ max-width: calc(60%);
+ word-wrap: break-word;
+}
+
+.message-content.pull-left:before {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: left;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-right: 10px solid #b2e281;
+ margin: 15px 0;
+}
+
+.message-content.pull-right:after {
+ width: 0;
+ height: 0;
+ display: inline-block;
+ float: right;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ border-left: 10px solid #b2e281;
+ margin: 15px 0;
+}
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/favicon.ico b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/favicon.ico
new file mode 100644
index 00000000..a3a79998
Binary files /dev/null and b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/favicon.ico differ
diff --git a/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/index.html b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/index.html
new file mode 100644
index 00000000..151ae9e0
--- /dev/null
+++ b/samples/MicrosoftEntraAuth/VisualStudio/wwwroot/index.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+ Azure SignalR Group Chat
+
+
+
+ Azure SignalR Group Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/samples/samples.sln b/samples/samples.sln
index e7d0b0c4..d7d5cd58 100644
--- a/samples/samples.sln
+++ b/samples/samples.sln
@@ -21,6 +21,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerSideBlazor", "ServerS
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleEcho", "SimpleEcho\SimpleEcho.csproj", "{485FB16C-0600-41BC-8958-4E65F1283936}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationWithCertificates", "MicrosoftEntraAuth\ApplicationWithCertificates\ApplicationWithCertificates.csproj", "{D4F193D7-94F0-4177-84F6-C16B487C7773}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MicrosoftEntraAuth", "MicrosoftEntraAuth", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationWithClientSecrets", "MicrosoftEntraAuth\ApplicationWithClientSecrets\ApplicationWithClientSecrets.csproj", "{D321854E-61AC-43F3-A2AC-3681FD14AEDB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VisualStudio", "MicrosoftEntraAuth\VisualStudio\VisualStudio.csproj", "{DA1F5A81-2E3C-4831-9637-A0FDEE27306F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemAssignedManagedIdentity", "MicrosoftEntraAuth\SystemAssignedManagedIdentity\SystemAssignedManagedIdentity.csproj", "{668558D7-060C-47EB-AEC2-6C6CF8261F95}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserAssignedManagedIdentity", "MicrosoftEntraAuth\UserAssignedManagedIdentity\UserAssignedManagedIdentity.csproj", "{778B0CF8-936F-4C5E-BE41-549593083440}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationWithFerderatedIdentity", "MicrosoftEntraAuth\ApplicationWithFerderatedIdentity\ApplicationWithFerderatedIdentity.csproj", "{F0673AFB-FC27-0CEA-A1C1-F6467811D3B4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SovereignClouds", "MicrosoftEntraAuth\SovereignClouds\SovereignClouds.csproj", "{5934FEE3-7E68-486A-A49E-3172267B37E7}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -63,10 +79,47 @@ Global
{485FB16C-0600-41BC-8958-4E65F1283936}.Debug|Any CPU.Build.0 = Debug|Any CPU
{485FB16C-0600-41BC-8958-4E65F1283936}.Release|Any CPU.ActiveCfg = Release|Any CPU
{485FB16C-0600-41BC-8958-4E65F1283936}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D4F193D7-94F0-4177-84F6-C16B487C7773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D4F193D7-94F0-4177-84F6-C16B487C7773}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D4F193D7-94F0-4177-84F6-C16B487C7773}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D4F193D7-94F0-4177-84F6-C16B487C7773}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D321854E-61AC-43F3-A2AC-3681FD14AEDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D321854E-61AC-43F3-A2AC-3681FD14AEDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D321854E-61AC-43F3-A2AC-3681FD14AEDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D321854E-61AC-43F3-A2AC-3681FD14AEDB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DA1F5A81-2E3C-4831-9637-A0FDEE27306F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DA1F5A81-2E3C-4831-9637-A0FDEE27306F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DA1F5A81-2E3C-4831-9637-A0FDEE27306F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DA1F5A81-2E3C-4831-9637-A0FDEE27306F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {668558D7-060C-47EB-AEC2-6C6CF8261F95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {668558D7-060C-47EB-AEC2-6C6CF8261F95}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {668558D7-060C-47EB-AEC2-6C6CF8261F95}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {668558D7-060C-47EB-AEC2-6C6CF8261F95}.Release|Any CPU.Build.0 = Release|Any CPU
+ {778B0CF8-936F-4C5E-BE41-549593083440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {778B0CF8-936F-4C5E-BE41-549593083440}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {778B0CF8-936F-4C5E-BE41-549593083440}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {778B0CF8-936F-4C5E-BE41-549593083440}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F0673AFB-FC27-0CEA-A1C1-F6467811D3B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F0673AFB-FC27-0CEA-A1C1-F6467811D3B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F0673AFB-FC27-0CEA-A1C1-F6467811D3B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F0673AFB-FC27-0CEA-A1C1-F6467811D3B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5934FEE3-7E68-486A-A49E-3172267B37E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5934FEE3-7E68-486A-A49E-3172267B37E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5934FEE3-7E68-486A-A49E-3172267B37E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5934FEE3-7E68-486A-A49E-3172267B37E7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {D4F193D7-94F0-4177-84F6-C16B487C7773} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {D321854E-61AC-43F3-A2AC-3681FD14AEDB} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {DA1F5A81-2E3C-4831-9637-A0FDEE27306F} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {668558D7-060C-47EB-AEC2-6C6CF8261F95} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {778B0CF8-936F-4C5E-BE41-549593083440} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {F0673AFB-FC27-0CEA-A1C1-F6467811D3B4} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {5934FEE3-7E68-486A-A49E-3172267B37E7} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {55855414-4702-4A2C-B699-9694E9C92887}
EndGlobalSection