SAIF.Application security and authorization¶
This page documents authorization mechanisms implemented or consumed by this library. Authentication is handled entirely by infrastructure (NTLM/AD) and is not application-level — all code receives a WindowsIdentity on the request context.
Authorization architecture¶
Authorization is centralized and AD-resource-name-based, delegated to the framework. SAIF.Application does not perform its own AD lookups and does not host or call a WCF SecurityService client directly — it consumes clsSecurityPrincipal.IsAuthorized(resourceName) from the referenced SAIF.BOF.Framework.Security package as the single point of truth for "is this AD resource granted." Two complementary, non-overlapping mechanisms exist in this library:
1. UserAccess — a direct, resource-name-keyed "does the user have this AD resource" check with per-instance caching, intended to be mixed into or inherited by concrete managers that need ad hoc resource checks.
2. AppManagerBase — a role-gating pattern (AppSecurityRole + Mark*/Is* members) intended for whole-object/whole-context accessibility (view-only vs. update vs. no access), driven by the subclass's own OnCheckSecurity() implementation.
No wiring between the two mechanisms is visible in this library.* No MVC [SAIFAuthorize] attributes are present in this library (it contains no MVC controllers/actions).
flowchart TD
Caller[Concrete AppManagerBase / UserAccess subclass] --> UA[UserAccess.HasAccess/CheckAccess]
Caller --> AMB[AppManagerBase.OnCheckSecurity]
UA --> Principal[clsSecurityPrincipal.IsAuthorized]
AMB --> Role[AppSecurityRole via Mark*/Is* members]
Principal --> AD[(Active Directory, via SAIF.BOF.Framework.Security)]
AD resource catalog¶
This library declares no hardcoded AD resource names. It implements a generic, parameterized authorization mechanism whose concrete resource names are supplied entirely by callers (concrete AppManagerBase/UserAccess subclasses in consuming libraries, e.g. SAIF.Application.Claim, SAIF.Application.Claim.Legal — out of scope for this library).
| Resource name | Purpose | Enforcement point | Source |
|---|---|---|---|
| (none hardcoded) | UserAccess.HasAccess(inResourceName)/CheckAccess(inResourceName()) accept the AD resource name as a caller-supplied String parameter; no literal resource name (e.g., SecureClaimResource) appears anywhere in this library's source.* |
UserAccess.HasAccess / UserAccess.CheckAccess |
SAIF.Application\UserAccess.vb |
The complete AD resource-name catalog for the application cannot be produced from SAIF.Application alone — it requires analysis of the consuming libraries where concrete resource-name string literals are expected to be supplied.**
Authorization enforcement points¶
Programmatic authorization checks¶
| Class | Method | Resource / Role | Check type | Source |
|---|---|---|---|---|
UserAccess |
HasAccess(inResourceName As String) As Boolean |
Caller-supplied AD resource name | IsAuthorized (delegated to clsSecurityPrincipal) |
SAIF.Application\UserAccess.vb |
UserAccess |
CheckAccess(ParamArray inResourceName As String()) |
Caller-supplied AD resource names | IsAuthorized (via HasAccess, result discarded)* |
SAIF.Application\UserAccess.vb |
AppManagerBase |
OnCheckSecurity() (MustOverride) |
AppSecurityRole (ViewOnly/Update/NoAccess) |
Role-gating (abstract hook implemented by subclass) | SAIF.Application\AppManagerBase.vb |
AppManagerBase |
IsAccessible / IsRestricted / IsUpdateable / IsViewOnly |
AppSecurityRole |
Read-only gates derived from SecurityRole |
SAIF.Application\AppManagerBase.vb |
No attribute-based authorization exists in this library (it contains no MVC controllers/actions), so no "Attribute-based authorization" subsection applies.
Data-level authorization¶
None found in this library. AppManagerBase exposes a generic ValidContext (Public ReadOnly Property) backed by the abstract OnValidContext() hook and ContextSet/MarkContextSet/MarkContextNotSet state, but no concrete ownership/context-validation logic (e.g., an IsValidPolicyForCurrentUser-style check) is implemented anywhere in this library — the actual validation rule is left entirely to concrete subclasses.*
Segregation of duties¶
None found. No class or method named *SegregationOfDuties*/*SOD*, and no SQL querying conflicting-privilege tables, exists in this library.
Security interfaces and contracts¶
| Interface / Class | Role | Consumers | Source |
|---|---|---|---|
clsSecurityPrincipal (external, from SAIF.BOF.Framework.Security) |
Single point of truth for AD-resource authorization decisions | AppManagerBase.SecurityPrincipal (Protected), UserAccess's private m_Principal |
SAIF.Application\AppManagerBase.vb, SAIF.Application\UserAccess.vb |
No local ISecurityManager/IDomainSecurityManager interface, no custom AuthorizeAttribute-derived attribute, and no direct System.DirectoryServices/System.DirectoryServices.AccountManagement usage were found anywhere in this library's source.
Notes¶
- Two distinct, identically-named
AppSecurityRoleenum declarations exist (nested inAppManagerBasevs. top-level inEnums.vb); which one downstream consumers reference could not be determined from this library alone.** UserAccess.CheckAccess's discarded result means its practical effect (cache warming vs. incomplete implementation) is ambiguous without seeing call sites in consuming libraries.*- Mark inferred statements with
*and unknown statements with**. Do not use bold inline confidence labels. - AD resource names listed here use base names only. The framework appends
Resource(production) orTestResource(non-production) at runtime.
Related documentation¶
Note: Statements marked with
*were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with**could not be confirmed; treat as unknown until verified.
Sources¶
SAIF.Application\UserAccess.vbSAIF.Application\AppManagerBase.vbSAIF.Application\Enums.vb