Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
40278e6
feat(users): add configurable identifier limits and Identity Lab capa…
mckaragoz Oct 31, 2026
45dcfcd
feat(users): enforce profile field and metadata safety limits (#130)
mckaragoz Oct 31, 2026
7c66a0c
feat(sessions): expose session count in chain summaries (#131)
mckaragoz Oct 31, 2026
b886b94
test(identity-lab): add critical service workflow regression coverage…
mckaragoz Oct 31, 2026
1f04430
test(identity-lab): add comprehensive bUnit page render coverage (#133)
mckaragoz Nov 1, 2026
f8e5f0e
feat: add built-in rate limiting and client HTTP 429 handling (#134)
mckaragoz Nov 1, 2026
12e7e0a
feat(client): support optional navigation after logout (#135)
mckaragoz Nov 1, 2026
31edc11
feat: Add Password Policy and Password History (#136)
mckaragoz Nov 2, 2026
dce343d
docs: Fix Broken Links (#137)
mckaragoz Nov 2, 2026
a67bbae
Identity Lab Launch (#138)
mckaragoz Nov 4, 2026
459253e
Change Identity Lab push branch from 'master' to 'lab'
mckaragoz Nov 4, 2026
9091c3e
fix(blazor): Prevent file URI origin resolution on Linux (#139)
mckaragoz Nov 4, 2026
1e8e8ee
Enhance CI/CD workflow with concurrency and deployment
mckaragoz Nov 4, 2026
4d8fb23
Refactor deployment step for Identity Lab
mckaragoz Nov 4, 2026
aee0883
Enhance Docker Compose with logging and volume options
mckaragoz Nov 4, 2026
1e37ab6
Enhance workflow with docker-compose upload step
mckaragoz Nov 4, 2026
829a799
feat(docs): showcase Identity Lab and enhance landing page experience…
mckaragoz Nov 4, 2026
0af981a
Add GitHub Actions workflow for JavaScript tests
mckaragoz Nov 5, 2026
abad249
Enhance JavaScript tests workflow with change detection
mckaragoz Nov 5, 2026
491f9b1
Merge commit from fork
mckaragoz Nov 6, 2026
7fdba58
test: Add CSRF regression coverage and update endpoint classification…
mckaragoz Nov 6, 2026
9493830
Fix UAuthUrlBuilder when Tenant Specified (#145)
mckaragoz Nov 6, 2026
95d75d4
Modernize Dependencies, Test Infrastructure and CI Workflows (#146)
mckaragoz Nov 6, 2026
dfc17fc
Enforce Device Binding in Session Validation (#147)
mckaragoz Nov 7, 2026
2fedced
Fix External Hub Antiforgery Cookies and Strengthen CSRF Regression T…
mckaragoz Nov 7, 2026
b88448d
Improve Identity Lab Login UX and Sidebar Footer (#149)
mckaragoz Nov 7, 2026
40d32a9
Update 0.2.0-preview.2
mckaragoz Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .docker/.env.identitylab.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
IDENTITYLAB_IMAGE=ghcr.io/codebeamorg/ultimateauth-identitylab:REPLACE_WITH_SHA

CADDY_PROXY_IP=172.20.0.4
IDENTITYLAB_CONNECTION_STRING=Host=postgres;Port=5432;Database=identitylab;Username=identitylab_user;Password=REPLACE_WITH_PASSWORD

LAB_ADMIN_USERNAME=Ladmin
LAB_ADMIN_EMAIL=REPLACE_WITH_EMAIL
LAB_ADMIN_PASSWORD=REPLACE_WITH_PASSWORD
4 changes: 2 additions & 2 deletions .docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ ENV CI=true
COPY docs/website/CodeBeam.UltimateAuth.Docs.Wasm/CodeBeam.UltimateAuth.Docs.Wasm/*.csproj CodeBeam.Website/
COPY docs/website/CodeBeam.UltimateAuth.Docs.Wasm/CodeBeam.UltimateAuth.Docs.Wasm.Client/*.csproj CodeBeam.Website.Client/

RUN dotnet restore CodeBeam.Website/CodeBeam.UltimateAuth.Docs.Wasm.csproj
RUN dotnet restore CodeBeam.Website/CodeBeam.UltimateAuth.Docs.Wasm.csproj -p:UltimateAuthBuildTargetFrameworks=net10.0

COPY . .

RUN dotnet publish docs/website/CodeBeam.UltimateAuth.Docs.Wasm/CodeBeam.UltimateAuth.Docs.Wasm/CodeBeam.UltimateAuth.Docs.Wasm.csproj \
-c Release -o /app/publish
-c Release -p:UltimateAuthBuildTargetFrameworks=net10.0 -o /app/publish

# RUNTIME
FROM mcr.microsoft.com/dotnet/aspnet:10.0
Expand Down
31 changes: 31 additions & 0 deletions .docker/Dockerfile.identitylab
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Build
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src

COPY . .

RUN dotnet restore \
apps/identity-lab/CodeBeam.UltimateAuth.IdentityLab/CodeBeam.UltimateAuth.IdentityLab.csproj \
-p:UltimateAuthBuildTargetFrameworks=net10.0

RUN dotnet publish \
apps/identity-lab/CodeBeam.UltimateAuth.IdentityLab/CodeBeam.UltimateAuth.IdentityLab.csproj \
-c Release \
-p:UltimateAuthBuildTargetFrameworks=net10.0 \
--no-restore \
-o /app/publish

# Runtime
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
WORKDIR /app

ENV ASPNETCORE_HTTP_PORTS=8080
ENV ASPNETCORE_ENVIRONMENT=Production

COPY --from=build /app/publish .

EXPOSE 8080

USER $APP_UID

ENTRYPOINT ["dotnet", "CodeBeam.UltimateAuth.IdentityLab.dll"]
41 changes: 41 additions & 0 deletions .docker/docker-compose.identitylab.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
services:
identitylab:
image: ${IDENTITYLAB_IMAGE:?Identity Lab image is required}
container_name: identitylab
restart: unless-stopped

environment:
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_HTTP_PORTS: "8080"

ReverseProxy__KnownProxy: ${CADDY_PROXY_IP:?Caddy proxy IP is required}
ConnectionStrings__IdentityLab: ${IDENTITYLAB_CONNECTION_STRING:?Connection string is required}

LabAdmin__Username: ${LAB_ADMIN_USERNAME:?Admin username is required}
LabAdmin__Email: ${LAB_ADMIN_EMAIL:?Admin email is required}
LabAdmin__Password: ${LAB_ADMIN_PASSWORD:?Admin password is required}

DataProtection__KeysPath: /app/keys

volumes:
- /opt/identitylab/keys:/app/keys:Z

networks:
- edge
- postgres-internal

security_opt:
- no-new-privileges:true

logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"

networks:
edge:
external: true

postgres-internal:
external: true
55 changes: 48 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,49 +1,90 @@
name: Deploy UltimateAuth
name: Docs Site

on:
pull_request:
push:
branches:
- master
workflow_dispatch:

concurrency:
group: ultimateauth-deploy
# PR updates may cancel their own validation, never a production deployment.
group: ${{ github.event_name == 'pull_request' && format('docs-site-pr-{0}', github.event.pull_request.number) || 'ultimateauth-deploy' }}
cancel-in-progress: true

permissions:
contents: read
packages: write

jobs:
build-and-deploy:
changes:
name: Changes
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
site: ${{ steps.filter.outputs.site }}
steps:
- name: Detect changed files
id: filter
uses: dorny/paths-filter@v3
with:
filters: |
site:
- 'docs/**'
- 'src/utilities/CodeBeam.UltimateAuth.DocsBuilder/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'global.json'
- 'NuGet.Config'
- 'nuget.config'
- '.dockerignore'
- '.docker/Dockerfile'
- '.docker/docker-compose.yml'
- '.github/workflows/deploy.yml'

build:
name: Docker Build
needs: changes
# Master and manual builds do not depend on a PR-only detector succeeding.
if: >-
!cancelled() &&
(github.event_name != 'pull_request' ||
(needs.changes.result == 'success' && needs.changes.outputs.site == 'true'))
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build and push image
uses: docker/build-push-action@v6
with:
context: .
file: .docker/Dockerfile
push: true
push: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/master' }}
tags: |
ghcr.io/codebeamorg/ultimateauth:master
ghcr.io/codebeamorg/ultimateauth:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max

deploy:
name: Deploy
needs: build
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@v1.0.3
with:
Expand Down
123 changes: 123 additions & 0 deletions .github/workflows/identitylab-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
name: Identity Lab

on:
pull_request:
push:
branches:
- lab
workflow_dispatch:

permissions:
contents: read
packages: write

concurrency:
# PR validation cannot block or replace a production deployment run.
group: ${{ github.event_name == 'pull_request' && format('identitylab-pr-{0}', github.event.pull_request.number) || 'identitylab-deploy' }}
cancel-in-progress: false

jobs:
changes:
name: Changes
if: github.event_name != 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
image: ${{ steps.filter.outputs.image }}
steps:
- name: Checkout for push comparison
if: github.event_name != 'pull_request'
uses: actions/checkout@v4
- name: Detect changed files
id: filter
uses: dorny/paths-filter@v3
with:
base: ${{ github.ref }}
filters: |
image:
- 'apps/identity-lab/**'
- 'src/**'
- 'samples/**'
- 'Directory.Build.props'
- 'Directory.Build.targets'
- 'Directory.Packages.props'
- 'global.json'
- 'NuGet.Config'
- 'nuget.config'
- '.dockerignore'
- '.docker/Dockerfile.identitylab'
- '.docker/docker-compose.identitylab.yml'
- '.github/workflows/identitylab-image.yml'

build:
name: Docker Build
needs: changes
# Manual image builds must also run when the PR/push detector is skipped.
if: >-
!cancelled() &&
(github.event_name == 'workflow_dispatch' ||
(needs.changes.result == 'success' && needs.changes.outputs.image == 'true'))
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GHCR
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Identity Lab
uses: docker/build-push-action@v6
with:
context: .
file: .docker/Dockerfile.identitylab
push: ${{ github.event_name != 'pull_request' }}
tags: ghcr.io/codebeamorg/ultimateauth-identitylab:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max

deploy:
name: Deploy
needs: build
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/lab'
runs-on: ubuntu-latest
environment: identitylab

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Upload Identity Lab Compose
uses: appleboy/scp-action@v1
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: ".docker/docker-compose.identitylab.yml"
target: "/home/deploy/.identitylab-deploy/${{ github.sha }}"
strip_components: 1

- name: Deploy Identity Lab
uses: appleboy/ssh-action@v1.0.3
env:
IMAGE_TAG: ghcr.io/codebeamorg/ultimateauth-identitylab:${{ github.sha }}
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: IMAGE_TAG
command_timeout: 10m
script: |
SHA="${IMAGE_TAG##*:}"
COMPOSE_SOURCE="/home/deploy/.identitylab-deploy/$SHA/docker-compose.identitylab.yml"

sudo -n /usr/local/sbin/deploy-identitylab \
"$IMAGE_TAG" "$COMPOSE_SOURCE"

rm -rf -- "/home/deploy/.identitylab-deploy/$SHA"
50 changes: 50 additions & 0 deletions .github/workflows/javascript-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: JS Client

on:
pull_request:
push:
branches:
- dev
- master

permissions:
contents: read

jobs:
changes:
name: Changes
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
outputs:
javascript: ${{ steps.filter.outputs.javascript }}
steps:
- name: Checkout for push comparison
if: github.event_name != 'pull_request'
uses: actions/checkout@v4
- name: Detect changed files
id: filter
uses: dorny/paths-filter@v3
with:
base: ${{ github.ref }}
filters: |
javascript:
- 'src/client/CodeBeam.UltimateAuth.Client.Blazor/TScripts/**'
- 'tests/CodeBeam.UltimateAuth.Tests.Unit/javascript/**'
- '.github/workflows/javascript-tests.yml'

tests:
name: Tests
needs: changes
if: needs.changes.outputs.javascript == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Run JavaScript tests
run: node --test tests/CodeBeam.UltimateAuth.Tests.Unit/javascript/*.test.cjs
Loading
Loading