A dark, crypto-native marketplace for offensive-security courses, tools and ebooks. Built with ASP.NET Core MVC (.NET 10), SQL Server, and a hand-crafted dark design system. Payments are handled with crypto (USDT, USDC, BTC, ETH, TRX) via OxaPay.
What I built I fully restructured and implemented ExploitLearn as a single-project Vertical Slice app (ExploitLearn.Web), deleting the old Domain/Application/Infrastructure projects. All four of your locked decisions are in: VSA, OxaPay crypto, MVP-core end-to-end, hand-crafted dark CSS.
Storefront & catalog — gradient hero with an animated terminal, featured drops, category tiles, full catalog with search + category/type filters + sort + pagination, rich product detail pages with reviews, related products, and a sticky crypto buy-box.
Accounts — register/login/logout, roles (Admin/Instructor/Student), a themed "My Library", and protected downloads (product files stored outside wwwroot, served only to verified buyers; external-link products redirect only for owners).
Cart & checkout — session cart (works for anonymous browsing) → order + OxaPay invoice → /api/webhooks/oxapay marks it paid → instant access. Entitlements are derived from paid orders (no license table). With no merchant key it runs in sandbox mode with a local "simulate payment" page so the whole buy-flow is testable offline; drop in a real key and buyers hit OxaPay's hosted checkout.
Admin panel — dashboard (revenue/orders/users stats), product CRUD with thumbnail + protected-file upload, categories, orders + order detail, and user role/ban management.
Infra — .NET 10, EF Core + Identity on SQL Server, InitialCreate migration generated, auto seed (roles, demo admin, 6 categories, 8 products), Serilog → logs/, custom error pages, mobile-responsive design system in wwwroot/css/exploit.css.
Verified ✅ Build is green. ✅ App boots and serves pages — I ran it and DB-free routes (/home/about, /home/terms, /account/login) return HTTP 200 with the full themed HTML rendering correctly (brand gradient, glass cards, nav/footer). ✅ Startup now survives a DB outage gracefully (logs an error, keeps listening). The one thing I couldn't do — and it's not the code Your local SQL Server rejects every login (EF, sqlcmd, all of them) with Error 17892: Logon failed due to trigger execution — a server-side logon trigger on this locked-down AGRI-BANK machine. So I couldn't create/seed the DB or exercise data-backed pages here, and I did not try to bypass that security control. The home page 500s only because of this.
To run it fully, point ConnectionStrings:DefaultConnection (in ExploitLearn.Web/appsettings.json) at a SQL Server you can log into — a Docker mssql container or SQL Express with SQL auth is easiest — then cd ExploitLearn.Web && dotnet run. It'll migrate + seed on startup. Admin login: admin@exploitlearn.local / Admin!23456. Full details are in the new README.md.
Want me to add a docker-compose.yml with a SQL Server container (SQL auth, no trigger) so you can run the whole thing locally without touching the corporate instance?
Everything lives in ExploitLearn.Web, organized by feature rather than by technical layer:
ExploitLearn.Web/
├─ Domain/ Entities + enums (ApplicationUser, Product, Category, Order, OrderItem, Payment, Review)
├─ Data/ AppDbContext (EF Core + Identity), DbSeeder
├─ Services/ CartService, OrderService, PurchaseService, FileStorage
├─ Payments/ OxaPay gateway + options (real API + sandbox mock)
├─ Common/ SlugHelper, FeatureViewLocationExpander
├─ Features/ One folder per slice — controller + view models + Views/
│ ├─ Home/ Catalog/ Account/ Cart/ Checkout/ Admin/ Webhooks/ Error/ Shared/
├─ wwwroot/css/exploit.css The dark design system (no build step, no node)
└─ Program.cs Composition root
Razor views live beside their controller inside Features/<Name>/Views/ thanks to a custom
FeatureViewLocationExpander. Shared layout/partials are in Features/Shared/.
- Storefront — hero landing, featured products, category browse.
- Catalog — search, filter by category/type, sort, pagination, product detail pages, reviews.
- Auth — register / login / logout with roles (Admin, Instructor, Student).
- Cart — session-based, works for anonymous visitors.
- Checkout — creates an order + OxaPay crypto invoice, webhook marks it paid, buyer gets instant access.
- Library & protected downloads — buyers download files (served from outside wwwroot) or get private links.
- Admin panel — dashboard, product CRUD + file upload, categories, orders, users & roles.
- File logging via Serilog →
ExploitLearn.Web/logs/exploitlearn-YYYYMMDD.log.
- .NET 10 SDK
- A reachable SQL Server (LocalDB, Express, container, or a real server)
Connection string lives in ExploitLearn.Web/appsettings.json (ConnectionStrings:DefaultConnection).
It targets a dedicated LocalDB instance:
Server=(localdb)\ExploitLearn;Database=ExploitLearnDb;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=True
First-time setup on this machine: the default
MSSQLLocalDBinstance is locked down by a corporate logon trigger, so we use a fresh named instance instead. Create it once with:sqllocaldb create ExploitLearn -sThen run the app (below) — it auto-creates + seeds the database on startup.
cd ExploitLearn.Web
dotnet runOn startup the app applies migrations and seeds roles, a demo admin, categories and sample products automatically. Then browse to the printed URL (e.g. http://localhost:5117).
If the database is unreachable the app still starts (so you can see it) and logs a clear error; data-backed pages will 500 until the DB is available.
email: admin@exploitlearn.local
password: Admin!23456
By default OxaPay:MerchantKey is empty → the app runs in sandbox mode: checkout mints a fake
invoice and shows a local "simulate payment" page so you can test the entire buy flow without real crypto.
To go live, set a real key (use user-secrets or env vars, don't commit it):
cd ExploitLearn.Web
dotnet user-secrets set "OxaPay:MerchantKey" "<your-merchant-key>"With a real key, buyers are redirected to OxaPay's hosted checkout and the
POST /api/webhooks/oxapay endpoint reconciles payments.
cd ExploitLearn.Web
dotnet ef migrations add <Name>
dotnet ef database update(An InitialCreate migration is already included.)
For authorized testing, CTFs, research and education only.