SafeWebCore 1.8.1

dotnet add package SafeWebCore --version 1.8.1
                    
NuGet\Install-Package SafeWebCore -Version 1.8.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SafeWebCore" Version="1.8.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SafeWebCore" Version="1.8.1" />
                    
Directory.Packages.props
<PackageReference Include="SafeWebCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add SafeWebCore --version 1.8.1
                    
#r "nuget: SafeWebCore, 1.8.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package SafeWebCore@1.8.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=SafeWebCore&version=1.8.1
                    
Install as a Cake Addin
#tool nuget:?package=SafeWebCore&version=1.8.1
                    
Install as a Cake Tool

๐Ÿ›ก๏ธ SafeWebCore

A lightweight, high-performance .NET 10 middleware library that adds security headers to your ASP.NET Core applications. Targets an A+ rating on securityheaders.com out of the box.

Current version: 1.8.1

New in 1.8.1 (maintenance patch โ€” no public API, default, preset or behavior change):

  • Internal deduplication โ€” the pen-test signal scoring, the authorization-check notification flow and the path-policy resolution were byte-identical copies in the two fraud detectors and in the middleware/diagnostics pair; they now live once in the internal PenTestSignalAnalyzer and PathPolicyResolver helpers, so a rule can only change in one place.
  • Allocation cleanup โ€” the path-policy lookup walks the list by index instead of allocating an enumerator per request, and the repeated CSP source literals in SecurePresets, CspOptions and CrossOriginPolicyBuilder now name one private constant per file. Every emitted header value and policy-resolution outcome is identical.
  • Dependency maintenance โ€” development-only packages (test SDK, xunit, coverlet, PublicApiAnalyzers) refreshed to their latest stable releases.
  • Docs โ€” a new SonarCloud triage page records how the analysis is scoped and the ten findings that are deliberately accepted.
  • SafeWebCore.FraudDetection moves to 1.1.1, SafeWebCore.JwtBearer to 1.0.1 (its Microsoft.AspNetCore.Authentication.JwtBearer floor is now 10.0.12), and the two preview packages to 1.0.0-preview.2.

Backward Compatibility Goal

SafeWebCore keeps a strict 100% backward compatibility contract. New capabilities are additive and opt-in, so existing configurations keep their current behavior.

Two Ways to Use SafeWebCore

Option 1 โ€” Strict A+ Preset (fastest)

One line for the strictest A+ configuration. Defined in ServiceCollectionExtensions.AddNetSecureHeadersStrictAPlus().

using SafeWebCore.Extensions;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddNetSecureHeadersStrictAPlus();

var app = builder.Build();
app.UseNetSecureHeaders();
app.Run();

Customize the preset โ€” CSP directives are space-separated, add multiple origins in one string:

builder.Services.AddNetSecureHeadersStrictAPlus(opts =>
{
    // Single origin
    opts.Csp = opts.Csp with { ImgSrc = "'self' https://cdn.example.com" };

    // Multiple origins โ€” just separate with spaces
    opts.Csp = opts.Csp with { ImgSrc = "'self' https://cdn1.example.com https://cdn2.example.com data:" };

    // Multiple directives at once
    opts.Csp = opts.Csp with
    {
        ConnectSrc = "'self' https://api.example.com wss://ws.example.com",
        FontSrc = "'self' https://fonts.gstatic.com https://cdn.example.com"
    };

    // Non-CSP headers
    opts.ReferrerPolicyValue = "strict-origin-when-cross-origin";
});

Option 2 โ€” Fully Custom Configuration

Full control over every header via ServiceCollectionExtensions.AddNetSecureHeaders():

using SafeWebCore.Builder;
using SafeWebCore.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddNetSecureHeaders(opts =>
{
    // Transport security
    opts.EnableHsts = true;
    opts.HstsValue = "max-age=31536000; includeSubDomains";

    // Framing
    opts.EnableXFrameOptions = true;
    opts.XFrameOptionsValue = "SAMEORIGIN";

    // MIME sniffing
    opts.EnableXContentTypeOptions = true;
    opts.XContentTypeOptionsValue = "nosniff";

    // Referrer
    opts.EnableReferrerPolicy = true;
    opts.ReferrerPolicyValue = "strict-origin-when-cross-origin";

    // Permissions
    opts.EnablePermissionsPolicy = true;
    opts.PermissionsPolicyValue = "camera=(), microphone=(), geolocation=()";

    // Cross-Origin isolation
    opts.EnableCoep = true;
    opts.CoepValue = "require-corp";
    opts.EnableCoop = true;
    opts.CoopValue = "same-origin";
    opts.EnableCorp = true;
    opts.CorpValue = "same-origin";

    // Server header
    opts.RemoveServerHeader = true;

    // CSP โ€” use the fluent builder
    opts.Csp = new CspBuilder()
        .DefaultSrc("'none'")
        .ScriptSrc("'nonce-{nonce}' 'strict-dynamic' https:")
        .StyleSrc("'nonce-{nonce}'")
        .ImgSrc("'self' https: data:")
        .FontSrc("'self' https://fonts.gstatic.com")
        .ConnectSrc("'self' wss://realtime.example.com")
        .FrameAncestors("'none'")
        .BaseUri("'none'")
        .FormAction("'self'")
        .UpgradeInsecureRequests()
        .Build();
});

var app = builder.Build();
app.UseNetSecureHeaders();
app.Run();

Both methods are defined in SafeWebCore.Extensions.ServiceCollectionExtensions.

Strict A+ Headers

Header Strict A+ Value
Strict-Transport-Security max-age=63072000; includeSubDomains; preload
Content-Security-Policy Nonce-based, strict-dynamic, Trusted Types
X-Frame-Options DENY
X-Content-Type-Options nosniff
Referrer-Policy no-referrer
Permissions-Policy All recognized features denied (scanner-safe, modern Chromium tokens only)
Cross-Origin-Embedder-Policy require-corp
Cross-Origin-Opener-Policy same-origin
Cross-Origin-Resource-Policy same-origin
Server (removed)
X-Powered-By (removed)

Features

  • ๐Ÿ”’ Strict A+ preset โ€” one-line setup with the strictest security headers
  • ๐ŸŒ Browser-safe Permissions-Policy โ€” preset emits only scanner-recognised tokens; invalid directives (e.g. identity-credentials-get, otp-credentials, publickey-credentials-create, window-management) and stale tokens removed to pass securityheaders.com checks without warnings
  • ๐Ÿ› ๏ธ Fully custom โ€” configure every header and CSP directive individually
  • ๐Ÿงฉ Nonce-based CSP โ€” per-request cryptographic nonces for scripts and styles
  • ๐Ÿงท Razor nonce TagHelpers โ€” auto-add nonce to <script> and <style> in Razor views
  • ๐Ÿ›ฃ๏ธ Path-based policies โ€” assign different security profiles per route prefix (longest-prefix wins)
  • ๐Ÿงช Startup validation โ€” fail fast on invalid combinations and duplicate path policies
  • ๐Ÿ“ CSP Report-Only mode โ€” safely test policy changes before hard enforcement
  • ๐Ÿงฑ Typed policy builders โ€” strongly typed builders for Referrer-Policy, Permissions-Policy, and COEP/COOP/CORP
  • ๐Ÿงญ First-class upcoming header support โ€” configure non-standard or emerging headers through AdditionalHeaders (opt-in)
  • ๐Ÿ“ก First-class Reporting API endpoint support โ€” emit Reporting-Endpoints from typed ReportingEndpoints options (opt-in)
  • ๐Ÿ“‹ Full CSP Level 3 (W3C Recommendation) โ€” all 22 directives, nonce/hash support, strict-dynamic, report-to, worker-src, frame-src, manifest-src, script-src-elem/attr, style-src-elem/attr
  • ๐Ÿ”ฎ CSP Level 4 ready โ€” Trusted Types (require-trusted-types-for, trusted-types), fenced-frame-src (Privacy Sandbox)
  • ๐ŸŽฏ Fluent CSP Builder โ€” type-safe, chainable API with full XML documentation
  • โšก Zero-allocation nonce generation โ€” stackalloc + RandomNumberGenerator, plus TryWriteNonce(Span<char>) for fully heap-free scenarios (v1.1.0)
  • ๐Ÿ” HttpContext.GetCspNonce() โ€” discoverable extension method to retrieve the per-request nonce (v1.1.0)
  • ๐Ÿš€ Pre-built CSP template โ€” CSP header string computed once at startup, not per-request (v1.1.0)
  • ๐Ÿ”Œ Extensible โ€” custom IHeaderPolicy implementations
  • ๐Ÿ“Š CSP violation reporting โ€” built-in /csp-report endpoint using Reporting API v1

First-class Upcoming Headers (Opt-in)

Use AdditionalHeaders when you want to emit upcoming or non-standard headers without writing a custom policy type:

builder.Services.AddNetSecureHeaders(opts =>
{
    opts.AdditionalHeaders.Add(new()
    {
        Name = "Document-Policy",
        Value = "force-load-at-top"
    });
});

First-class Reporting Endpoints (Opt-in)

Use ReportingEndpoints to emit the Reporting-Endpoints response header and map endpoint groups used by CSP report-to:

builder.Services.AddNetSecureHeaders(opts =>
{
    opts.Csp = opts.Csp with { ReportTo = "default" };

    opts.ReportingEndpoints.Add(new()
    {
        Group = "default",
        Url = "https://reports.example.com/csp"
    });
});

Emitted header value:

Reporting-Endpoints: default="https://reports.example.com/csp"

Validate Your Headers

After deploying, test your security headers with:

  • securityheaders.com โ€” Grades all response headers A+ through F. With the Strict A+ preset you should score A+ immediately.
  • Google CSP Evaluator โ€” Paste your Content-Security-Policy value to check for misconfigurations (missing object-src, 'unsafe-inline' without nonce, missing 'strict-dynamic', etc.).

Documentation

Full documentation: github.com/MPCoreDeveloper/SafeWebCore/docs

Planning documents:

License

MIT โ€” see LICENSE

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on SafeWebCore:

Package Downloads
SafeWebCore.Testing

Testing helpers for SafeWebCore. Includes header assertions, CSP/nonce assertions, and bootstrap helpers for integration tests.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.8.1 101 9/29/2026
1.8.0 91 9/28/2026
1.7.0 2,258 8/4/2026
1.6.0 247 7/25/2026
1.3.5 240 6/27/2026
1.3.0 325 5/2/2026
1.2.0 642 4/2/2026
1.1.0 140 3/29/2026
1.0.0 222 3/28/2026

## v1.8.1 โ€” Internal cleanup, no behavior change

Maintenance patch on the 1.8.0 line. **100% backwards compatible** โ€” the public API surface, defaults, presets and configuration paths are untouched.

**Changes:**
- Internal deduplication: the pen-test signal scoring, the authorization-check notification flow and the path-policy resolution existed as byte-identical copies in `GeoCulturalConsistencyDetector` / `WesternImpersonationDetector` and in `NetSecureHeadersMiddleware` / `NetSecureHeadersDiagnosticsService`. They now live once, in the internal `PenTestSignalAnalyzer` and `PathPolicyResolver` helpers that both call sites use, so a score, a throttle rule or a policy-resolution rule can only change in one place
- Internal code-quality cleanup with no behavior change: the repeated CSP source literals in `SecurePresets`, `CspOptions` and `CrossOriginPolicyBuilder` now name one private constant per file, and the path-policy lookup walks the list by index instead of allocating an enumerator per request. Every emitted header value, directive and policy-resolution outcome is identical
- Docs: a new SonarCloud triage page records how the analysis is scoped and the ten findings that are deliberately accepted
- Development-only dependencies refreshed to their latest stable releases

See CHANGELOG.md and docs/ for full details.