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