@polymorphism-tech/morph-spec 4.12.0 → 4.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +7 -7
- package/README.md +28 -34
- package/bin/morph-spec.js +41 -24
- package/bin/task-manager.js +962 -1341
- package/bin/validate.js +1 -1
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +14 -16
- package/docs/QUICKSTART.md +15 -15
- package/framework/CLAUDE.md +5 -2
- package/framework/agents/README.md +3 -4
- package/framework/agents/ai-agents/ai-system-architect.md +6 -10
- package/framework/agents/architecture/seo-growth-hacker.md +166 -326
- package/framework/agents/architecture/standards-architect.md +21 -31
- package/framework/agents/backend/dotnet-senior.md +160 -86
- package/framework/agents/backend/ef-modeler.md +2 -6
- package/framework/agents/backend/hangfire-orchestrator.md +8 -9
- package/framework/agents/backend/ms-agent-expert.md +1 -1
- package/framework/agents/frontend/nextjs-expert.md +198 -133
- package/framework/agents/frontend/ui-ux-designer.md +226 -267
- package/framework/agents/infrastructure/infra-architect.md +191 -27
- package/framework/agents/integrations/clerk-auth.md +19 -26
- package/framework/agents/integrations/hangfire-integration.md +1 -4
- package/framework/agents.json +1084 -2278
- package/framework/commands/morph-apply.md +4 -6
- package/framework/commands/morph-preflight.md +192 -269
- package/framework/commands/morph-proposal.md +210 -238
- package/framework/commands/morph-status.md +72 -92
- package/framework/commands/morph-troubleshoot.md +6 -13
- package/framework/hooks/README.md +1 -6
- package/framework/hooks/claude-code/post-tool-use/validator-feedback.js +4 -6
- package/framework/hooks/claude-code/pre-compact/save-morph-context.js +12 -7
- package/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +2 -2
- package/framework/hooks/claude-code/pre-tool-use/task-tracking-guard.js +5 -10
- package/framework/hooks/claude-code/session-start/inject-morph-context.js +63 -30
- package/framework/hooks/claude-code/session-start/resume-context.js +77 -0
- package/framework/hooks/claude-code/statusline.py +4 -5
- package/framework/hooks/claude-code/stop/validate-completion.js +4 -4
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +8 -8
- package/framework/hooks/shared/compact-restore.js +28 -5
- package/framework/hooks/shared/phase-utils.js +4 -8
- package/framework/hooks/shared/state-reader.js +34 -3
- package/framework/phases.json +162 -200
- package/framework/rules/ai-agents-standards.md +15 -0
- package/framework/rules/asaas-standards.md +13 -0
- package/framework/rules/clerk-standards.md +13 -0
- package/framework/rules/csharp-standards.md +8 -4
- package/framework/rules/data-standards.md +18 -0
- package/framework/rules/dotnet-templates.md +87 -0
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/hangfire-standards.md +13 -0
- package/framework/rules/infrastructure-standards.md +27 -16
- package/framework/rules/morph-workflow.md +73 -13
- package/framework/rules/nextjs-standards.md +1 -0
- package/framework/rules/nextjs-templates.md +40 -0
- package/framework/rules/resend-standards.md +12 -0
- package/framework/rules/supabase-standards.md +29 -0
- package/framework/skills/README.md +6 -8
- package/framework/skills/level-0-meta/mcp-registry.json +21 -99
- package/framework/{standards/ai-agents/team-orchestration.md → skills/level-0-meta/morph-agent-teams/SKILL.md} +472 -479
- package/framework/skills/level-0-meta/morph-brainstorming/SKILL.md +28 -1
- package/framework/skills/level-0-meta/morph-checklist/SKILL.md +2 -2
- package/framework/skills/level-0-meta/morph-code-review/SKILL.md +1 -5
- package/framework/skills/level-0-meta/morph-code-review/scripts/scan-csharp.mjs +1 -1
- package/framework/skills/level-0-meta/morph-frontend-review/SKILL.md +23 -41
- package/framework/skills/level-0-meta/morph-init/SKILL.md +18 -14
- package/framework/skills/level-0-meta/morph-parallel-dispatch/SKILL.md +225 -0
- package/framework/skills/level-0-meta/morph-post-implementation/SKILL.md +20 -0
- package/framework/skills/level-0-meta/morph-tool-usage-guide/SKILL.md +4 -8
- package/framework/skills/level-0-meta/morph-tool-usage-guide/references/tools-per-phase.md +15 -59
- package/framework/skills/level-0-meta/morph-verification-before-completion/SKILL.md +7 -19
- package/framework/skills/level-0-meta/morph-verification-before-completion/scripts/check-phase-outputs.mjs +8 -8
- package/framework/skills/level-1-workflows/README.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +49 -50
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +57 -123
- package/framework/skills/level-1-workflows/morph-phase-design/references/architecture-analysis-guide.md +5 -50
- package/framework/skills/level-1-workflows/morph-phase-design/references/spec-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +127 -159
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/code-quality-reviewer-prompt.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/implementer-prompt.md +4 -3
- package/framework/skills/level-1-workflows/morph-phase-implement/prompts/spec-reviewer-prompt.md +2 -2
- package/framework/skills/level-1-workflows/morph-phase-implement/references/recap-example.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +17 -13
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +22 -40
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/task-planning-patterns.md +143 -172
- package/framework/skills/level-1-workflows/morph-phase-tasks/references/tasks-example.md +5 -5
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +57 -77
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/squad-templates/backend-only.json +6 -6
- package/framework/squad-templates/frontend-only.json +17 -8
- package/framework/squad-templates/full-stack.json +29 -24
- package/framework/standards/STANDARDS.json +1021 -2369
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +200 -0
- package/framework/standards/backend/dotnet/result-pattern.md +213 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +172 -0
- package/framework/standards/backend/dotnet/scrutor.md +158 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +274 -0
- package/framework/standards/frontend/nextjs/motion-patterns.md +1 -1
- package/framework/standards/infrastructure/supabase/mcp-setup.md +83 -193
- package/framework/standards/integration/mcp/mcp-tools.md +91 -77
- package/framework/templates/IDE-SNIPPETS.md +2 -6
- package/framework/templates/README.md +709 -814
- package/framework/templates/REGISTRY.json +223 -762
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -0
- package/framework/templates/code/dotnet/abstractions/error.cs +60 -0
- package/framework/templates/code/dotnet/abstractions/handler.cs +12 -0
- package/framework/templates/code/dotnet/abstractions/result.cs +74 -0
- package/framework/templates/code/dotnet/backend/repository.cs +148 -141
- package/framework/templates/code/dotnet/constants/api-tags.cs +6 -0
- package/framework/templates/code/dotnet/exceptions/exception-handler.cs +32 -0
- package/framework/templates/code/dotnet/extensions/database-extensions.cs +20 -0
- package/framework/templates/code/dotnet/extensions/handler-registration.cs +38 -0
- package/framework/templates/code/dotnet/extensions/health-checks.cs +24 -0
- package/framework/templates/code/dotnet/extensions/map-endpoints.cs +35 -0
- package/framework/templates/code/dotnet/extensions/result-extensions.cs +29 -0
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -0
- package/framework/templates/code/dotnet/feature/entity.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/errors.cs.hbs +8 -0
- package/framework/templates/code/dotnet/feature/handler.cs.hbs +24 -0
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -0
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -0
- package/framework/templates/code/dotnet/jobs/job.cs +21 -17
- package/framework/templates/code/dotnet/pipelines/logging-decorator.cs +31 -0
- package/framework/templates/code/dotnet/pipelines/validation-decorator.cs +97 -0
- package/framework/templates/code/dotnet/test.cs +192 -106
- package/framework/templates/context/ARCHITECTURE.md +89 -0
- package/framework/templates/context/CONTEXT-FEATURE.md +2 -2
- package/framework/templates/context/CONTEXT.md +180 -181
- package/framework/templates/context/design-system.md +1 -5
- package/framework/templates/docs/onboarding.md +2 -3
- package/framework/templates/docs/proposal.md +171 -182
- package/framework/templates/docs/spec.md +1 -3
- package/framework/templates/docs/ui-components.md +0 -72
- package/framework/templates/examples/design-system-examples.md +4 -4
- package/framework/templates/feature/decisions.md +0 -66
- package/framework/templates/feature/recap.md +1 -2
- package/framework/templates/infrastructure/github/README.md +56 -593
- package/framework/templates/integrations/clerk-config.cs +0 -41
- package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +2 -2
- package/framework/templates/meta-prompts/squad-leaders/backend-squad.md +1 -2
- package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +83 -126
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +2 -2
- package/framework/templates/project/validate.js +2 -4
- package/framework/templates/ui/design-system.css +1 -1
- package/framework/workflows/README.md +8 -8
- package/framework/workflows/configs/fast-track.json +51 -0
- package/framework/workflows/configs/full.json +68 -0
- package/framework/workflows/configs/standard.json +7 -3
- package/framework/workflows/docs/STORY-DRIVEN-DEVELOPMENT.md +1 -1
- package/framework/workflows/docs/enforcement-pipeline.md +18 -19
- package/framework/workflows/docs/full-morph.md +69 -76
- package/framework/workflows/docs/standard.md +49 -44
- package/framework/workflows/docs/ui-refresh.md +1 -1
- package/package.json +3 -3
- package/src/commands/agents/dispatch-agents.js +55 -116
- package/src/commands/context/context-refresh.js +79 -0
- package/src/commands/phase/phase-reset.js +1 -1
- package/src/commands/project/doctor.js +10 -32
- package/src/commands/project/init.js +12 -0
- package/src/commands/project/status.js +6 -12
- package/src/commands/scaffold/scaffold.js +131 -0
- package/src/commands/scope/escalate.js +1 -1
- package/src/commands/state/advance-phase.js +15 -29
- package/src/commands/state/state.js +20 -5
- package/src/commands/tasks/task.js +0 -30
- package/src/commands/validation/validate-feature.js +3 -10
- package/src/core/paths/output-schema.js +12 -13
- package/src/core/state/phase-state-machine.js +211 -217
- package/src/core/state/state-manager.js +9 -9
- package/src/lib/agents/agents-manager.js +2 -2
- package/src/lib/agents/output-collector.js +1 -2
- package/src/lib/detectors/design-system-detector.js +4 -4
- package/src/lib/detectors/index.js +1 -11
- package/src/lib/generators/architecture-scanner.js +640 -0
- package/src/lib/generators/context-generator.js +3 -3
- package/src/lib/generators/design-system-generator.js +508 -587
- package/src/lib/generators/index.js +12 -10
- package/src/lib/generators/metadata-extractor.js +386 -387
- package/src/lib/generators/recap-generator.js +4 -4
- package/src/lib/generators/scaffold-generator.js +317 -0
- package/src/lib/generators/settings-generator.js +0 -1
- package/src/lib/phase-chain/phase-validator.js +64 -42
- package/src/lib/stack/stack-profile.js +2 -2
- package/src/lib/standards/digest-builder.js +72 -285
- package/src/lib/tasks/task-parser.js +11 -5
- package/src/lib/validators/architecture/architecture-validator.js +259 -387
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/css/css-validator.js +340 -352
- package/src/lib/validators/packages/package-validator.js +347 -360
- package/src/lib/validators/shared/issue-counter.js +14 -18
- package/src/lib/validators/validation-runner.js +3 -19
- package/src/scripts/setup-infra.js +1 -1
- package/src/utils/agents-installer.js +61 -10
- package/src/utils/file-copier.js +1 -0
- package/src/utils/hooks-installer.js +11 -19
- package/src/utils/skills-installer.js +178 -178
- package/framework/agents/architecture/prompt-engineer.md +0 -195
- package/framework/agents/backend/api-designer.md +0 -106
- package/framework/agents/frontend/blazor-builder.md +0 -229
- package/framework/agents/frontend/nextjs-ui-specialist.md +0 -218
- package/framework/agents/infrastructure/azure-architect.md +0 -150
- package/framework/agents/infrastructure/azure-deploy-specialist.md +0 -707
- package/framework/agents/infrastructure/bicep-architect.md +0 -132
- package/framework/agents/infrastructure/container-specialist.md +0 -137
- package/framework/agents/infrastructure/devops-engineer.md +0 -126
- package/framework/agents/integrations/azure-identity.md +0 -148
- package/framework/agents/quality/code-analyzer.md +0 -239
- package/framework/agents/quality/testing-specialist.md +0 -130
- package/framework/hooks/claude-code/notification/approval-reminder.js +0 -57
- package/framework/hooks/claude-code/post-tool-use/context-refresh.js +0 -109
- package/framework/hooks/claude-code/post-tool-use/skill-reminder.js +0 -78
- package/framework/index/troubleshooting-index.json +0 -184
- package/framework/rules/testing-standards.md +0 -14
- package/framework/skills/level-0-meta/morph-replicate/SKILL.md +0 -230
- package/framework/skills/level-0-meta/morph-replicate/references/blazor-html-mapping.md +0 -70
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +0 -256
- package/framework/skills/level-1-workflows/morph-phase-clarify/references/clarifications-example.md +0 -117
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +0 -269
- package/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/framework/standards/architecture/ddd/bounded-contexts.md +0 -105
- package/framework/standards/architecture/ddd/complexity-levels.md +0 -108
- package/framework/standards/architecture/ddd/entities.md +0 -99
- package/framework/standards/architecture/ddd/ubiquitous-language.md +0 -58
- package/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/framework/standards/backend/api/minimal-api.md +0 -494
- package/framework/standards/backend/api/rest.md +0 -492
- package/framework/standards/backend/authentication/passkeys.md +0 -428
- package/framework/standards/backend/database/ef-core.md +0 -199
- package/framework/standards/backend/database/migrations.md +0 -393
- package/framework/standards/backend/database/repository-patterns.md +0 -528
- package/framework/standards/backend/dotnet/async.md +0 -366
- package/framework/standards/backend/dotnet/core.md +0 -117
- package/framework/standards/backend/dotnet/di.md +0 -439
- package/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/framework/standards/context/analytics.md +0 -96
- package/framework/standards/context/bundles.md +0 -110
- package/framework/standards/context/priming.md +0 -78
- package/framework/standards/core/architecture.md +0 -185
- package/framework/standards/core/coding.md +0 -214
- package/framework/standards/core/git-branching-strategy.md +0 -403
- package/framework/standards/core/git.md +0 -185
- package/framework/standards/core/testing.md +0 -295
- package/framework/standards/data/nosql/blob-storage.md +0 -102
- package/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/framework/standards/frontend/blazor/state.md +0 -191
- package/framework/standards/frontend/design-system/aesthetic-direction.md +0 -266
- package/framework/standards/frontend/design-system/design-trends.md +0 -171
- package/framework/standards/infrastructure/azure/azure.md +0 -624
- package/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/framework/standards/infrastructure/vercel/vercel-database.md +0 -106
- package/framework/standards/integration/api/graphql.md +0 -91
- package/framework/standards/integration/api/grpc.md +0 -114
- package/framework/standards/integration/api/rest-design.md +0 -95
- package/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/framework/standards/observability/logging.md +0 -131
- package/framework/standards/observability/metrics.md +0 -121
- package/framework/standards/observability/monitoring.md +0 -114
- package/framework/standards/observability/tracing.md +0 -132
- package/framework/standards/workflows/parallel-execution.md +0 -112
- package/framework/standards/workflows/thread-management.md +0 -113
- package/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +0 -69
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +0 -86
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +0 -41
- package/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/framework/templates/infrastructure/azure/README.md +0 -286
- package/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/framework/templates/project-structure/dotnet-ddd.md +0 -70
- package/framework/templates/saas/subscription.cs +0 -347
- package/framework/templates/saas/tenant.cs +0 -338
- package/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/framework/templates/ui/MudTheme.cs +0 -281
- package/framework/workflows/configs/nodejs-cli.json +0 -40
- package/src/commands/standards/context-budget.js +0 -89
- package/src/lib/standards/index.js +0 -7
- package/src/lib/standards/standards-context-injector.js +0 -302
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +0 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +0 -279
- package/src/lib/validators/blazor/blazor-validator.js +0 -369
- package/src/lib/validators/blazor/index.js +0 -9
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: bicep-architect
|
|
3
|
-
description: Bicep Architect specialist for Azure Infrastructure as Code, modular Bicep templates, ARM deployments, and resource configuration. Use when writing Bicep templates, structuring IaC modules, validating Azure deployments with what-if, or converting ARM JSON to Bicep.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- azure
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Bicep Architect
|
|
10
|
-
|
|
11
|
-
Especialista em Infrastructure as Code com Azure Bicep. **Zero Portal** — all infra via code.
|
|
12
|
-
|
|
13
|
-
## Structure
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
infra/
|
|
17
|
-
├── main.bicep # Entry point
|
|
18
|
-
├── main.bicepparam # Parameters (alt to JSON)
|
|
19
|
-
├── parameters.dev.json
|
|
20
|
-
├── parameters.prod.json
|
|
21
|
-
└── modules/
|
|
22
|
-
├── container-app.bicep
|
|
23
|
-
├── container-app-env.bicep
|
|
24
|
-
├── sql-database.bicep
|
|
25
|
-
├── storage.bicep
|
|
26
|
-
├── key-vault.bicep
|
|
27
|
-
├── app-insights.bicep
|
|
28
|
-
├── service-bus.bicep
|
|
29
|
-
└── redis-cache.bicep
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Main Template Pattern
|
|
33
|
-
|
|
34
|
-
```bicep
|
|
35
|
-
targetScope = 'resourceGroup'
|
|
36
|
-
|
|
37
|
-
@allowed(['dev', 'staging', 'prod'])
|
|
38
|
-
param environment string = 'dev'
|
|
39
|
-
param location string = resourceGroup().location
|
|
40
|
-
@minLength(3) @maxLength(20) param appName string
|
|
41
|
-
@secure() param sqlAdminPassword string
|
|
42
|
-
|
|
43
|
-
var resourcePrefix = '${appName}-${environment}'
|
|
44
|
-
var tags = { environment: environment, application: appName, managedBy: 'bicep' }
|
|
45
|
-
|
|
46
|
-
resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
|
|
47
|
-
name: '${resourcePrefix}-logs'
|
|
48
|
-
location: location
|
|
49
|
-
tags: tags
|
|
50
|
-
properties: { sku: { name: 'PerGB2018' }, retentionInDays: 30 }
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
module appInsights 'modules/app-insights.bicep' = { name: 'appInsights', params: { ... } }
|
|
54
|
-
module containerAppEnv 'modules/container-app-env.bicep' = { name: 'env', params: { ... } }
|
|
55
|
-
module containerApp 'modules/container-app.bicep' = { name: 'app', params: { ... } }
|
|
56
|
-
module sqlDatabase 'modules/sql-database.bicep' = { name: 'sql', params: { ... } }
|
|
57
|
-
module keyVault 'modules/key-vault.bicep' = { name: 'kv', params: { ... } }
|
|
58
|
-
|
|
59
|
-
output containerAppUrl string = containerApp.outputs.url
|
|
60
|
-
output sqlConnectionString string = sqlDatabase.outputs.connectionString
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## SQL Database Module (Free Tier)
|
|
64
|
-
|
|
65
|
-
```bicep
|
|
66
|
-
// modules/sql-database.bicep
|
|
67
|
-
param serverName string
|
|
68
|
-
param databaseName string
|
|
69
|
-
param location string
|
|
70
|
-
param tags object = {}
|
|
71
|
-
param adminUsername string = 'sqladmin'
|
|
72
|
-
@secure() param adminPassword string
|
|
73
|
-
param useFree bool = true
|
|
74
|
-
|
|
75
|
-
resource sqlServer 'Microsoft.Sql/servers@2023-05-01-preview' = {
|
|
76
|
-
name: serverName
|
|
77
|
-
location: location
|
|
78
|
-
tags: tags
|
|
79
|
-
properties: { administratorLogin: adminUsername, administratorLoginPassword: adminPassword,
|
|
80
|
-
version: '12.0', minimalTlsVersion: '1.2', publicNetworkAccess: 'Enabled' }
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
resource db 'Microsoft.Sql/servers/databases@2023-05-01-preview' = {
|
|
84
|
-
parent: sqlServer
|
|
85
|
-
name: databaseName
|
|
86
|
-
location: location
|
|
87
|
-
sku: useFree ? { name: 'Free', tier: 'Free' } : { name: 'Basic', tier: 'Basic' }
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
resource firewall 'Microsoft.Sql/servers/firewallRules@2023-05-01-preview' = {
|
|
91
|
-
parent: sqlServer
|
|
92
|
-
name: 'AllowAllAzureIps'
|
|
93
|
-
properties: { startIpAddress: '0.0.0.0', endIpAddress: '0.0.0.0' }
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
> **Container App module:** See `container-specialist.md` for full Container App + ACR Bicep.
|
|
98
|
-
|
|
99
|
-
## Commands
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
az bicep build --file infra/main.bicep # Validate
|
|
103
|
-
az deployment group what-if -g rg-app-dev -f infra/main.bicep -p @infra/parameters.dev.json # Preview
|
|
104
|
-
az deployment group create -g rg-app-dev -f infra/main.bicep -p @infra/parameters.dev.json # Deploy
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Parameters File
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
112
|
-
"contentVersion": "1.0.0.0",
|
|
113
|
-
"parameters": {
|
|
114
|
-
"environment": { "value": "dev" },
|
|
115
|
-
"appName": { "value": "myapp" },
|
|
116
|
-
"sqlAdminPassword": { "reference": { "keyVault": { "id": "/subscriptions/.../vaults/{kv}" }, "secretName": "sql-admin-password" } }
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Checklist
|
|
122
|
-
- [ ] Bicep valid (`az bicep build`)
|
|
123
|
-
- [ ] Modules for reusable resources
|
|
124
|
-
- [ ] Parameters for dev and prod
|
|
125
|
-
- [ ] Secrets referenced from Key Vault
|
|
126
|
-
- [ ] Tags on all resources
|
|
127
|
-
- [ ] What-if executed before deploy
|
|
128
|
-
- [ ] Outputs for important values
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: container-specialist
|
|
3
|
-
description: Container Specialist for Docker, Compose, Azure Container Registry, and containerized .NET application patterns. Use when creating Dockerfiles, configuring multi-stage builds, setting up container registries, or containerizing .NET applications for Azure Container Apps.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- docker
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Container Specialist
|
|
10
|
-
|
|
11
|
-
Especialista em containerização com Docker e deploy para Azure Container Apps.
|
|
12
|
-
|
|
13
|
-
## Dockerfile (.NET Multi-stage)
|
|
14
|
-
|
|
15
|
-
```dockerfile
|
|
16
|
-
FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build
|
|
17
|
-
WORKDIR /src
|
|
18
|
-
COPY ["src/Web/Web.csproj", "src/Web/"]
|
|
19
|
-
COPY ["src/Application/Application.csproj", "src/Application/"]
|
|
20
|
-
COPY ["src/Domain/Domain.csproj", "src/Domain/"]
|
|
21
|
-
COPY ["src/Infrastructure/Infrastructure.csproj", "src/Infrastructure/"]
|
|
22
|
-
RUN dotnet restore "src/Web/Web.csproj"
|
|
23
|
-
COPY . .
|
|
24
|
-
WORKDIR "/src/src/Web"
|
|
25
|
-
RUN dotnet publish "Web.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
|
26
|
-
|
|
27
|
-
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS final
|
|
28
|
-
WORKDIR /app
|
|
29
|
-
RUN addgroup -g 1000 appgroup && adduser -u 1000 -G appgroup -D appuser
|
|
30
|
-
COPY --from=publish /app/publish .
|
|
31
|
-
RUN chown -R appuser:appgroup /app
|
|
32
|
-
USER appuser
|
|
33
|
-
EXPOSE 8080
|
|
34
|
-
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
35
|
-
CMD wget --quiet --tries=1 --spider http://localhost:8080/health || exit 1
|
|
36
|
-
ENTRYPOINT ["dotnet", "Web.dll"]
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Image Sizes
|
|
40
|
-
| Base Image | Size |
|
|
41
|
-
|------------|------|
|
|
42
|
-
| `aspnet:10.0` | ~220MB |
|
|
43
|
-
| `aspnet:10.0-alpine` | ~110MB |
|
|
44
|
-
| `aspnet:10.0-chiseled` | ~80MB (most secure) |
|
|
45
|
-
|
|
46
|
-
## ACR (Azure Container Registry)
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
az acr create -g rg-myapp -n myappacr --sku Basic
|
|
50
|
-
az acr login -n myappacr
|
|
51
|
-
az acr build --registry myappacr --image myapp:v1 .
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Container App (Bicep)
|
|
55
|
-
|
|
56
|
-
```bicep
|
|
57
|
-
param name string
|
|
58
|
-
param location string
|
|
59
|
-
param tags object = {}
|
|
60
|
-
param environmentId string
|
|
61
|
-
param containerImage string
|
|
62
|
-
param registryServer string
|
|
63
|
-
param registryUsername string
|
|
64
|
-
@secure() param registryPassword string
|
|
65
|
-
|
|
66
|
-
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
|
|
67
|
-
name: name
|
|
68
|
-
location: location
|
|
69
|
-
tags: tags
|
|
70
|
-
properties: {
|
|
71
|
-
managedEnvironmentId: environmentId
|
|
72
|
-
configuration: {
|
|
73
|
-
ingress: { external: true, targetPort: 8080, transport: 'http', allowInsecure: false }
|
|
74
|
-
registries: [{ server: registryServer, username: registryUsername, passwordSecretRef: 'reg-pwd' }]
|
|
75
|
-
secrets: [{ name: 'reg-pwd', value: registryPassword }]
|
|
76
|
-
}
|
|
77
|
-
template: {
|
|
78
|
-
containers: [{
|
|
79
|
-
name: name, image: containerImage
|
|
80
|
-
resources: { cpu: json('0.25'), memory: '0.5Gi' }
|
|
81
|
-
probes: [
|
|
82
|
-
{ type: 'Liveness', httpGet: { path: '/health', port: 8080 }, initialDelaySeconds: 10 }
|
|
83
|
-
{ type: 'Readiness', httpGet: { path: '/health/ready', port: 8080 }, initialDelaySeconds: 5 }
|
|
84
|
-
]
|
|
85
|
-
}]
|
|
86
|
-
scale: { minReplicas: 0, maxReplicas: 5
|
|
87
|
-
rules: [{ name: 'http-scale', http: { metadata: { concurrentRequests: '100' } } }]
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
output url string = 'https://${containerApp.properties.configuration.ingress.fqdn}'
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Health Checks (ASP.NET)
|
|
96
|
-
|
|
97
|
-
```csharp
|
|
98
|
-
builder.Services.AddHealthChecks()
|
|
99
|
-
.AddSqlServer(connString, name: "database", tags: new[] { "ready" });
|
|
100
|
-
|
|
101
|
-
app.MapHealthChecks("/health");
|
|
102
|
-
app.MapHealthChecks("/health/ready", new() { Predicate = c => c.Tags.Contains("ready") });
|
|
103
|
-
app.MapHealthChecks("/health/live", new() { Predicate = _ => false }); // Always healthy
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## Docker Compose (Dev)
|
|
107
|
-
|
|
108
|
-
```yaml
|
|
109
|
-
services:
|
|
110
|
-
web:
|
|
111
|
-
build: { context: ., dockerfile: Dockerfile }
|
|
112
|
-
ports: ["8080:8080"]
|
|
113
|
-
environment:
|
|
114
|
-
- ConnectionStrings__Default=Server=db;Database=App;User=sa;Password=Pass!;TrustServerCertificate=true
|
|
115
|
-
depends_on: { db: { condition: service_healthy } }
|
|
116
|
-
db:
|
|
117
|
-
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
118
|
-
environment: [ACCEPT_EULA=Y, SA_PASSWORD=YourStrong!Passw0rd]
|
|
119
|
-
ports: ["1433:1433"]
|
|
120
|
-
volumes: [sqldata:/var/opt/mssql]
|
|
121
|
-
volumes:
|
|
122
|
-
sqldata:
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Checklist
|
|
126
|
-
- [ ] Dockerfile multi-stage with alpine/chiseled
|
|
127
|
-
- [ ] .dockerignore configured
|
|
128
|
-
- [ ] Non-root user in container
|
|
129
|
-
- [ ] Health checks (liveness + readiness)
|
|
130
|
-
- [ ] Docker Compose for dev
|
|
131
|
-
- [ ] ACR created and configured
|
|
132
|
-
- [ ] Container App with scale-to-zero
|
|
133
|
-
- [ ] Probes configured
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: devops-engineer
|
|
3
|
-
description: DevOps Engineer (Tier 2 Domain Leader) for CI/CD pipeline strategy, GitHub Actions workflows, Azure DevOps, monitoring, and release automation. Use when designing deployment pipelines, configuring GitHub Actions, setting up Azure DevOps, or planning release strategies.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- azure
|
|
7
|
-
- docker
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# DevOps Engineer
|
|
11
|
-
|
|
12
|
-
Especialista em CI/CD, pipelines e automação de deploy.
|
|
13
|
-
|
|
14
|
-
## Azure Pipelines
|
|
15
|
-
|
|
16
|
-
```yaml
|
|
17
|
-
trigger:
|
|
18
|
-
branches: { include: [main, develop] }
|
|
19
|
-
paths: { exclude: ['**/*.md'] }
|
|
20
|
-
|
|
21
|
-
variables:
|
|
22
|
-
buildConfiguration: 'Release'
|
|
23
|
-
dotnetVersion: '10.0.x'
|
|
24
|
-
|
|
25
|
-
stages:
|
|
26
|
-
- stage: Build
|
|
27
|
-
jobs:
|
|
28
|
-
- job: BuildJob
|
|
29
|
-
pool: { vmImage: 'ubuntu-latest' }
|
|
30
|
-
steps:
|
|
31
|
-
- task: UseDotNet@2
|
|
32
|
-
inputs: { version: '$(dotnetVersion)' }
|
|
33
|
-
- task: DotNetCoreCLI@2
|
|
34
|
-
displayName: 'Restore'
|
|
35
|
-
inputs: { command: 'restore', projects: '**/*.csproj' }
|
|
36
|
-
- task: DotNetCoreCLI@2
|
|
37
|
-
displayName: 'Build'
|
|
38
|
-
inputs: { command: 'build', arguments: '-c $(buildConfiguration) --no-restore' }
|
|
39
|
-
- task: DotNetCoreCLI@2
|
|
40
|
-
displayName: 'Test'
|
|
41
|
-
inputs: { command: 'test', projects: '**/tests/**/*.csproj', arguments: '--collect:"XPlat Code Coverage"' }
|
|
42
|
-
- task: DotNetCoreCLI@2
|
|
43
|
-
displayName: 'Publish'
|
|
44
|
-
inputs: { command: 'publish', publishWebProjects: true, arguments: '-c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory)' }
|
|
45
|
-
- task: PublishBuildArtifacts@1
|
|
46
|
-
inputs: { pathToPublish: '$(Build.ArtifactStagingDirectory)', artifactName: 'drop' }
|
|
47
|
-
|
|
48
|
-
- stage: DeployDev
|
|
49
|
-
dependsOn: Build
|
|
50
|
-
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
|
|
51
|
-
jobs:
|
|
52
|
-
- deployment: Deploy
|
|
53
|
-
environment: 'development'
|
|
54
|
-
strategy:
|
|
55
|
-
runOnce:
|
|
56
|
-
deploy:
|
|
57
|
-
steps:
|
|
58
|
-
- task: AzureCLI@2
|
|
59
|
-
inputs:
|
|
60
|
-
scriptType: 'bash'
|
|
61
|
-
inlineScript: 'az containerapp update --name app-dev -g rg-dev --image $(image)'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## GitHub Actions
|
|
65
|
-
|
|
66
|
-
```yaml
|
|
67
|
-
name: CI/CD
|
|
68
|
-
on:
|
|
69
|
-
push: { branches: [main, develop] }
|
|
70
|
-
pull_request: { branches: [main] }
|
|
71
|
-
|
|
72
|
-
jobs:
|
|
73
|
-
build:
|
|
74
|
-
runs-on: ubuntu-latest
|
|
75
|
-
steps:
|
|
76
|
-
- uses: actions/checkout@v4
|
|
77
|
-
- uses: actions/setup-dotnet@v4
|
|
78
|
-
with: { dotnet-version: '10.0.x' }
|
|
79
|
-
- run: dotnet restore && dotnet build -c Release --no-restore && dotnet test -c Release --no-build
|
|
80
|
-
- run: dotnet publish src/Web/Web.csproj -c Release -o ./publish
|
|
81
|
-
|
|
82
|
-
docker:
|
|
83
|
-
needs: build
|
|
84
|
-
if: github.event_name == 'push'
|
|
85
|
-
runs-on: ubuntu-latest
|
|
86
|
-
permissions: { contents: read, packages: write }
|
|
87
|
-
steps:
|
|
88
|
-
- uses: actions/checkout@v4
|
|
89
|
-
- uses: docker/login-action@v3
|
|
90
|
-
with: { registry: ghcr.io, username: '${{ github.actor }}', password: '${{ secrets.GITHUB_TOKEN }}' }
|
|
91
|
-
- uses: docker/build-push-action@v5
|
|
92
|
-
with: { push: true, tags: 'ghcr.io/${{ github.repository }}:${{ github.sha }}' }
|
|
93
|
-
|
|
94
|
-
deploy:
|
|
95
|
-
needs: docker
|
|
96
|
-
if: github.ref == 'refs/heads/main'
|
|
97
|
-
runs-on: ubuntu-latest
|
|
98
|
-
environment: production
|
|
99
|
-
steps:
|
|
100
|
-
- uses: azure/login@v2
|
|
101
|
-
with: { creds: '${{ secrets.AZURE_CREDENTIALS }}' }
|
|
102
|
-
- uses: azure/container-apps-deploy-action@v1
|
|
103
|
-
with: { resourceGroup: rg-prod, containerAppName: app-prod, imageToDeploy: 'ghcr.io/${{ github.repository }}:${{ github.sha }}' }
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
> **Dockerfile:** See `container-specialist.md` for optimized multi-stage Dockerfile.
|
|
107
|
-
|
|
108
|
-
## Secrets Management
|
|
109
|
-
|
|
110
|
-
| Platform | Method |
|
|
111
|
-
|----------|--------|
|
|
112
|
-
| Azure DevOps | Variable Groups + Key Vault references |
|
|
113
|
-
| GitHub Actions | Repository/Environment Secrets |
|
|
114
|
-
|
|
115
|
-
## Checklist
|
|
116
|
-
- [ ] Trigger configured (branches, paths)
|
|
117
|
-
- [ ] Build: restore, build, test, publish
|
|
118
|
-
- [ ] Code coverage published
|
|
119
|
-
- [ ] Deploy to dev automatic (develop branch)
|
|
120
|
-
- [ ] Deploy to prod with approval (main branch)
|
|
121
|
-
- [ ] Secrets in Key Vault or variable groups
|
|
122
|
-
- [ ] Health check after deploy
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: azure-identity
|
|
3
|
-
description: Azure Identity specialist for Microsoft Entra ID, OAuth 2.0/OIDC, MSAL, JWT authentication, and enterprise SSO patterns. Use when implementing Microsoft authentication, configuring Entra ID app registrations, securing APIs with OAuth/JWT, or setting up enterprise SSO with Azure AD.
|
|
4
|
-
allowed-tools: Read, Write, Edit, Bash, Glob, Grep
|
|
5
|
-
stacks:
|
|
6
|
-
- azure
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Azure Identity (Microsoft Identity)
|
|
10
|
-
|
|
11
|
-
Microsoft Identity Platform for .NET/Blazor. SDK: `Microsoft.Identity.Web`.
|
|
12
|
-
|
|
13
|
-
## Setup
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
dotnet add package Microsoft.Identity.Web
|
|
17
|
-
dotnet add package Microsoft.Identity.Web.UI # For Blazor
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
```json
|
|
21
|
-
// appsettings.json
|
|
22
|
-
{ "AzureAd": {
|
|
23
|
-
"Instance": "https://login.microsoftonline.com/",
|
|
24
|
-
"Domain": "yourdomain.onmicrosoft.com",
|
|
25
|
-
"TenantId": "your-tenant-id",
|
|
26
|
-
"ClientId": "your-client-id",
|
|
27
|
-
"ClientSecret": "${AZURE_AD_CLIENT_SECRET}",
|
|
28
|
-
"CallbackPath": "/signin-oidc"
|
|
29
|
-
} }
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
```csharp
|
|
33
|
-
// Program.cs
|
|
34
|
-
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
|
|
35
|
-
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
|
|
36
|
-
builder.Services.AddControllersWithViews().AddMicrosoftIdentityUI();
|
|
37
|
-
builder.Services.AddAuthorization();
|
|
38
|
-
app.UseAuthentication();
|
|
39
|
-
app.UseAuthorization();
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Blazor Server
|
|
43
|
-
|
|
44
|
-
```csharp
|
|
45
|
-
// Additional setup
|
|
46
|
-
builder.Services.AddServerSideBlazor().AddMicrosoftIdentityConsentHandler();
|
|
47
|
-
|
|
48
|
-
// App.razor
|
|
49
|
-
<CascadingAuthenticationState>
|
|
50
|
-
<Router AppAssembly="@typeof(App).Assembly">
|
|
51
|
-
<Found Context="routeData">
|
|
52
|
-
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
|
|
53
|
-
<NotAuthorized>
|
|
54
|
-
@if (!context.User.Identity?.IsAuthenticated ?? true) { <RedirectToLogin /> }
|
|
55
|
-
else { <p>No permission.</p> }
|
|
56
|
-
</NotAuthorized>
|
|
57
|
-
</AuthorizeRouteView>
|
|
58
|
-
</Found>
|
|
59
|
-
</Router>
|
|
60
|
-
</CascadingAuthenticationState>
|
|
61
|
-
|
|
62
|
-
// RedirectToLogin.razor
|
|
63
|
-
@inject NavigationManager Nav
|
|
64
|
-
@code {
|
|
65
|
-
protected override void OnInitialized() =>
|
|
66
|
-
Nav.NavigateTo($"MicrosoftIdentity/Account/SignIn?redirectUri={Uri.EscapeDataString(Nav.Uri)}", forceLoad: true);
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Protected Pages
|
|
71
|
-
|
|
72
|
-
```razor
|
|
73
|
-
@page "/secure"
|
|
74
|
-
@attribute [Authorize]
|
|
75
|
-
|
|
76
|
-
<AuthorizeView>
|
|
77
|
-
<Authorized>Welcome, @context.User.Identity?.Name!</Authorized>
|
|
78
|
-
</AuthorizeView>
|
|
79
|
-
|
|
80
|
-
<AuthorizeView Roles="Admin"><Authorized><AdminPanel /></Authorized></AuthorizeView>
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## API Protection
|
|
84
|
-
|
|
85
|
-
```csharp
|
|
86
|
-
// API Program.cs
|
|
87
|
-
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
88
|
-
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
|
|
89
|
-
|
|
90
|
-
// Controller
|
|
91
|
-
[ApiController, Route("api/[controller]"), Authorize]
|
|
92
|
-
public class ProfileController : ControllerBase
|
|
93
|
-
{
|
|
94
|
-
[HttpGet]
|
|
95
|
-
public IActionResult GetProfile() => Ok(new {
|
|
96
|
-
UserId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value,
|
|
97
|
-
Name = User.Identity?.Name
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
[HttpGet("admin"), Authorize(Roles = "Admin")]
|
|
101
|
-
public IActionResult AdminOnly() => Ok("Admin access");
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## Downstream APIs (Microsoft Graph)
|
|
106
|
-
|
|
107
|
-
```csharp
|
|
108
|
-
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
|
|
109
|
-
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
|
|
110
|
-
.EnableTokenAcquisitionToCallDownstreamApi()
|
|
111
|
-
.AddMicrosoftGraph(builder.Configuration.GetSection("Graph"))
|
|
112
|
-
.AddInMemoryTokenCaches();
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Authorization Policies
|
|
116
|
-
|
|
117
|
-
```csharp
|
|
118
|
-
builder.Services.AddAuthorization(o => {
|
|
119
|
-
o.AddPolicy("RequireAdmin", p => p.RequireRole("Admin"));
|
|
120
|
-
o.AddPolicy("RequireManager", p => p.RequireAssertion(c =>
|
|
121
|
-
c.User.IsInRole("Admin") || c.User.IsInRole("Manager")));
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
## Multi-tenant & B2C
|
|
126
|
-
|
|
127
|
-
```json
|
|
128
|
-
// Multi-tenant: TenantId = "common" or "organizations"
|
|
129
|
-
// Then validate allowed tenants in TokenValidationParameters.IssuerValidator
|
|
130
|
-
|
|
131
|
-
// B2C: Use "AzureAdB2C" section with SignUpSignInPolicyId, ResetPasswordPolicyId
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
## Checklist
|
|
135
|
-
|
|
136
|
-
- [ ] App registered in Azure Portal
|
|
137
|
-
- [ ] Client ID + Tenant ID configured
|
|
138
|
-
- [ ] Client Secret in Key Vault
|
|
139
|
-
- [ ] Redirect URIs configured
|
|
140
|
-
- [ ] API permissions defined
|
|
141
|
-
- [ ] Token caching configured
|
|
142
|
-
- [ ] Authorization policies created
|
|
143
|
-
- [ ] Logout flow implemented
|
|
144
|
-
- [ ] Token expiry error handling
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
*MORPH-SPEC by Polymorphism Tech*
|