using System; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.DependencyInjection; using Microsoft.Net.Http.Headers; namespace CookiePolicySample { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(); services.Configure(options => { options.CheckConsentNeeded = context => context.Request.PathBase.Equals("/NeedsConsent"); options.OnAppendCookie = context => { }; }); } public void Configure(IApplicationBuilder app) { app.UseCookiePolicy(); app.UseAuthentication(); app.Map("/NeedsConsent", NestedApp); app.Map("/NeedsNoConsent", NestedApp); NestedApp(app); } private void NestedApp(IApplicationBuilder app) { app.Run(async context => { var path = context.Request.Path; switch (path) { case "/Login": var user = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, "bob") }, CookieAuthenticationDefaults.AuthenticationScheme)); await context.SignInAsync(user); break; case "/Logout": await context.SignOutAsync(); break; case "/CreateTempCookie": context.Response.Cookies.Append("Temp", "1"); break; case "/RemoveTempCookie": context.Response.Cookies.Delete("Temp"); break; case "/CreateEssentialCookie": context.Response.Cookies.Append("EssentialCookie", "2", new CookieOptions() { IsEssential = true }); break; case "/RemoveEssentialCookie": context.Response.Cookies.Delete("EssentialCookie"); break; case "/GrantConsent": context.Features.Get().GrantConsent(); break; case "/WithdrawConsent": context.Features.Get().WithdrawConsent(); break; } // TODO: Debug log when cookie is suppressed await HomePage(context); }); } private async Task HomePage(HttpContext context) { var response = context.Response; var cookies = context.Request.Cookies; response.ContentType = "text/html"; await response.WriteAsync("\r\n"); await response.WriteAsync($"Home
\r\n"); await response.WriteAsync($"Login
\r\n"); await response.WriteAsync($"Logout
\r\n"); await response.WriteAsync($"Create Temp Cookie
\r\n"); await response.WriteAsync($"Remove Temp Cookie
\r\n"); await response.WriteAsync($"Create Essential Cookie
\r\n"); await response.WriteAsync($"Remove Essential Cookie
\r\n"); await response.WriteAsync($"Grant Consent
\r\n"); await response.WriteAsync($"Withdraw Consent
\r\n"); await response.WriteAsync("
\r\n"); await response.WriteAsync($"Needs Consent
\r\n"); await response.WriteAsync($"Needs No Consent
\r\n"); await response.WriteAsync("
\r\n"); var feature = context.Features.Get(); await response.WriteAsync($"Consent:
\r\n"); await response.WriteAsync($" - IsNeeded: {feature.IsConsentNeeded}
\r\n"); await response.WriteAsync($" - Has: {feature.HasConsent}
\r\n"); await response.WriteAsync($" - Can Track: {feature.CanTrack}
\r\n"); await response.WriteAsync("
\r\n"); await response.WriteAsync($"{cookies.Count} Request Cookies:
\r\n"); foreach (var cookie in cookies) { await response.WriteAsync($" - {cookie.Key} = {cookie.Value}
\r\n"); } await response.WriteAsync("
\r\n"); var responseCookies = response.Headers[HeaderNames.SetCookie]; await response.WriteAsync($"{responseCookies.Count} Response Cookies:
\r\n"); foreach (var cookie in responseCookies) { await response.WriteAsync($" - {cookie}
\r\n"); } await response.WriteAsync(""); } } }