Skip to content

Commit eed7089

Browse files
authored
Trim identity (#42675)
1 parent c10f4c4 commit eed7089

12 files changed

+55
-25
lines changed

eng/TrimmableProjects.props

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
<TrimmableProject Include="Microsoft.AspNetCore.Routing" />
3232
<TrimmableProject Include="Microsoft.AspNetCore.WebUtilities" />
3333
<TrimmableProject Include="Microsoft.AspNetCore.Html.Abstractions" />
34+
<TrimmableProject Include="Microsoft.AspNetCore.Identity" />
35+
<TrimmableProject Include="Microsoft.Extensions.Identity.Core" />
36+
<TrimmableProject Include="Microsoft.Extensions.Identity.Stores" />
3437
<TrimmableProject Include="Microsoft.AspNetCore.Connections.Abstractions" />
3538
<TrimmableProject Include="Microsoft.AspNetCore.Server.HttpSys" />
3639
<TrimmableProject Include="Microsoft.AspNetCore.Server.IISIntegration" />
@@ -88,6 +91,7 @@
8891
<TrimmableProject Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" />
8992
<TrimmableProject Include="Microsoft.AspNetCore.Components.WebAssembly" />
9093
<TrimmableProject Include="Microsoft.AspNetCore.Components.Web" />
94+
<TrimmableProject Include="Microsoft.Extensions.Localization.Abstractions" />
9195
<TrimmableProject Include="Microsoft.Extensions.ObjectPool" />
9296
<TrimmableProject Include="Microsoft.JSInterop" />
9397
<TrimmableProject Include="Microsoft.Extensions.WebEncoders" />

src/Identity/Core/src/IdentityBuilderExtensions.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics.CodeAnalysis;
45
using Microsoft.Extensions.DependencyInjection;
56

67
namespace Microsoft.AspNetCore.Identity;
@@ -55,7 +56,7 @@ public static IdentityBuilder AddSignInManager(this IdentityBuilder builder)
5556
/// <typeparam name="TSignInManager">The type of the sign in manager to add.</typeparam>
5657
/// <param name="builder">The current <see cref="IdentityBuilder"/> instance.</param>
5758
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
58-
public static IdentityBuilder AddSignInManager<TSignInManager>(this IdentityBuilder builder) where TSignInManager : class
59+
public static IdentityBuilder AddSignInManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TSignInManager>(this IdentityBuilder builder) where TSignInManager : class
5960
{
6061
builder.AddSignInManagerDeps();
6162
var managerType = typeof(SignInManager<>).MakeGenericType(builder.UserType);

src/Identity/Core/src/IdentityServiceCollectionExtensions.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics.CodeAnalysis;
45
using Microsoft.AspNetCore.Authentication.Cookies;
56
using Microsoft.AspNetCore.Http;
67
using Microsoft.AspNetCore.Identity;
@@ -20,7 +21,7 @@ public static class IdentityServiceCollectionExtensions
2021
/// <typeparam name="TRole">The type representing a Role in the system.</typeparam>
2122
/// <param name="services">The services available in the application.</param>
2223
/// <returns>An <see cref="IdentityBuilder"/> for creating and configuring the identity system.</returns>
23-
public static IdentityBuilder AddIdentity<TUser, TRole>(
24+
public static IdentityBuilder AddIdentity<TUser, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>(
2425
this IServiceCollection services)
2526
where TUser : class
2627
where TRole : class
@@ -34,7 +35,7 @@ public static IdentityBuilder AddIdentity<TUser, TRole>(
3435
/// <param name="services">The services available in the application.</param>
3536
/// <param name="setupAction">An action to configure the <see cref="IdentityOptions"/>.</param>
3637
/// <returns>An <see cref="IdentityBuilder"/> for creating and configuring the identity system.</returns>
37-
public static IdentityBuilder AddIdentity<TUser, TRole>(
38+
public static IdentityBuilder AddIdentity<TUser, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>(
3839
this IServiceCollection services,
3940
Action<IdentityOptions> setupAction)
4041
where TUser : class

src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj

+4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88
<PackageTags>aspnetcore;identity;membership</PackageTags>
99
<IsPackable>false</IsPackable>
10+
<IsTrimmable>true</IsTrimmable>
1011
</PropertyGroup>
1112

1213
<ItemGroup>
1314
<Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
1415
<Reference Include="Microsoft.Extensions.Identity.Core" />
16+
17+
<Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
18+
Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
1519
</ItemGroup>
1620

1721
</Project>

src/Identity/EntityFrameworkCore/src/UserStore.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics.CodeAnalysis;
45
using System.Globalization;
56
using System.Linq;
67
using System.Security.Claims;
@@ -89,7 +90,7 @@ public UserStore(TContext context, IdentityErrorDescriber? describer = null) : b
8990
/// <typeparam name="TUserLogin">The type representing a user external login.</typeparam>
9091
/// <typeparam name="TUserToken">The type representing a user token.</typeparam>
9192
/// <typeparam name="TRoleClaim">The type representing a role claim.</typeparam>
92-
public class UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
93+
public class UserStore<TUser, TRole, TContext, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
9394
UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>,
9495
IProtectedUserStore<TUser>
9596
where TUser : IdentityUser<TKey>

src/Identity/Extensions.Core/src/IdentityBuilder.cs

+18-16
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using Microsoft.Extensions.DependencyInjection;
67
using Microsoft.Extensions.DependencyInjection.Extensions;
78
using Microsoft.Extensions.Identity.Core;
@@ -30,7 +31,7 @@ public IdentityBuilder(Type user, IServiceCollection services)
3031
/// <param name="user">The <see cref="Type"/> to use for the users.</param>
3132
/// <param name="role">The <see cref="Type"/> to use for the roles.</param>
3233
/// <param name="services">The <see cref="IServiceCollection"/> to attach to.</param>
33-
public IdentityBuilder(Type user, Type role, IServiceCollection services) : this(user, services)
34+
public IdentityBuilder(Type user, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type role, IServiceCollection services) : this(user, services)
3435
=> RoleType = role;
3536

3637
/// <summary>
@@ -47,6 +48,7 @@ public IdentityBuilder(Type user, Type role, IServiceCollection services) : this
4748
/// <value>
4849
/// The <see cref="Type"/> used for roles.
4950
/// </value>
51+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
5052
public Type? RoleType { get; private set; }
5153

5254
/// <summary>
@@ -57,7 +59,7 @@ public IdentityBuilder(Type user, Type role, IServiceCollection services) : this
5759
/// </value>
5860
public IServiceCollection Services { get; }
5961

60-
private IdentityBuilder AddScoped(Type serviceType, Type concreteType)
62+
private IdentityBuilder AddScoped(Type serviceType, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type concreteType)
6163
{
6264
Services.AddScoped(serviceType, concreteType);
6365
return this;
@@ -68,23 +70,23 @@ private IdentityBuilder AddScoped(Type serviceType, Type concreteType)
6870
/// </summary>
6971
/// <typeparam name="TValidator">The user validator type.</typeparam>
7072
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
71-
public virtual IdentityBuilder AddUserValidator<TValidator>() where TValidator : class
73+
public virtual IdentityBuilder AddUserValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>() where TValidator : class
7274
=> AddScoped(typeof(IUserValidator<>).MakeGenericType(UserType), typeof(TValidator));
7375

7476
/// <summary>
7577
/// Adds an <see cref="IUserClaimsPrincipalFactory{TUser}"/> for the <see cref="UserType"/>.
7678
/// </summary>
7779
/// <typeparam name="TFactory">The type of the claims principal factory.</typeparam>
7880
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
79-
public virtual IdentityBuilder AddClaimsPrincipalFactory<TFactory>() where TFactory : class
81+
public virtual IdentityBuilder AddClaimsPrincipalFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFactory>() where TFactory : class
8082
=> AddScoped(typeof(IUserClaimsPrincipalFactory<>).MakeGenericType(UserType), typeof(TFactory));
8183

8284
/// <summary>
8385
/// Adds an <see cref="IdentityErrorDescriber"/>.
8486
/// </summary>
8587
/// <typeparam name="TDescriber">The type of the error describer.</typeparam>
8688
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
87-
public virtual IdentityBuilder AddErrorDescriber<TDescriber>() where TDescriber : IdentityErrorDescriber
89+
public virtual IdentityBuilder AddErrorDescriber<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TDescriber>() where TDescriber : IdentityErrorDescriber
8890
{
8991
Services.AddScoped<IdentityErrorDescriber, TDescriber>();
9092
return this;
@@ -95,15 +97,15 @@ public virtual IdentityBuilder AddErrorDescriber<TDescriber>() where TDescriber
9597
/// </summary>
9698
/// <typeparam name="TValidator">The validator type used to validate passwords.</typeparam>
9799
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
98-
public virtual IdentityBuilder AddPasswordValidator<TValidator>() where TValidator : class
100+
public virtual IdentityBuilder AddPasswordValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>() where TValidator : class
99101
=> AddScoped(typeof(IPasswordValidator<>).MakeGenericType(UserType), typeof(TValidator));
100102

101103
/// <summary>
102104
/// Adds an <see cref="IUserStore{TUser}"/> for the <see cref="UserType"/>.
103105
/// </summary>
104106
/// <typeparam name="TStore">The user store type.</typeparam>
105107
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
106-
public virtual IdentityBuilder AddUserStore<TStore>() where TStore : class
108+
public virtual IdentityBuilder AddUserStore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TStore>() where TStore : class
107109
=> AddScoped(typeof(IUserStore<>).MakeGenericType(UserType), typeof(TStore));
108110

109111
/// <summary>
@@ -112,7 +114,7 @@ public virtual IdentityBuilder AddUserStore<TStore>() where TStore : class
112114
/// <typeparam name="TProvider">The type of the token provider to add.</typeparam>
113115
/// <param name="providerName">The name of the provider to add.</param>
114116
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
115-
public virtual IdentityBuilder AddTokenProvider<TProvider>(string providerName) where TProvider : class
117+
public virtual IdentityBuilder AddTokenProvider<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TProvider>(string providerName) where TProvider : class
116118
=> AddTokenProvider(providerName, typeof(TProvider));
117119

118120
/// <summary>
@@ -121,7 +123,7 @@ public virtual IdentityBuilder AddTokenProvider<TProvider>(string providerName)
121123
/// <param name="providerName">The name of the provider to add.</param>
122124
/// <param name="provider">The type of the <see cref="IUserTwoFactorTokenProvider{TUser}"/> to add.</param>
123125
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
124-
public virtual IdentityBuilder AddTokenProvider(string providerName, Type provider)
126+
public virtual IdentityBuilder AddTokenProvider(string providerName, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type provider)
125127
{
126128
if (!typeof(IUserTwoFactorTokenProvider<>).MakeGenericType(UserType).IsAssignableFrom(provider))
127129
{
@@ -140,7 +142,7 @@ public virtual IdentityBuilder AddTokenProvider(string providerName, Type provid
140142
/// </summary>
141143
/// <typeparam name="TUserManager">The type of the user manager to add.</typeparam>
142144
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
143-
public virtual IdentityBuilder AddUserManager<TUserManager>() where TUserManager : class
145+
public virtual IdentityBuilder AddUserManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TUserManager>() where TUserManager : class
144146
{
145147
var userManagerType = typeof(UserManager<>).MakeGenericType(UserType);
146148
var customType = typeof(TUserManager);
@@ -160,7 +162,7 @@ public virtual IdentityBuilder AddUserManager<TUserManager>() where TUserManager
160162
/// </summary>
161163
/// <typeparam name="TRole">The role type.</typeparam>
162164
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
163-
public virtual IdentityBuilder AddRoles<TRole>() where TRole : class
165+
public virtual IdentityBuilder AddRoles<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>() where TRole : class
164166
{
165167
RoleType = typeof(TRole);
166168
AddRoleValidator<RoleValidator<TRole>>();
@@ -174,7 +176,7 @@ public virtual IdentityBuilder AddRoles<TRole>() where TRole : class
174176
/// </summary>
175177
/// <typeparam name="TRole">The role validator type.</typeparam>
176178
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
177-
public virtual IdentityBuilder AddRoleValidator<TRole>() where TRole : class
179+
public virtual IdentityBuilder AddRoleValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>() where TRole : class
178180
{
179181
if (RoleType == null)
180182
{
@@ -189,7 +191,7 @@ public virtual IdentityBuilder AddRoleValidator<TRole>() where TRole : class
189191
/// <typeparam name="TProtector">The personal data protector type.</typeparam>
190192
/// <typeparam name="TKeyRing">The personal data protector key ring type.</typeparam>
191193
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
192-
public virtual IdentityBuilder AddPersonalDataProtection<TProtector, TKeyRing>()
194+
public virtual IdentityBuilder AddPersonalDataProtection<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TProtector, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TKeyRing>()
193195
where TProtector : class, ILookupProtector
194196
where TKeyRing : class, ILookupProtectorKeyRing
195197
{
@@ -204,7 +206,7 @@ public virtual IdentityBuilder AddPersonalDataProtection<TProtector, TKeyRing>()
204206
/// </summary>
205207
/// <typeparam name="TStore">The role store.</typeparam>
206208
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
207-
public virtual IdentityBuilder AddRoleStore<TStore>() where TStore : class
209+
public virtual IdentityBuilder AddRoleStore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TStore>() where TStore : class
208210
{
209211
if (RoleType == null)
210212
{
@@ -218,7 +220,7 @@ public virtual IdentityBuilder AddRoleStore<TStore>() where TStore : class
218220
/// </summary>
219221
/// <typeparam name="TRoleManager">The type of the role manager to add.</typeparam>
220222
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
221-
public virtual IdentityBuilder AddRoleManager<TRoleManager>() where TRoleManager : class
223+
public virtual IdentityBuilder AddRoleManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRoleManager>() where TRoleManager : class
222224
{
223225
if (RoleType == null)
224226
{
@@ -242,6 +244,6 @@ public virtual IdentityBuilder AddRoleManager<TRoleManager>() where TRoleManager
242244
/// </summary>
243245
/// <typeparam name="TUserConfirmation">The type of the user confirmation to add.</typeparam>
244246
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
245-
public virtual IdentityBuilder AddUserConfirmation<TUserConfirmation>() where TUserConfirmation : class
247+
public virtual IdentityBuilder AddUserConfirmation<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TUserConfirmation>() where TUserConfirmation : class
246248
=> AddScoped(typeof(IUserConfirmation<>).MakeGenericType(UserType), typeof(TUserConfirmation));
247249
}

src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<Description>ASP.NET Core Identity is the membership system for building ASP.NET Core web applications, including membership, login, and user data. ASP.NET Core Identity allows you to add login features to your application and makes it easy to customize data about the logged in user.</Description>
@@ -7,12 +7,16 @@
77
<IsAspNetCoreApp>true</IsAspNetCoreApp>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>
99
<PackageTags>aspnetcore;identity;membership</PackageTags>
10+
<IsTrimmable>true</IsTrimmable>
1011
</PropertyGroup>
1112

1213
<ItemGroup>
1314
<Reference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" />
1415
<Reference Include="Microsoft.Extensions.Logging" />
1516
<Reference Include="Microsoft.Extensions.Options" />
17+
18+
<Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
19+
Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
1620
</ItemGroup>
1721

1822
<ItemGroup

src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj

+4
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
<IsAspNetCoreApp>true</IsAspNetCoreApp>
88
<GenerateDocumentationFile>true</GenerateDocumentationFile>
99
<PackageTags>aspnetcore;identity;membership</PackageTags>
10+
<IsTrimmable>true</IsTrimmable>
1011
</PropertyGroup>
1112

1213
<ItemGroup>
1314
<Reference Include="Microsoft.Extensions.Caching.Abstractions" />
1415
<Reference Include="Microsoft.Extensions.Logging" />
1516
<Reference Include="Microsoft.Extensions.Identity.Core" />
17+
18+
<Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
19+
Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
1620
</ItemGroup>
1721

1822
</Project>

src/Identity/Extensions.Stores/src/RoleStoreBase.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Identity;
1919
/// <typeparam name="TKey">The type of the primary key for a role.</typeparam>
2020
/// <typeparam name="TUserRole">The type of the class representing a user role.</typeparam>
2121
/// <typeparam name="TRoleClaim">The type of the class representing a role claim.</typeparam>
22-
public abstract class RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim> :
22+
public abstract class RoleStoreBase<TRole, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserRole, TRoleClaim> :
2323
IQueryableRoleStore<TRole>,
2424
IRoleClaimStore<TRole>
2525
where TRole : IdentityRole<TKey>
@@ -130,6 +130,8 @@ public RoleStoreBase(IdentityErrorDescriber describer)
130130
/// </summary>
131131
/// <param name="id">The id to convert.</param>
132132
/// <returns>An instance of <typeparamref name="TKey"/> representing the provided <paramref name="id"/>.</returns>
133+
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code",
134+
Justification = "TKey is annoated with RequiresUnreferencedCodeAttribute.All.")]
133135
public virtual TKey? ConvertIdFromString(string? id)
134136
{
135137
if (id == null)

0 commit comments

Comments
 (0)