Skip to content

Commit b9d9107

Browse files
committed
Enable CA2007 for all ns2.0 projects
Contributes to dotnet#24055
1 parent b89eba6 commit b9d9107

36 files changed

+268
-279
lines changed

.editorconfig

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ dotnet_diagnostic.CA1845.severity = warning
175175
# CA1846: Prefer AsSpan over Substring
176176
dotnet_diagnostic.CA1846.severity = warning
177177

178+
# CA2007: Consider calling ConfigureAwait on the awaited task
179+
dotnet_diagnostic.CA2007.severity = warning
180+
178181
# CA2008: Do not create tasks without passing a TaskScheduler
179182
dotnet_diagnostic.CA2008.severity = warning
180183

@@ -250,7 +253,7 @@ dotnet_diagnostic.IDE0161.severity = warning
250253
dotnet_style_allow_multiple_blank_lines_experimental = false
251254
dotnet_diagnostic.IDE2000.severity = warning
252255

253-
[**/{test,samples,perf}/**.{cs,vb}]
256+
[{eng/tools/**.cs,**/{test,samples,perf}/**.cs}]
254257
# CA1018: Mark attributes with AttributeUsageAttribute
255258
dotnet_diagnostic.CA1018.severity = suggestion
256259
# CA1507: Use nameof to express symbol names

eng/targets/CSharp.Common.targets

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@
3434
<!-- Turn off unused usings warning for multi-targeted projects. Fixing them using ifdefs looks worse than ignoring the warnings. -->
3535
<NoWarn Condition="'$(TargetFrameworks)' != ''">$(NoWarn);IDE0005</NoWarn>
3636

37+
<!--
38+
Turn off ConfigureAwait analyzer rule in the projects that are exclusively meant to run in the ASP.NET Core or Blazor.
39+
Since we don't have a good way to detect this, we'll use the presence of ns2.0 as a proxy.
40+
-->
41+
<NoWarn Condition="'$(_IsSrcProject)' != 'true' OR !$(TargetFrameworks.Contains('netstandard'))">$(NoWarn);CA2007</NoWarn>
42+
3743
<!-- Enable .NET code style analysis during build for src projects. -->
3844
<EnforceCodeStyleInBuild Condition="'$(EnforceCodeStyleInBuild)' == ''">true</EnforceCodeStyleInBuild>
3945

src/HealthChecks/HealthChecks/src/HealthCheckPublisherHostedService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public Task StopAsync(CancellationToken cancellationToken = default)
101101
// Yes, async void. We need to be async. We need to be void. We handle the exceptions in RunAsync
102102
private async void Timer_Tick(object? state)
103103
{
104-
await RunAsync();
104+
await RunAsync().ConfigureAwait(false);
105105
}
106106

107107
// Internal for testing
@@ -125,7 +125,7 @@ internal async Task RunAsync()
125125
_runTokenSource = cancellation;
126126
cancellation.CancelAfter(timeout);
127127

128-
await RunAsyncCore(cancellation.Token);
128+
await RunAsyncCore(cancellation.Token).ConfigureAwait(false);
129129

130130
Logger.HealthCheckPublisherProcessingEnd(_logger, duration.GetElapsedTime());
131131
}
@@ -151,7 +151,7 @@ private async Task RunAsyncCore(CancellationToken cancellationToken)
151151
await Task.Yield();
152152

153153
// The health checks service does it's own logging, and doesn't throw exceptions.
154-
var report = await _healthCheckService.CheckHealthAsync(_options.Value.Predicate, cancellationToken);
154+
var report = await _healthCheckService.CheckHealthAsync(_options.Value.Predicate, cancellationToken).ConfigureAwait(false);
155155

156156
var publishers = _publishers;
157157
var tasks = new Task[publishers.Length];
@@ -160,7 +160,7 @@ private async Task RunAsyncCore(CancellationToken cancellationToken)
160160
tasks[i] = RunPublisherAsync(publishers[i], report, cancellationToken);
161161
}
162162

163-
await Task.WhenAll(tasks);
163+
await Task.WhenAll(tasks).ConfigureAwait(false);
164164
}
165165

166166
private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthReport report, CancellationToken cancellationToken)
@@ -171,7 +171,7 @@ private async Task RunPublisherAsync(IHealthCheckPublisher publisher, HealthRepo
171171
{
172172
Logger.HealthCheckPublisherBegin(_logger, publisher);
173173

174-
await publisher.PublishAsync(report, cancellationToken);
174+
await publisher.PublishAsync(report, cancellationToken).ConfigureAwait(false);
175175
Logger.HealthCheckPublisherEnd(_logger, publisher, duration.GetElapsedTime());
176176
}
177177
catch (OperationCanceledException) when (IsStopping)

src/Identity/Extensions.Core/src/AuthenticatorTokenProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class AuthenticatorTokenProvider<TUser> : IUserTwoFactorTokenProvider<TUs
2020
/// <returns>True if the user has an authenticator key set, otherwise false.</returns>
2121
public virtual async Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUser> manager, TUser user)
2222
{
23-
var key = await manager.GetAuthenticatorKeyAsync(user);
23+
var key = await manager.GetAuthenticatorKeyAsync(user).ConfigureAwait(false);
2424

2525
return !string.IsNullOrWhiteSpace(key);
2626
}
@@ -47,7 +47,7 @@ public virtual Task<string> GenerateAsync(string purpose, UserManager<TUser> man
4747
/// <returns></returns>
4848
public virtual async Task<bool> ValidateAsync(string purpose, string token, UserManager<TUser> manager, TUser user)
4949
{
50-
var key = await manager.GetAuthenticatorKeyAsync(user);
50+
var key = await manager.GetAuthenticatorKeyAsync(user).ConfigureAwait(false);
5151
int code;
5252
if (key == null || !int.TryParse(token, out code))
5353
{

src/Identity/Extensions.Core/src/DefaultUserConfirmation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ public class DefaultUserConfirmation<TUser> : IUserConfirmation<TUser> where TUs
1919
/// <returns>The <see cref="Task"/> that represents the asynchronous operation, containing the <see cref="IdentityResult"/> of the confirmation operation.</returns>
2020
public virtual async Task<bool> IsConfirmedAsync(UserManager<TUser> manager, TUser user)
2121
{
22-
return await manager.IsEmailConfirmedAsync(user);
22+
return await manager.IsEmailConfirmedAsync(user).ConfigureAwait(false);
2323
}
2424
}

src/Identity/Extensions.Core/src/EmailTokenProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public class EmailTokenProvider<TUser> : TotpSecurityStampBasedTokenProvider<TUs
2020
/// <returns>True if the user has an email address set, otherwise false.</returns>
2121
public override async Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUser> manager, TUser user)
2222
{
23-
var email = await manager.GetEmailAsync(user);
23+
var email = await manager.GetEmailAsync(user).ConfigureAwait(false);
2424

25-
return !string.IsNullOrWhiteSpace(email) && await manager.IsEmailConfirmedAsync(user);
25+
return !string.IsNullOrWhiteSpace(email) && await manager.IsEmailConfirmedAsync(user).ConfigureAwait(false);
2626
}
2727

2828
/// <summary>
@@ -35,7 +35,7 @@ public override async Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUse
3535
public override async Task<string> GetUserModifierAsync(string purpose, UserManager<TUser> manager,
3636
TUser user)
3737
{
38-
var email = await manager.GetEmailAsync(user);
38+
var email = await manager.GetEmailAsync(user).ConfigureAwait(false);
3939

4040
return $"Email:{purpose}:{email}";
4141
}

src/Identity/Extensions.Core/src/PhoneNumberTokenProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ public override async Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUse
3333
throw new ArgumentNullException(nameof(manager));
3434
}
3535

36-
var phoneNumber = await manager.GetPhoneNumberAsync(user);
36+
var phoneNumber = await manager.GetPhoneNumberAsync(user).ConfigureAwait(false);
3737

38-
return !string.IsNullOrWhiteSpace(phoneNumber) && await manager.IsPhoneNumberConfirmedAsync(user);
38+
return !string.IsNullOrWhiteSpace(phoneNumber) && await manager.IsPhoneNumberConfirmedAsync(user).ConfigureAwait(false);
3939
}
4040

4141
/// <summary>
@@ -55,7 +55,7 @@ public override async Task<string> GetUserModifierAsync(string purpose, UserMana
5555
throw new ArgumentNullException(nameof(manager));
5656
}
5757

58-
var phoneNumber = await manager.GetPhoneNumberAsync(user);
58+
var phoneNumber = await manager.GetPhoneNumberAsync(user).ConfigureAwait(false);
5959

6060
return $"PhoneNumber:{purpose}:{phoneNumber}";
6161
}

src/Identity/Extensions.Core/src/RoleManager.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,13 @@ public virtual async Task<IdentityResult> CreateAsync(TRole role)
160160
{
161161
throw new ArgumentNullException(nameof(role));
162162
}
163-
var result = await ValidateRoleAsync(role);
163+
var result = await ValidateRoleAsync(role).ConfigureAwait(false);
164164
if (!result.Succeeded)
165165
{
166166
return result;
167167
}
168-
await UpdateNormalizedRoleNameAsync(role);
169-
result = await Store.CreateAsync(role, CancellationToken);
168+
await UpdateNormalizedRoleNameAsync(role).ConfigureAwait(false);
169+
result = await Store.CreateAsync(role, CancellationToken).ConfigureAwait(false);
170170
return result;
171171
}
172172

@@ -179,8 +179,8 @@ public virtual async Task<IdentityResult> CreateAsync(TRole role)
179179
/// </returns>
180180
public virtual async Task UpdateNormalizedRoleNameAsync(TRole role)
181181
{
182-
var name = await GetRoleNameAsync(role);
183-
await Store.SetNormalizedRoleNameAsync(role, NormalizeKey(name), CancellationToken);
182+
var name = await GetRoleNameAsync(role).ConfigureAwait(false);
183+
await Store.SetNormalizedRoleNameAsync(role, NormalizeKey(name), CancellationToken).ConfigureAwait(false);
184184
}
185185

186186
/// <summary>
@@ -234,7 +234,7 @@ public virtual async Task<bool> RoleExistsAsync(string roleName)
234234
throw new ArgumentNullException(nameof(roleName));
235235
}
236236

237-
return await FindByNameAsync(roleName) != null;
237+
return await FindByNameAsync(roleName).ConfigureAwait(false) != null;
238238
}
239239

240240
/// <summary>
@@ -288,8 +288,8 @@ public virtual async Task<IdentityResult> SetRoleNameAsync(TRole role, string na
288288
{
289289
ThrowIfDisposed();
290290

291-
await Store.SetRoleNameAsync(role, name, CancellationToken);
292-
await UpdateNormalizedRoleNameAsync(role);
291+
await Store.SetRoleNameAsync(role, name, CancellationToken).ConfigureAwait(false);
292+
await UpdateNormalizedRoleNameAsync(role).ConfigureAwait(false);
293293
return IdentityResult.Success;
294294
}
295295

@@ -348,8 +348,8 @@ public virtual async Task<IdentityResult> AddClaimAsync(TRole role, Claim claim)
348348
throw new ArgumentNullException(nameof(role));
349349
}
350350

351-
await claimStore.AddClaimAsync(role, claim, CancellationToken);
352-
return await UpdateRoleAsync(role);
351+
await claimStore.AddClaimAsync(role, claim, CancellationToken).ConfigureAwait(false);
352+
return await UpdateRoleAsync(role).ConfigureAwait(false);
353353
}
354354

355355
/// <summary>
@@ -370,8 +370,8 @@ public virtual async Task<IdentityResult> RemoveClaimAsync(TRole role, Claim cla
370370
throw new ArgumentNullException(nameof(role));
371371
}
372372

373-
await claimStore.RemoveClaimAsync(role, claim, CancellationToken);
374-
return await UpdateRoleAsync(role);
373+
await claimStore.RemoveClaimAsync(role, claim, CancellationToken).ConfigureAwait(false);
374+
return await UpdateRoleAsync(role).ConfigureAwait(false);
375375
}
376376

377377
/// <summary>
@@ -426,15 +426,15 @@ protected virtual async Task<IdentityResult> ValidateRoleAsync(TRole role)
426426
var errors = new List<IdentityError>();
427427
foreach (var v in RoleValidators)
428428
{
429-
var result = await v.ValidateAsync(this, role);
429+
var result = await v.ValidateAsync(this, role).ConfigureAwait(false);
430430
if (!result.Succeeded)
431431
{
432432
errors.AddRange(result.Errors);
433433
}
434434
}
435435
if (errors.Count > 0)
436436
{
437-
Logger.LogWarning(LoggerEventIds.RoleValidationFailed, "Role {roleId} validation failed: {errors}.", await GetRoleIdAsync(role), string.Join(";", errors.Select(e => e.Code)));
437+
Logger.LogWarning(LoggerEventIds.RoleValidationFailed, "Role {roleId} validation failed: {errors}.", await GetRoleIdAsync(role).ConfigureAwait(false), string.Join(";", errors.Select(e => e.Code)));
438438
return IdentityResult.Failed(errors.ToArray());
439439
}
440440
return IdentityResult.Success;
@@ -447,13 +447,13 @@ protected virtual async Task<IdentityResult> ValidateRoleAsync(TRole role)
447447
/// <returns>Whether the operation was successful.</returns>
448448
protected virtual async Task<IdentityResult> UpdateRoleAsync(TRole role)
449449
{
450-
var result = await ValidateRoleAsync(role);
450+
var result = await ValidateRoleAsync(role).ConfigureAwait(false);
451451
if (!result.Succeeded)
452452
{
453453
return result;
454454
}
455-
await UpdateNormalizedRoleNameAsync(role);
456-
return await Store.UpdateAsync(role, CancellationToken);
455+
await UpdateNormalizedRoleNameAsync(role).ConfigureAwait(false);
456+
return await Store.UpdateAsync(role, CancellationToken).ConfigureAwait(false);
457457
}
458458

459459
// IRoleClaimStore methods

src/Identity/Extensions.Core/src/RoleValidator.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public virtual async Task<IdentityResult> ValidateAsync(RoleManager<TRole> manag
4141
throw new ArgumentNullException(nameof(role));
4242
}
4343
var errors = new List<IdentityError>();
44-
await ValidateRoleName(manager, role, errors);
44+
await ValidateRoleName(manager, role, errors).ConfigureAwait(false);
4545
if (errors.Count > 0)
4646
{
4747
return IdentityResult.Failed(errors.ToArray());
@@ -52,16 +52,16 @@ public virtual async Task<IdentityResult> ValidateAsync(RoleManager<TRole> manag
5252
private async Task ValidateRoleName(RoleManager<TRole> manager, TRole role,
5353
ICollection<IdentityError> errors)
5454
{
55-
var roleName = await manager.GetRoleNameAsync(role);
55+
var roleName = await manager.GetRoleNameAsync(role).ConfigureAwait(false);
5656
if (string.IsNullOrWhiteSpace(roleName))
5757
{
5858
errors.Add(Describer.InvalidRoleName(roleName));
5959
}
6060
else
6161
{
62-
var owner = await manager.FindByNameAsync(roleName);
62+
var owner = await manager.FindByNameAsync(roleName).ConfigureAwait(false);
6363
if (owner != null &&
64-
!string.Equals(await manager.GetRoleIdAsync(owner), await manager.GetRoleIdAsync(role)))
64+
!string.Equals(await manager.GetRoleIdAsync(owner).ConfigureAwait(false), await manager.GetRoleIdAsync(role).ConfigureAwait(false)))
6565
{
6666
errors.Add(Describer.DuplicateRoleName(roleName));
6767
}

src/Identity/Extensions.Core/src/TotpSecurityStampBasedTokenProvider.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public virtual async Task<string> GenerateAsync(string purpose, UserManager<TUse
3939
{
4040
throw new ArgumentNullException(nameof(manager));
4141
}
42-
var token = await manager.CreateSecurityTokenAsync(user);
43-
var modifier = await GetUserModifierAsync(purpose, manager, user);
42+
var token = await manager.CreateSecurityTokenAsync(user).ConfigureAwait(false);
43+
var modifier = await GetUserModifierAsync(purpose, manager, user).ConfigureAwait(false);
4444

4545
return Rfc6238AuthenticationService.GenerateCode(token, modifier).ToString("D6", CultureInfo.InvariantCulture);
4646
}
@@ -69,8 +69,8 @@ public virtual async Task<bool> ValidateAsync(string purpose, string token, User
6969
{
7070
return false;
7171
}
72-
var securityToken = await manager.CreateSecurityTokenAsync(user);
73-
var modifier = await GetUserModifierAsync(purpose, manager, user);
72+
var securityToken = await manager.CreateSecurityTokenAsync(user).ConfigureAwait(false);
73+
var modifier = await GetUserModifierAsync(purpose, manager, user).ConfigureAwait(false);
7474

7575
return securityToken != null && Rfc6238AuthenticationService.ValidateCode(securityToken, code, modifier);
7676
}
@@ -91,7 +91,7 @@ public virtual async Task<string> GetUserModifierAsync(string purpose, UserManag
9191
{
9292
throw new ArgumentNullException(nameof(manager));
9393
}
94-
var userId = await manager.GetUserIdAsync(user);
94+
var userId = await manager.GetUserIdAsync(user).ConfigureAwait(false);
9595

9696
return $"Totp:{purpose}:{userId}";
9797
}

src/Identity/Extensions.Core/src/UserClaimsPrincipalFactory.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public virtual async Task<ClaimsPrincipal> CreateAsync(TUser user)
6363
{
6464
throw new ArgumentNullException(nameof(user));
6565
}
66-
var id = await GenerateClaimsAsync(user);
66+
var id = await GenerateClaimsAsync(user).ConfigureAwait(false);
6767
return new ClaimsPrincipal(id);
6868
}
6969

@@ -74,16 +74,16 @@ public virtual async Task<ClaimsPrincipal> CreateAsync(TUser user)
7474
/// <returns>The <see cref="Task"/> that represents the asynchronous creation operation, containing the created <see cref="ClaimsIdentity"/>.</returns>
7575
protected virtual async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
7676
{
77-
var userId = await UserManager.GetUserIdAsync(user);
78-
var userName = await UserManager.GetUserNameAsync(user);
77+
var userId = await UserManager.GetUserIdAsync(user).ConfigureAwait(false);
78+
var userName = await UserManager.GetUserNameAsync(user).ConfigureAwait(false);
7979
var id = new ClaimsIdentity("Identity.Application", // REVIEW: Used to match Application scheme
8080
Options.ClaimsIdentity.UserNameClaimType,
8181
Options.ClaimsIdentity.RoleClaimType);
8282
id.AddClaim(new Claim(Options.ClaimsIdentity.UserIdClaimType, userId));
8383
id.AddClaim(new Claim(Options.ClaimsIdentity.UserNameClaimType, userName));
8484
if (UserManager.SupportsUserEmail)
8585
{
86-
var email = await UserManager.GetEmailAsync(user);
86+
var email = await UserManager.GetEmailAsync(user).ConfigureAwait(false);
8787
if (!string.IsNullOrEmpty(email))
8888
{
8989
id.AddClaim(new Claim(Options.ClaimsIdentity.EmailClaimType, email));
@@ -92,11 +92,11 @@ protected virtual async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
9292
if (UserManager.SupportsUserSecurityStamp)
9393
{
9494
id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
95-
await UserManager.GetSecurityStampAsync(user)));
95+
await UserManager.GetSecurityStampAsync(user).ConfigureAwait(false)));
9696
}
9797
if (UserManager.SupportsUserClaim)
9898
{
99-
id.AddClaims(await UserManager.GetClaimsAsync(user));
99+
id.AddClaims(await UserManager.GetClaimsAsync(user).ConfigureAwait(false));
100100
}
101101
return id;
102102
}
@@ -142,19 +142,19 @@ public UserClaimsPrincipalFactory(UserManager<TUser> userManager, RoleManager<TR
142142
/// <returns>The <see cref="Task"/> that represents the asynchronous creation operation, containing the created <see cref="ClaimsIdentity"/>.</returns>
143143
protected override async Task<ClaimsIdentity> GenerateClaimsAsync(TUser user)
144144
{
145-
var id = await base.GenerateClaimsAsync(user);
145+
var id = await base.GenerateClaimsAsync(user).ConfigureAwait(false);
146146
if (UserManager.SupportsUserRole)
147147
{
148-
var roles = await UserManager.GetRolesAsync(user);
148+
var roles = await UserManager.GetRolesAsync(user).ConfigureAwait(false);
149149
foreach (var roleName in roles)
150150
{
151151
id.AddClaim(new Claim(Options.ClaimsIdentity.RoleClaimType, roleName));
152152
if (RoleManager.SupportsRoleClaims)
153153
{
154-
var role = await RoleManager.FindByNameAsync(roleName);
154+
var role = await RoleManager.FindByNameAsync(roleName).ConfigureAwait(false);
155155
if (role != null)
156156
{
157-
id.AddClaims(await RoleManager.GetClaimsAsync(role));
157+
id.AddClaims(await RoleManager.GetClaimsAsync(role).ConfigureAwait(false));
158158
}
159159
}
160160
}

0 commit comments

Comments
 (0)