microsoft/teams.net

Public

mirrored from https://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
c92c1919ec3b5a0b25a067ad4ad46da598a2fdca

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

core/test/Microsoft.Teams.Bot.Core.UnitTests/Hosting/AddBotApplicationExtensionsTests.cs

216lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4using Microsoft.Teams.Bot.Core.Hosting;
5using Microsoft.Extensions.Configuration;
6using Microsoft.Extensions.DependencyInjection;
7using Microsoft.Extensions.Options;
8using Microsoft.Identity.Abstractions;
9
10namespace Microsoft.Teams.Bot.Core.UnitTests.Hosting;
11
12public class AddBotApplicationExtensionsTests
13{
14 private static ServiceProvider BuildServiceProvider(Dictionary<string, string?> configData, string? aadConfigSectionName = null)
15 {
16 IConfigurationRoot configuration = new ConfigurationBuilder()
17 .AddInMemoryCollection(configData)
18 .Build();
19
20 ServiceCollection services = new();
21 services.AddSingleton<IConfiguration>(configuration);
22 services.AddLogging();
23
24 if (aadConfigSectionName is null)
25 {
26 services.AddConversationClient();
27 }
28 else
29 {
30 services.AddConversationClient(aadConfigSectionName);
31 }
32
33 return services.BuildServiceProvider();
34 }
35
36 private static void AssertMsalOptions(ServiceProvider serviceProvider, string expectedClientId, string expectedTenantId, string expectedInstance = "https://login.microsoftonline.com/")
37 {
38 var msalOptions = serviceProvider
39 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
40 .Get(AddBotApplicationExtensions.MsalConfigKey);
41 Assert.Equal(expectedClientId, msalOptions.ClientId);
42 Assert.Equal(expectedTenantId, msalOptions.TenantId);
43 Assert.Equal(expectedInstance, msalOptions.Instance);
44 }
45
46 [Fact]
47 public void AddConversationClient_WithBotFrameworkConfig_ConfiguresClientSecret()
48 {
49 // Arrange
50 var configData = new Dictionary<string, string?>
51 {
52 ["MicrosoftAppId"] = "test-app-id",
53 ["MicrosoftAppTenantId"] = "test-tenant-id",
54 ["MicrosoftAppPassword"] = "test-secret"
55 };
56
57 // Act
58 ServiceProvider serviceProvider = BuildServiceProvider(configData);
59
60 // Assert
61 AssertMsalOptions(serviceProvider, "test-app-id", "test-tenant-id");
62 var msalOptions = serviceProvider
63 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
64 .Get(AddBotApplicationExtensions.MsalConfigKey);
65 Assert.NotNull(msalOptions.ClientCredentials);
66 Assert.Single(msalOptions.ClientCredentials);
67 CredentialDescription credential = msalOptions.ClientCredentials.First();
68 Assert.Equal(CredentialSource.ClientSecret, credential.SourceType);
69 Assert.Equal("test-secret", credential.ClientSecret);
70 }
71
72 [Fact]
73 public void AddConversationClient_WithCoreConfigAndClientSecret_ConfiguresClientSecret()
74 {
75 // Arrange
76 Dictionary<string, string?> configData = new()
77 {
78 ["CLIENT_ID"] = "test-client-id",
79 ["TENANT_ID"] = "test-tenant-id",
80 ["CLIENT_SECRET"] = "test-client-secret"
81 };
82
83 // Act
84 ServiceProvider serviceProvider = BuildServiceProvider(configData);
85
86 // Assert
87 AssertMsalOptions(serviceProvider, "test-client-id", "test-tenant-id");
88 var msalOptions = serviceProvider
89 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
90 .Get(AddBotApplicationExtensions.MsalConfigKey);
91 Assert.NotNull(msalOptions.ClientCredentials);
92 Assert.Single(msalOptions.ClientCredentials);
93 CredentialDescription credential = msalOptions.ClientCredentials.First();
94 Assert.Equal(CredentialSource.ClientSecret, credential.SourceType);
95 Assert.Equal("test-client-secret", credential.ClientSecret);
96 }
97
98 [Fact]
99 public void AddConversationClient_WithCoreConfigAndSystemAssignedMI_ConfiguresSystemAssignedFIC()
100 {
101 // Arrange
102 Dictionary<string, string?> configData = new()
103 {
104 ["CLIENT_ID"] = "test-client-id",
105 ["TENANT_ID"] = "test-tenant-id",
106 ["MANAGED_IDENTITY_CLIENT_ID"] = "system"
107 };
108
109 // Act
110 ServiceProvider serviceProvider = BuildServiceProvider(configData);
111
112 // Assert
113 AssertMsalOptions(serviceProvider, "test-client-id", "test-tenant-id");
114 var msalOptions = serviceProvider
115 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
116 .Get(AddBotApplicationExtensions.MsalConfigKey);
117 Assert.NotNull(msalOptions.ClientCredentials);
118 Assert.Single(msalOptions.ClientCredentials);
119 CredentialDescription credential = msalOptions.ClientCredentials.First();
120 Assert.Equal(CredentialSource.SignedAssertionFromManagedIdentity, credential.SourceType);
121 Assert.Null(credential.ManagedIdentityClientId); // System-assigned
122
123 ManagedIdentityOptions managedIdentityOptions = serviceProvider.GetRequiredService<IOptions<ManagedIdentityOptions>>().Value;
124 Assert.Null(managedIdentityOptions.UserAssignedClientId);
125 }
126
127 [Fact]
128 public void AddConversationClient_WithCoreConfigAndUserAssignedMI_ConfiguresUserAssignedFIC()
129 {
130 // Arrange
131 Dictionary<string, string?> configData = new()
132 {
133 ["CLIENT_ID"] = "test-client-id",
134 ["TENANT_ID"] = "test-tenant-id",
135 ["MANAGED_IDENTITY_CLIENT_ID"] = "umi-client-id" // Different from CLIENT_ID means FIC
136 };
137
138 // Act
139 ServiceProvider serviceProvider = BuildServiceProvider(configData);
140
141 // Assert
142 AssertMsalOptions(serviceProvider, "test-client-id", "test-tenant-id");
143 var msalOptions = serviceProvider
144 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
145 .Get(AddBotApplicationExtensions.MsalConfigKey);
146 Assert.NotNull(msalOptions.ClientCredentials);
147 Assert.Single(msalOptions.ClientCredentials);
148 CredentialDescription credential = msalOptions.ClientCredentials.First();
149 Assert.Equal(CredentialSource.SignedAssertionFromManagedIdentity, credential.SourceType);
150 Assert.Equal("umi-client-id", credential.ManagedIdentityClientId);
151
152 ManagedIdentityOptions managedIdentityOptions = serviceProvider.GetRequiredService<IOptions<ManagedIdentityOptions>>().Value;
153 Assert.Null(managedIdentityOptions.UserAssignedClientId);
154 }
155
156 [Fact]
157 public void AddConversationClient_WithCoreConfigAndNoManagedIdentity_ConfiguresUMIWithClientId()
158 {
159 // Arrange
160 Dictionary<string, string?> configData = new()
161 {
162 ["CLIENT_ID"] = "test-client-id",
163 ["TENANT_ID"] = "test-tenant-id"
164 };
165
166 // Act
167 ServiceProvider serviceProvider = BuildServiceProvider(configData);
168
169 // Assert
170 AssertMsalOptions(serviceProvider, "test-client-id", "test-tenant-id");
171 var msalOptions = serviceProvider
172 .GetRequiredService<IOptionsMonitor<MicrosoftIdentityApplicationOptions>>()
173 .Get(AddBotApplicationExtensions.MsalConfigKey);
174 Assert.Null(msalOptions.ClientCredentials);
175
176 ManagedIdentityOptions managedIdentityOptions = serviceProvider.GetRequiredService<IOptions<ManagedIdentityOptions>>().Value;
177 Assert.Equal("test-client-id", managedIdentityOptions.UserAssignedClientId);
178 }
179
180 [Fact]
181 public void AddConversationClient_WithDefaultSection_ConfiguresFromSection()
182 {
183 // AzureAd is the default Section Name
184 // Arrange
185 Dictionary<string, string?> configData = new()
186 {
187 ["AzureAd:ClientId"] = "azuread-client-id",
188 ["AzureAd:TenantId"] = "azuread-tenant-id",
189 ["AzureAd:Instance"] = "https://login.microsoftonline.com/"
190 };
191
192 // Act
193 ServiceProvider serviceProvider = BuildServiceProvider(configData);
194
195 // Assert
196 AssertMsalOptions(serviceProvider, "azuread-client-id", "azuread-tenant-id");
197 }
198
199 [Fact]
200 public void AddConversationClient_WithCustomSectionName_ConfiguresFromCustomSection()
201 {
202 // Arrange
203 Dictionary<string, string?> configData = new()
204 {
205 ["CustomAuth:ClientId"] = "custom-client-id",
206 ["CustomAuth:TenantId"] = "custom-tenant-id",
207 ["CustomAuth:Instance"] = "https://login.microsoftonline.com/"
208 };
209
210 // Act
211 ServiceProvider serviceProvider = BuildServiceProvider(configData, "CustomAuth");
212
213 // Assert
214 AssertMsalOptions(serviceProvider, "custom-client-id", "custom-tenant-id");
215 }
216}
217