- Security
- development using https acme wildcard cert ( alternatively use selfsigned )
- authorization through JWT cookie secure,httponly,samesite strict
- webapi with roles authorization
 
- Developer friendly
- breakpoints works for c# backend and typescript angular/react frontend from the same vscode session
 
- Backend
- c# asp net core
- configuration
- development user-secrets
- appsettings ( autoreload on change )
- production environment variables
 
- development 
 
- Frontend
- angular
- openapi typescript/angular api services generated from backend swagger endpoint
- layout with responsive menu
- authguard protected pages routes
- login / logout ( TODO: reset lost password through email link )
- ( TODO: user manager )
- light/dark theme
- snacks
 
- react
- openapi typescript/axios api generated from backend swagger endpoint
- layout with responsive menu
- protected pages with react router dom
- zustand global services
- login / logout / reset lost password through email link
- light/dark theme
- snacks
 
 
- angular
- clone repository
git clone https://github.com/devel0/example-webapp-with-auth.git
cd example-webapp-with-auth- option 1 : angular frontend
git checkout frontend/angular- option 2 : react frontend
git checkout frontend/react- start development environment
code .- restore exec permissions on helper scripts
source misc/restore-permissions.sh- configure backend development variables
cd src/backend
dotnet user-secrets init
# change following as needed
SEED_ADMIN_EMAIL=some@domain.com
SEED_ADMIN_PASS="SEED_ADMIN_SECRET"
DB_PROVIDER="Postgres"
DB_CONN_STRING="Host=localhost; Database=DBNAME; Username=DBUSER; Password=DBPASS"
JWTKEY="$(openssl rand -hex 32)"
dotnet user-secrets set "AppConfig:Auth:Jwt:Key" "$JWTKEY"
dotnet user-secrets set "AppConfig:Database:Seed:Users:0:Username" "admin"
dotnet user-secrets set "AppConfig:Database:Seed:Users:0:Email" "$SEED_ADMIN_EMAIL"
dotnet user-secrets set "AppConfig:Database:Seed:Users:0:Password" "$SEED_ADMIN_PASS"
dotnet user-secrets set "AppConfig:Database:Seed:Users:0:Roles:0" "admin"
dotnet user-secrets set "AppConfig:Database:Connections:0:Name" "Development"
dotnet user-secrets set "AppConfig:Database:Connections:0:ConnectionString" "$DB_CONN_STRING"
dotnet user-secrets set "AppConfig:Database:Connections:0:Provider" "$DB_PROVIDER"
dotnet user-secrets set "AppConfig:Database:ConnectionName" "Development"
cd ../..- 
start backend choosing C-S-P Debug: Select and Start DebuggingthenBACKEND
- 
start frontend by issueing 
./run-frontend.sh- 
start frontend debugger C-S-P Debug: Select and Start DebuggingthenFRONTEND; this will open chrome to the named url and attaches the debugger
- 
to make things works with https acme cert you need a domain to set a CNAME record and certbot as described here 
- 
then edit hosts sudo /etc/hostslike following in order to resolve name locally
127.0.0.1   dev-webapp-test.searchathing.com
- finally set nginx sudo apt install nginxby linking the conf
cd /etc/nginx/conf.d
ln -s ~/opensource/example-webapp-with-auth/deploy/nginx/dev/webapp-test.conf
service nginx reloadcd src/backend
# MAILSERVER_SECURITY can be "Tls" or "Ssl" or "Auto" or "None"
dotnet user-secrets set "EmailServer:SmtpServerName" "$MAILSERVER_HOSTNAME"
dotnet user-secrets set "EmailServer:SmtpServerPort" "$MAILSERVER_PORT"
dotnet user-secrets set "EmailServer:Security" "$MAILSERVER_SECURITY"
dotnet user-secrets set "EmailServer:Username" "$MAILSERVER_USER_EMAIL"
dotnet user-secrets set "EmailServer:Password" "$MAILSERVER_USER_PASSWORD"when run backend unit tests with dotnet test the system will search for a configured db connection named "UnitTest"
cd src/backend
dotnet user-secrets set "AppConfig:Database:Connections:1:Name" "UnitTest"
dotnet user-secrets set "AppConfig:Database:Connections:1:ConnectionString" "$UNIT_TEST_DB_CONN_STRING"
dotnet user-secrets set "AppConfig:Database:Connections:1:Provider" "$DB_PROVIDER"a script to automate publish on production server is available
./publish -h sshname -sn test.searchathing.com -id mytest -sd searchathing.comwhere
- -his a configured- ~/.ssh/configentry to allow to enter with a public key to a server within root user
- -snis the application server hostname
- -idis a unique application id to allow more app on the same server
- -sdis the domain name where app run
published files and folders
| folder | description | 
|---|---|
| /root/security/mytest.env | copy (if not already exists) of webapp.env | 
| /root/deploy/mytest | rsync of deploy folder | 
| /srv/mytest/bin | rsync of self contained production src/backend/bin/Release/net9.0/linux-x64/publish/folder | 
| /etc/system/systemd/mytest-webapp.service | copy (if not already exists) of webapp.service | 
| /etc/nginx/conf.d/mytest-webapp.conf | copy (if not already exists) of webapp.conf | 
prerequisites on server side:
apt install openssh-server rsync nginx
# to run the backend service as user
useradd -m userediting configuration and logging production
- edit /root/security/mytest.confsetting variables accordingly to your production setup ( if not used EmailServer variables comment out with#)
to view backend service log
journalctl -u mytest-webapp -fto restart backend service
service mytest-webapp restartuse provided script gen-api.sh to generate frontend api from the backend swagger openapi ; this script will detect if angular or react frontend and retrieve corresponding hostname information from environment or vite depending