Skip to content

Commit 7940870

Browse files
committed
session state
1 parent f0a2afa commit 7940870

File tree

6 files changed

+66
-17
lines changed

6 files changed

+66
-17
lines changed

CustomFeatureFilter/CustomFeatureFilter/ClaimsFeatureFilter.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,21 @@ namespace CustomFeatureFilter
99
[FilterAlias("Claims")]
1010
public class ClaimsFeatureFilter : IFeatureFilter
1111
{
12-
private readonly IHttpContextAccessor _httpContextAccesor;
12+
private readonly IHttpContextAccessor _httpContextAccessor;
1313

14-
public ClaimsFeatureFilter(IHttpContextAccessor httpContextAccesor)
14+
public ClaimsFeatureFilter(IHttpContextAccessor httpContextAccessor)
1515
{
16-
_httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor));
16+
_httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
1717
}
1818

1919
public bool Evaluate(FeatureFilterEvaluationContext context)
2020
{
2121
var settings = context.Parameters.Get<ClaimsFilterSettings>();
2222

23-
var user = _httpContextAccesor.HttpContext.User;
23+
var user = _httpContextAccessor.HttpContext.User;
2424

2525
return settings.RequiredClaims
2626
.All(claimType => user.HasClaim(claim => claim.Type == claimType));
2727
}
2828
}
29-
30-
}
29+
}

CustomFeatureFilter/CustomFeatureFilter/FeatureFlags.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ public static class FeatureFlags
44
{
55
public const string Beta = "Beta";
66
public const string NewWelcomeBanner = "NewWelcomeBanner";
7+
public const string NewExperience = "NewExperience";
78
}
89
}
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
@page
22
@model IndexModel
3+
@inject Microsoft.FeatureManagement.IFeatureManagerSnapshot FeatureManager
34
@{
45
ViewData["Title"] = "Home page";
56
}
67

7-
<feature name="@FeatureFlags.Beta">
8-
<div class="alert alert-primary" role="alert">
9-
Congratulations - You're in the Beta test!
10-
</div>
11-
</feature>
12-
13-
<div class="text-center">
14-
<h1 class="display-4">@Model.WelcomeMessage</h1>
15-
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
16-
</div>
8+
<ul>
9+
@for (var i = 0; i < 10; i++)
10+
{
11+
<li>Flag is: @FeatureManager.IsEnabled(FeatureFlags.NewExperience)</li>
12+
}
13+
</ul>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.FeatureManagement;
3+
4+
namespace CustomFeatureFilter
5+
{
6+
public class SessionSessionManager : ISessionManager
7+
{
8+
private readonly IHttpContextAccessor _contextAccessor;
9+
public SessionSessionManager(IHttpContextAccessor contextAccessor)
10+
{
11+
_contextAccessor = contextAccessor;
12+
}
13+
14+
public void Set(string featureName, bool enabled)
15+
{
16+
var session = _contextAccessor.HttpContext.Session;
17+
var sessionKey = $"feature_{featureName}";
18+
session.Set(sessionKey, new[] {enabled ? (byte) 1 : (byte) 0});
19+
}
20+
21+
public bool TryGet(string featureName, out bool enabled)
22+
{
23+
var session = _contextAccessor.HttpContext.Session;
24+
if (session.TryGetValue($"feature_{featureName}", out var enabledBytes))
25+
{
26+
enabled = enabledBytes[0] == 1;
27+
return true;
28+
}
29+
30+
enabled = false;
31+
return false;
32+
}
33+
}
34+
}

CustomFeatureFilter/CustomFeatureFilter/Startup.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
using CustomFeatureFilter.Data;
1414
using Microsoft.Extensions.Configuration;
1515
using Microsoft.Extensions.DependencyInjection;
16+
using Microsoft.Extensions.DependencyInjection.Extensions;
1617
using Microsoft.FeatureManagement;
18+
using Microsoft.FeatureManagement.FeatureFilters;
1719

1820
namespace CustomFeatureFilter
1921
{
@@ -46,8 +48,13 @@ public void ConfigureServices(IServiceCollection services)
4648

4749
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
4850

51+
services.AddSession();
52+
services.AddHttpContextAccessor();
53+
services.AddTransient<ISessionManager, SessionSessionManager>();
54+
4955
services.AddFeatureManagement()
5056
.AddFeatureFilter<ClaimsFeatureFilter>()
57+
.AddFeatureFilter<PercentageFilter>()
5158
.UseDisabledFeaturesHandler(new RedirectDisabledFeatureHandler());
5259
}
5360

@@ -71,6 +78,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env)
7178
app.UseCookiePolicy();
7279

7380
app.UseAuthentication();
81+
app.UseSession();
7482

7583
app.UseMvc();
7684
}

CustomFeatureFilter/CustomFeatureFilter/appsettings.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,17 @@
99
},
1010
"AllowedHosts": "*",
1111
"FeatureManagement": {
12-
"NewWelcomeBanner": true,
12+
"NewWelcomeBanner": false,
13+
"NewExperience": {
14+
"EnabledFor": [
15+
{
16+
"Name": "Microsoft.Percentage",
17+
"Parameters": {
18+
"Value": 50
19+
}
20+
}
21+
]
22+
},
1323
"Beta": {
1424
"EnabledFor": [
1525
{

0 commit comments

Comments
 (0)