# v5 Demo Signers — activation guide The Strategy S3 and Strategy Azure demo pages render in **setup-instructions mode** by default. Follow these steps to make the live uploader boxes on those pages actually upload to your bucket / container. ## What's in this folder | File | Role | |---|---| | `DemoS3Signer.cs.template` | Reference `IS3Signer` implementation wrapping AWSSDK.S3 | | `DemoAzureSigner.cs.template` | Reference `IAzureSigner` implementation wrapping Azure.Storage.Blobs | These are kept **outside** `App_Code/` and **inactive** (`.cs.template` extension) because they depend on SDK DLLs that aren't in `bin/` by default. If they were auto- compiled without those DLLs present, the whole site would fail to build. `Global.asax.cs` probes for the compiled signer types via reflection and registers whichever are found. Until you activate one, the corresponding endpoints return **501**. ## Activating the S3 demo ### 1. Install AWSSDK.S3 From a Developer Command Prompt in the site root: ``` nuget install AWSSDK.S3 -Version 3.7.* -OutputDirectory packages ``` Then copy the `net472` DLLs into `bin/`: ``` copy packages\AWSSDK.Core.*\lib\net472\AWSSDK.Core.dll bin\ copy packages\AWSSDK.S3.*\lib\net472\AWSSDK.S3.dll bin\ ``` Or, from Visual Studio: right-click the website → Manage NuGet Packages → install `AWSSDK.S3`. That drops the DLLs into `bin/` automatically. ### 2. Move the signer into `App_Code/` ``` md App_Code move v5-signers\DemoS3Signer.cs.template App_Code\DemoS3Signer.cs ``` ### 3. Fill in credentials in `web.config` ```xml ``` For S3-compatible services (MinIO, Backblaze B2, Cloudflare R2, Wasabi): ```xml ``` ### 4. Configure bucket CORS The browser PUTs directly to S3. Your bucket must allow cross-origin PUT and expose `ETag`: ```json [{ "AllowedOrigins": ["https://ajaxuploader.com"], "AllowedMethods": ["PUT"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag"], "MaxAgeSeconds": 3000 }] ``` ### 5. Recycle the app pool ``` iisreset /noforce ``` Visit `/Demos/V5Features/StrategyS3.aspx`. The setup banner should be gone and the uploader should accept files. ## Activating the Azure demo Identical flow — substitute: - Package: `Azure.Storage.Blobs` (installs `Azure.Storage.Common`, `Azure.Core`, `System.Memory.Data`, `System.Text.Json` etc. as transitive dependencies — copy all `net462`+ DLLs from `packages\*\lib\netstandard2.0\` or the highest compatible TFM into `bin/`). - File to move: `DemoAzureSigner.cs.template` → `App_Code/DemoAzureSigner.cs`. - web.config keys: ```xml ``` - Container CORS (run once from Azure CLI): ``` az storage cors add --methods PUT --origins https://ajaxuploader.com \ --allowed-headers "*" --exposed-headers "*" --services b --max-age 3600 ``` ## How activation is detected `Global.asax.cs` at `Application_Start` does: 1. Reflection-search loaded assemblies for type `AjaxUploaderSite.DemoS3Signer` (/`DemoAzureSigner`). 2. If found **and** the matching `Options.IsConfigured` returns `true`, construct the signer and assign to `AjaxUploader.Providers.S3.Signer` (/`Azure.Signer`). 3. If the type isn't found (files still under `/v5-signers/`), or options are incomplete (blank `web.config` values), the assignment is skipped and the endpoints return **501**. No compile-time dependency on the AWS/Azure SDKs — the site stays healthy whether or not you've activated the demos. ## SSRF / security warning - Never ship the demo signers to production with S3 admin credentials or a full-access Azure connection string. Scope the IAM user / SAS to the upload bucket/container only. - The `/ajaxupload.axd/s3/create` endpoint gates on `UploadService.ValidateFile` before signing — but in a public-facing deployment, add auth + rate limits in front.