---
title: SAIF.Presentation.Web.Core.Infragistics111 security and authorization
summary: Authorization requirements, AD resource groups, security enforcement points, and data-level access control.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Core.Infragistics111
reference_type: package
---

# SAIF.Presentation.Web.Core.Infragistics111 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

This library performs no Active Directory group evaluation and no direct authorization decision of its own. Its security-relevant surface is entirely delegated authorization: `NavigationContext` loads the calling user's pre-resolved menu-authorization set (`clsMenuAuthorizedItemCollection`, owned by `SAIF.Business.Menu`) from the Oracle `MENU` schema and exposes lookup helpers that only ever return items present in that per-user set. A second, non-authorization security-adjacent behavior is the `IsClientExternal` environment check in `AppViewPageBase.CallSessionPing`, which suppresses the keep-alive session-ping script for external clients so external sessions are allowed to time out.

```mermaid
flowchart TD
    A["Authenticated request<br>(WindowsIdentity supplied by IIS)"] --> B["NavigationContext.New(userId)"]
    B --> C["clsMSOracleDataLayer<br>DB user MENU, env = MENU_ENVIRONMENT"]
    C --> D["clsMenuAuthorizedItemCollection<br>.GetMenuAuthorizedItems(user)"]
    D --> E["Per-user authorized item set"]
    E --> F["IsMenuItem / GetCurrentPage<br>page-level lookups"]
    E --> G["GetItem / GetCurrentItem / GetItemSeq<br>item-level lookups (visibleOnly)"]
    F --> H["Nothing / False when not authorized<br>caller enforces the deny"]
    G --> H
```

## AD resource catalog

No AD resource names, LDAP paths, `System.DirectoryServices` usage, `PrincipalContext`/ `GroupPrincipal` usage, or `<SAIFAuthorize>` attributes exist anywhere in this library.

| Resource name | Purpose | Enforcement point | Source |
| --- | --- | --- | --- |
| _(none)_ | No Active Directory resource name is referenced in this library | — | — |

Authorization for this library is database-group-based, not AD-group-based: the security groups that drive the menu set live in the Oracle `MENU_SECURITY` / `MENU_SECURITY_USER` tables and are resolved by `SAIF.Business.Menu`.

## Authorization enforcement points

All enforcement in this library is programmatic and read-path only — every helper returns `Nothing`/`False`/`0` rather than throwing or redirecting when the requested item is not in the user's authorized set. The actual deny action (redirect to the login screen) is taken by the consuming controller in `SAIF.Presentation.Web.MVC`.

### Programmatic authorization checks

| Class | Method | Resource / Role | Check type | Source |
| --- | --- | --- | --- | --- |
| `NavigationContext` | `New(inUser)` | Per-user menu-authorization set (Oracle `MENU` schema) | Authorization-set load | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 168–172) |
| `NavigationContext` | `IsMenuItem(inApplication, inItem)` | Authorized menu item | `HasAccess` (page-level) | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 134–154) |
| `NavigationContext` | `GetCurrentPage()` | Authorized menu item | `HasAccess` (page-level) | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 156–178) |
| `NavigationContext` | `GetCurrentItem(inCategory)` | Authorized menu item (visible only) | `HasAccess` (item-level) | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 112–132) |
| `NavigationContext` | `GetItem(inCategory, inLink, inAnyApp)` | Authorized menu item (visible only) | `HasAccess` (item-level) | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 86–110) |
| `NavigationContext` | `GetItemSeq(inApplication, inCategory, inPageLink)` | Authorized menu item | `HasAccess` (item-level) | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 68–84) |
| `AppViewPageBase` | `CallSessionPing()` | n/a — session-lifetime gate, not an authorization check | `IsClientExternal` audience discriminator | `SAIF.Presentation.Web.Core.Infragistics111\AppViewPageBase.aspx.vb` (lines 176–201) |

Enforcement point 7 (`CallSessionPing`) is an environment/audience discriminator supplied by `AppGlobal.EnvironmentService` (an external SAIF framework dependency not present in this repository), not an identity check. Its security effect is that internal sessions are kept alive indefinitely while `EnableSessionPing` is `True` (the default set in `Page_Init`), whereas external sessions are not.* A commented-out predecessor of the same check tested `Model.Context.SecurityPrincipal.Domain.ToString = "SAIF"`; per analysis rules the commented form is not treated as a finding.

## Data-level authorization

| Entity type | Validation method | Mechanism | Source |
| --- | --- | --- | --- |
| `clsMenuAuthorizedItem` (user-scoped retrieval) | `NavigationContext.New` → `GetMenuAuthorizedItems(m_DPI, inUser.Trim.ToUpper)` | The authorization set is filtered at the database by menu user rather than filtered in memory after a broad read; the user name is normalized (trimmed, upper-cased) before it is bound to the `:MenuUser` bind variable in `SAIF.Business.Menu` | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (line 171) |
| `clsMenuAuthorizedItem` (visibility filtering) | `ItemByCategory` / `ItemExact` / `Item` | Hidden items are excluded from item-level resolution even when the user is authorized to the item, via the `visibleOnly:=True` argument | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 93, 103, 105, 128, 130) |
| `clsApplicationCode` (application scoping) | `ApplicationCodes.ItemByAppPath(Request.ApplicationPath)` | An item is only resolvable when the current virtual directory maps to a registered, active application code; `ApplicationCodes` is backed by `clsApplicationCodeCollection.GetActiveApplicationCodes` and cached in a `Static` local for the life of the app domain | `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb` (lines 43–49, 96–101, 118–126, 163–171) |

The application-code cache is a `Static` (per-app-domain, process-wide) cache and is not per user; only the `MenuAuthorizedItems` collection is user-specific. No cross-user leakage results, because the cached data (application codes and category codes) is reference data with no user dimension.*

No entity-ownership validation (policy/claim/account belongs to the caller), no composite identity-attribute + resource checks, and no WCF `SecurityService` usage exist in this library.

## Segregation of duties

No segregation-of-duties rules are present in this library.

## Security interfaces and contracts

This library defines no security-specific interfaces or base classes; `NavigationContext` is a concrete data-access/lookup class, not an abstraction consumed elsewhere for security purposes.

## Notes
- 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.
- `AppGlobal.EnvironmentService.IsClientExternal` is provided by an external SAIF framework package that is not present in this repository, so the concrete rule that classifies a client as external cannot be confirmed here.**
- The library never verifies that the user name passed to `NavigationContext.New` matches the authenticated identity; that responsibility sits with callers (`SAIF.Presentation.Web.MVC` passes `Model.Context.UserID`, and `SAIF.Presentation.Web.Controls.V2.Menu` passes `Request.LogonUserIdentity.Name`). A caller supplying an arbitrary user name would obtain that user's menu set.*

> **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.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Business rules](business-rules.md)
- [Configuration](configuration.md)
- [API reference](api/index.md)

## Sources
- `SAIF.Presentation.Web.Core.Infragistics111\NavigationContext.vb`
- `SAIF.Presentation.Web.Core.Infragistics111\AppViewPageBase.aspx.vb`
- `SAIF.Presentation.Web.Core.Infragistics111\AppViewMasterPageBase.vb`
- `SAIF.Presentation.Web.Core.Infragistics111\clsControlManager.vb`
- `SAIF.Presentation.Web.Core.Infragistics111\SAIF.Presentation.Web.Core.Infragistics111.vbproj`
- `SAIF.Business.Menu\clsMenuAuthorizedItemCollection.vb`
- `SAIF.Business.Menu\clsMenuAuthorizedItem.vb`
