< Summary

Information
Class: Elsa.Identity.Features.IdentityFeature
Assembly: Elsa.Identity
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Features/IdentityFeature.cs
Line coverage
90%
Covered lines: 70
Uncovered lines: 7
Coverable lines: 77
Total lines: 205
Line coverage: 90.9%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Features/IdentityFeature.cs

#LineLine coverage
 1using AspNetCore.Authentication.ApiKey;
 2using Elsa.Common.Features;
 3using Elsa.Common.Multitenancy;
 4using Elsa.Extensions;
 5using Elsa.Features.Abstractions;
 6using Elsa.Features.Attributes;
 7using Elsa.Features.Services;
 8using Elsa.Identity.Contracts;
 9using Elsa.Identity.Entities;
 10using Elsa.Identity.Multitenancy;
 11using Elsa.Identity.Options;
 12using Elsa.Identity.Providers;
 13using Elsa.Identity.Services;
 14using JetBrains.Annotations;
 15using Microsoft.Extensions.DependencyInjection;
 16
 17namespace Elsa.Identity.Features;
 18
 19/// <summary>
 20/// Provides identity feature to authenticate &amp; authorize API requests.
 21/// </summary>
 22[DependsOn(typeof(SystemClockFeature))]
 23[PublicAPI]
 24public class IdentityFeature : FeatureBase
 25{
 26    /// <inheritdoc />
 727    public IdentityFeature(IModule module) : base(module)
 28    {
 729    }
 30
 31    /// <summary>
 32    /// Gets or sets the <see cref="IdentityTokenOptions"/>.
 33    /// </summary>
 2834    public Action<IdentityTokenOptions> TokenOptions { get; set; } = _ => { };
 35
 36    /// <summary>
 37    /// Gets or sets the <see cref="ApiKeyOptions"/>.
 38    /// </summary>
 1439    public Action<ApiKeyOptions> ApiKeyOptions { get; set; } = options =>
 740    {
 141        options.Realm = "Elsa Workflows";
 142        options.KeyName = "ApiKey";
 843    };
 44
 45    /// <summary>
 46    /// A delegate that configures the <see cref="UsersOptions"/>.
 47    /// </summary>
 2848    public Action<UsersOptions> UsersOptions { get; set; } = _ => { };
 49
 50    /// <summary>
 51    /// A delegate that configures the <see cref="ApplicationsOptions"/>.
 52    /// </summary>
 2853    public Action<ApplicationsOptions> ApplicationsOptions { get; set; } = _ => { };
 54
 55    /// <summary>
 56    /// A delegate that configures the <see cref="RolesOptions"/>.
 57    /// </summary>
 2858    public Action<RolesOptions> RolesOptions { get; set; } = _ => { };
 59
 60    /// <summary>
 61    /// A delegate that creates an instance of an implementation of <see cref="IUserStore"/>.
 62    /// </summary>
 2163    public Func<IServiceProvider, IUserStore> UserStore { get; set; } = sp => sp.GetRequiredService<MemoryUserStore>();
 64
 65    /// <summary>
 66    /// A delegate that creates an instance of an implementation of <see cref="IApplicationStore"/>.
 67    /// </summary>
 2168    public Func<IServiceProvider, IApplicationStore> ApplicationStore { get; set; } = sp => sp.GetRequiredService<Memory
 69
 70    /// <summary>
 71    /// A delegate that creates an instance of an implementation of <see cref="IRoleStore"/>.
 72    /// </summary>
 2173    public Func<IServiceProvider, IRoleStore> RoleStore { get; set; } = sp => sp.GetRequiredService<MemoryRoleStore>();
 74
 75    /// <summary>
 76    /// A delegate that creates an instance of an implementation of <see cref="IUserProvider"/>.
 77    /// </summary>
 2178    public Func<IServiceProvider, IUserProvider> UserProvider { get; set; } = sp => sp.GetRequiredService<StoreBasedUser
 79
 80    /// <summary>
 81    /// A delegate that creates an instance of an implementation of <see cref="IApplicationProvider"/>.
 82    /// </summary>
 2183    public Func<IServiceProvider, IApplicationProvider> ApplicationProvider { get; set; } = sp => sp.GetRequiredService<
 84
 85    /// <summary>
 86    /// A delegate that creates an instance of an implementation of <see cref="IRoleProvider"/>.
 87    /// </summary>
 2188    public Func<IServiceProvider, IRoleProvider> RoleProvider { get; set; } = sp => sp.GetRequiredService<StoreBasedRole
 89
 90    /// <summary>
 91    /// Configures the feature to use <see cref="ConfigurationBasedUserProvider"/>.
 92    /// </summary>
 093    public void UseStoreBasedUserProvider() => UserProvider = sp => sp.GetRequiredService<StoreBasedUserProvider>();
 94
 95    /// <summary>
 96    /// Configures the feature to use <see cref="ConfigurationBasedUserProvider"/>.
 97    /// </summary>
 98    public void UseConfigurationBasedUserProvider(Action<UsersOptions> configure)
 99    {
 14100        UserProvider = sp => sp.GetRequiredService<ConfigurationBasedUserProvider>();
 7101        UsersOptions += configure;
 7102    }
 103
 104    /// <summary>
 105    /// Configures the feature to use <see cref="AdminUserProvider"/>.
 106    /// </summary>
 107    public void UseAdminUserProvider()
 108    {
 0109        UserProvider = sp => sp.GetRequiredService<AdminUserProvider>();
 0110        RoleProvider = sp => sp.GetRequiredService<AdminRoleProvider>();
 0111    }
 112
 113    /// <summary>
 114    /// Configures the feature to use <see cref="StoreBasedApplicationProvider"/>.
 115    /// </summary>
 0116    public void UseStoreBasedApplicationProvider() => ApplicationProvider = sp => sp.GetRequiredService<StoreBasedApplic
 117
 118    /// <summary>
 119    /// Configures the feature to use <see cref="ConfigurationBasedApplicationProvider"/>.
 120    /// </summary>
 121    public void UseConfigurationBasedApplicationProvider(Action<ApplicationsOptions> configure)
 122    {
 14123        ApplicationProvider = sp => sp.GetRequiredService<ConfigurationBasedApplicationProvider>();
 7124        ApplicationsOptions += configure;
 7125    }
 126
 127    /// <summary>
 128    /// Configures the feature to use <see cref="StoreBasedRoleProvider"/>.
 129    /// </summary>
 0130    public void UseStoreBasedRoleProvider() => RoleProvider = sp => sp.GetRequiredService<StoreBasedRoleProvider>();
 131
 132    /// <summary>
 133    /// Configures the feature to use <see cref="ConfigurationBasedRoleProvider"/>.
 134    /// </summary>
 135    public void UseConfigurationBasedRoleProvider(Action<RolesOptions> configure)
 136    {
 14137        RoleProvider = sp => sp.GetRequiredService<ConfigurationBasedRoleProvider>();
 7138        RolesOptions += configure;
 7139    }
 140
 141    /// <inheritdoc />
 142    public override void Configure()
 143    {
 7144        Module.AddFastEndpointsAssembly(GetType());
 7145    }
 146
 147    /// <inheritdoc />
 148    public override void Apply()
 149    {
 7150        Services.Configure(TokenOptions);
 7151        Services.Configure(ApiKeyDefaults.AuthenticationScheme, ApiKeyOptions);
 7152        Services.Configure(UsersOptions);
 7153        Services.Configure(ApplicationsOptions);
 7154        Services.Configure(RolesOptions);
 155
 156        // Memory stores.
 7157        Services
 7158            .AddMemoryStore<User, MemoryUserStore>()
 7159            .AddMemoryStore<Application, MemoryApplicationStore>()
 7160            .AddMemoryStore<Role, MemoryRoleStore>();
 161
 162        // User providers.
 7163        Services
 7164            .AddScoped<AdminUserProvider>()
 7165            .AddScoped<StoreBasedUserProvider>()
 7166            .AddScoped<ConfigurationBasedUserProvider>();
 167
 168        // Application providers.
 7169        Services
 7170            .AddScoped<StoreBasedApplicationProvider>()
 7171            .AddScoped<ConfigurationBasedApplicationProvider>();
 172
 173        // Role providers.
 7174        Services
 7175            .AddScoped<AdminRoleProvider>()
 7176            .AddScoped<StoreBasedRoleProvider>()
 7177            .AddScoped<ConfigurationBasedRoleProvider>();
 178
 179        // Tenant resolution strategies.
 7180        Services
 7181            .AddScoped<ITenantResolver, ClaimsTenantResolver>()
 7182            .AddScoped<ITenantResolver, CurrentUserTenantResolver>();
 183
 184        // Services.
 7185        Services
 7186            .AddScoped(UserStore)
 7187            .AddScoped(ApplicationStore)
 7188            .AddScoped(RoleStore)
 7189            .AddScoped(UserProvider)
 7190            .AddScoped(ApplicationProvider)
 7191            .AddScoped(RoleProvider)
 7192            .AddScoped<ISecretHasher, DefaultSecretHasher>()
 7193            .AddScoped<IAccessTokenIssuer, DefaultAccessTokenIssuer>()
 7194            .AddScoped<IUserCredentialsValidator, DefaultUserCredentialsValidator>()
 7195            .AddScoped<IApplicationCredentialsValidator, DefaultApplicationCredentialsValidator>()
 7196            .AddScoped<IApiKeyGenerator>(sp => sp.GetRequiredService<DefaultApiKeyGeneratorAndParser>())
 0197            .AddScoped<IApiKeyParser>(sp => sp.GetRequiredService<DefaultApiKeyGeneratorAndParser>())
 7198            .AddScoped<IClientIdGenerator, DefaultClientIdGenerator>()
 7199            .AddScoped<ISecretGenerator, DefaultSecretGenerator>()
 7200            .AddScoped<IRandomStringGenerator, DefaultRandomStringGenerator>()
 7201            .AddScoped<DefaultApiKeyGeneratorAndParser>()
 7202            .AddHttpContextAccessor()
 7203            ;
 7204    }
 205}