Contextual Feature Filters in ASP.NET Core
Tags: aspnetcore, contextualfeaturefil, featuremanagement
Published: 2022-11-07 12:58:20

---
title: Contextual Feature Filters in ASP.NET Core
published: true
date: 2022-11-07 01:40:10 UTC
tags: ASPNETCore,aspnetcore,contextualfeaturefil,featuremanagement
canonical_url: https://coderethinked.com/contextual-feature-filters-in-asp-net-core/
---

While custom feature filters solve the problem of isolating the feature to a specific group or individual it may not be appropriate to rely on the HttpContext for every application we build.

For example, a console app will not have ambient HttpContext to check if the user has a specific email address that matches the email declared in the feature flag section.

For this purpose, we have **Contextual Feature Filters** in `Microsoft.FeatureManagement` package which take a context and evaluate the feature flag against a given context.

The contextual feature filters are declared and implemented similarly to custom feature filters.

Let’s see this in action.

## IContextualFeatureFilter interface

```csharp
public interface IContextualFeatureFilter<TContext> : Microsoft.FeatureManagement.IFeatureFilterMetadata
```

Contextual feature filters will only be executed if a context that is assignable from `TContext` is available.

## Declaring contextual feature filter

Let’s create a contextual feature filter by implementing `IContextualFeatureFilter` interface.

```csharp
public class AccountIdFilter : IContextualFeatureFilter<IAccountIdContext>
{
    public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext featureFilterContext, IAccountIdContext appContext)
    {
        var settings = featureFilterContext.Parameters.Get<AccountIdSettings>();

        return Task.FromResult(settings.AccountId == appContext.AccountId);
    }
}
    
public interface IAccountIdContext
{
    string AccountId { get; set; }
}

public class AccountIdContext: IAccountIdContext
{
    public string AccountId { get; set; }

    public AccountIdContext(string accountId)
    {
        AccountId = accountId;
    }
}

public class AccountIdSettings
{
    public string AccountId { get; set; }
}

```

Instead of injecting the `HttpContextAccessor` to get the httpContext and get the account id or email to validate the feature flag, we get the `AccountIdContext` passed to the `EvaluateAsync` method.

We compare the app settings account id with the account id in the context. If they both match the feature flag is enabled, otherwise false.

## Invoking IsEnabledAsync with context

Along with the feature flag name we also pass in the context to compare with.

```csharp
if (await featureManager.IsEnabledAsync("SecretFeature", new AccountIdContext("123")))
{
    // do your something
}
```

## appsettings.json configuration

The appsettings.json file should be similar to how we configure custom feature filters.

```json
"FeatureManagement": {
    "SecretFeature": {
      "EnabledFor": [
        {
          "Name": "AccountId",
          "Parameters": {
            "AccountId": "d128f098-5a5b-4218-bb61-74305ecbdd32"
          }
        }
      ]
    }
  }

```

## References

[Contextual Feature Filters in Feature Management](https://github.com/microsoft/FeatureManagement-Dotnet#contextual-feature-filters)

The post [Contextual Feature Filters in ASP.NET Core](https://coderethinked.com/contextual-feature-filters-in-asp-net-core/) appeared first on [Code Rethinked](https://coderethinked.com).