Skip to content
This repository was archived by the owner on Dec 13, 2018. It is now read-only.

Commit 32dd435

Browse files
Kévin ChaletTratcher
Kévin Chalet
authored andcommitted
Add an opt-out DisableTelemetry option in the OpenID Connect middleware (#1140)
1 parent 9de5519 commit 32dd435

File tree

5 files changed

+61
-3
lines changed

5 files changed

+61
-3
lines changed

src/Microsoft.AspNetCore.Authentication.OpenIdConnect/OpenIdConnectHandler.cs

+3
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ protected override async Task HandleSignOutAsync(SignOutContext signout)
161161

162162
var message = new OpenIdConnectMessage()
163163
{
164+
EnableTelemetryParameters = !Options.DisableTelemetry,
164165
IssuerAddress = _configuration?.EndSessionEndpoint ?? string.Empty,
165166

166167
// Redirect back to SigneOutCallbackPath first before user agent is redirected to actual post logout redirect uri
@@ -309,6 +310,7 @@ protected override async Task<bool> HandleUnauthorizedAsync(ChallengeContext con
309310
var message = new OpenIdConnectMessage
310311
{
311312
ClientId = Options.ClientId,
313+
EnableTelemetryParameters = !Options.DisableTelemetry,
312314
IssuerAddress = _configuration?.AuthorizationEndpoint ?? string.Empty,
313315
RedirectUri = BuildRedirectUri(Options.CallbackPath),
314316
Resource = Options.Resource,
@@ -1023,6 +1025,7 @@ private async Task<AuthorizationCodeReceivedContext> RunAuthorizationCodeReceive
10231025
ClientSecret = Options.ClientSecret,
10241026
Code = authorizationResponse.Code,
10251027
GrantType = OpenIdConnectGrantTypes.AuthorizationCode,
1028+
EnableTelemetryParameters = !Options.DisableTelemetry,
10261029
RedirectUri = properties.Items[OpenIdConnectDefaults.RedirectUriForCodePropertiesKey]
10271030
};
10281031

src/Microsoft.AspNetCore.Authentication.OpenIdConnect/OpenIdConnectOptions.cs

+7
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,12 @@ public OpenIdConnectOptions(string authenticationScheme)
241241
/// This is disabled by default.
242242
/// </summary>
243243
public bool SkipUnrecognizedRequests { get; set; } = false;
244+
245+
/// <summary>
246+
/// Indicates whether telemetry should be disabled. When this feature is enabled,
247+
/// the assembly version of the Microsoft IdentityModel packages is sent to the
248+
/// remote OpenID Connect provider as an authorization/logout request parameter.
249+
/// </summary>
250+
public bool DisableTelemetry { get; set; }
244251
}
245252
}

test/Microsoft.AspNetCore.Authentication.Test/OpenIdConnect/OpenIdConnectChallengeTests.cs

+18-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,23 @@ public async Task ChallengeIsIssuedCorrectly()
3535
OpenIdConnectParameterNames.ResponseType,
3636
OpenIdConnectParameterNames.ResponseMode,
3737
OpenIdConnectParameterNames.Scope,
38-
OpenIdConnectParameterNames.RedirectUri);
38+
OpenIdConnectParameterNames.RedirectUri,
39+
OpenIdConnectParameterNames.SkuTelemetry,
40+
OpenIdConnectParameterNames.VersionTelemetry);
41+
}
42+
43+
[Fact]
44+
public async Task AuthorizationRequestDoesNotIncludeTelemetryParametersWhenDisabled()
45+
{
46+
var settings = new TestSettings(opt => opt.DisableTelemetry = true);
47+
48+
var server = settings.CreateTestServer();
49+
var transaction = await server.SendAsync(ChallengeEndpoint);
50+
51+
var res = transaction.Response;
52+
Assert.Equal(HttpStatusCode.Redirect, res.StatusCode);
53+
Assert.DoesNotContain(OpenIdConnectParameterNames.SkuTelemetry, res.Headers.Location.Query);
54+
Assert.DoesNotContain(OpenIdConnectParameterNames.VersionTelemetry, res.Headers.Location.Query);
3955
}
4056

4157
/*
@@ -58,7 +74,7 @@ Example of a form post
5874
</body>
5975
*/
6076
[Fact]
61-
public async Task ChallengeIssueedCorrectlyForFormPost()
77+
public async Task ChallengeIssuedCorrectlyForFormPost()
6278
{
6379
var settings = new TestSettings(
6480
opt => opt.AuthenticationMethod = OpenIdConnectRedirectBehavior.FormPost);

test/Microsoft.AspNetCore.Authentication.Test/OpenIdConnect/OpenIdConnectMiddlewareTests.cs

+19-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,25 @@ public async Task SignOutSettingMessage()
4646
Assert.Equal(HttpStatusCode.Redirect, res.StatusCode);
4747
Assert.NotNull(res.Headers.Location);
4848

49-
setting.ValidateSignoutRedirect(transaction.Response.Headers.Location);
49+
setting.ValidateSignoutRedirect(
50+
transaction.Response.Headers.Location,
51+
OpenIdConnectParameterNames.SkuTelemetry,
52+
OpenIdConnectParameterNames.VersionTelemetry);
53+
}
54+
55+
[Fact]
56+
public async Task EndSessionRequestDoesNotIncludeTelemetryParametersWhenDisabled()
57+
{
58+
var setting = new TestSettings(opt => opt.DisableTelemetry = true);
59+
60+
var server = setting.CreateTestServer();
61+
62+
var transaction = await server.SendAsync(DefaultHost + TestServerBuilder.Signout);
63+
var res = transaction.Response;
64+
65+
Assert.Equal(HttpStatusCode.Redirect, res.StatusCode);
66+
Assert.DoesNotContain(OpenIdConnectParameterNames.SkuTelemetry, res.Headers.Location.Query);
67+
Assert.DoesNotContain(OpenIdConnectParameterNames.VersionTelemetry, res.Headers.Location.Query);
5068
}
5169

5270
[Fact]

test/Microsoft.AspNetCore.Authentication.Test/OpenIdConnect/TestSettings.cs

+14
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Diagnostics;
77
using System.Linq;
8+
using System.Reflection;
89
using System.Text;
910
using System.Text.Encodings.Web;
1011
using System.Xml.Linq;
@@ -152,6 +153,12 @@ private void ValidateParameters(
152153
case OpenIdConnectParameterNames.State:
153154
ValidateState(actualValues, errors, htmlEncoded);
154155
break;
156+
case OpenIdConnectParameterNames.SkuTelemetry:
157+
ValidateSkuTelemetry(actualValues, errors, htmlEncoded);
158+
break;
159+
case OpenIdConnectParameterNames.VersionTelemetry:
160+
ValidateVersionTelemetry(actualValues, errors, htmlEncoded);
161+
break;
155162
default:
156163
throw new InvalidOperationException($"Unknown parameter \"{paramToValidate}\".");
157164
}
@@ -201,6 +208,13 @@ private void ValidateResource(IDictionary<string, string> actualQuery, ICollecti
201208
private void ValidateState(IDictionary<string, string> actualQuery, ICollection<string> errors, bool htmlEncoded) =>
202209
ValidateQueryParameter(OpenIdConnectParameterNames.State, ExpectedState, actualQuery, errors, htmlEncoded);
203210

211+
private void ValidateSkuTelemetry(IDictionary<string, string> actualQuery, ICollection<string> errors, bool htmlEncoded) =>
212+
ValidateQueryParameter(OpenIdConnectParameterNames.SkuTelemetry, "ID_NET", actualQuery, errors, htmlEncoded);
213+
214+
private void ValidateVersionTelemetry(IDictionary<string, string> actualQuery, ICollection<string> errors, bool htmlEncoded) =>
215+
ValidateQueryParameter(OpenIdConnectParameterNames.VersionTelemetry,
216+
typeof(OpenIdConnectMessage).GetTypeInfo().Assembly.GetName().Version.ToString(), actualQuery, errors, htmlEncoded);
217+
204218
private void ValidateQueryParameter(
205219
string parameterName,
206220
string expectedValue,

0 commit comments

Comments
 (0)