SAIF.Presentation.Web.Controls.V2.Menu 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¶
SAIF.Presentation.Web.Controls.V2.Menu makes no Active Directory calls and no authorization decision of its own. It is a pure consumer of the per-user authorization set produced by SAIF.Business.Menu and cached in Session("navdata") as a NavigationContext. Every rendered link, accordion category, favourite, and toolbar button is emitted only when the corresponding entry exists in that user's MenuAuthorizedItems collection and carries the appropriate flag. Because this is UI-side trimming, it is a presentation-layer authorization projection, not an access control barrier — the enforceable page-level check is performed by SAIF.Presentation.Web.MVC.clsControllerBase.
flowchart TD
A["Page request"] --> B{"Session('navdata')<br>present?"}
B -- yes --> C["Reuse cached NavigationContext"]
B -- no --> D["Request.LogonUserIdentity.Name<br>strip DOMAIN, upper-case"]
D --> E["New NavigationContext(userid)<br>loads MenuAuthorizedItems"]
E --> C
C --> F["SAIFMenu: categories + items<br>where IsVisible"]
C --> G["SAIFMenu: Favorites branch"]
C --> H["SAIFMenuTop: category links<br>where IsVisible"]
C --> I["SAIFMenuTop: GetCurrentPage()<br>toolbar capability flags"]
I --> J["Insert / Save / Delete / Print /<br>Download / Prefs / Help buttons"]
AD resource catalog¶
No AD resource names, LDAP paths, System.DirectoryServices usage, WCF SecurityService proxies, or authorization attributes appear in this library.
| Resource name | Purpose | Enforcement point | Source |
|---|---|---|---|
| (none) | No Active Directory resource name is referenced in this library | — | — |
The only Security-namespace artifacts are the AspNetHostingPermission(SecurityAction.Demand / InheritanceDemand, Level:=AspNetHostingPermissionLevel.Minimal) CAS declarations on SAIFImageButton. These are standard ASP.NET custom-control hosting-permission declarations and grant no application privilege. SAIFMenu.vb also carries Imports SAIF.Framework.Security, but no member of that namespace is referenced in the file.*
Authorization enforcement points¶
Programmatic authorization checks¶
| Class | Method | Resource / Role | Check type | Source |
|---|---|---|---|---|
SAIFMenu |
GetNavigationData |
Authorization-set acquisition — returns Session("navdata") when present; otherwise reads HttpContext.Current.Request.LogonUserIdentity.Name, strips the domain prefix, upper-cases it, and constructs New NavigationContext(userid), then caches it in session |
IsAuthorized (indirect via NavigationContext) |
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
SAIFMenuTop |
GetNavigationData |
Identical logic to the row above (session-first, then LogonUserIdentity.Name) |
IsAuthorized (indirect) |
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
SAIFMenu |
AddLinks — category panes |
An accordion pane is created for a category only when MenuAuthorizedItems.AppItemsByCategory(Category).Where(Function(AuthItem) AuthItem.IsVisible = True).Count > 0 |
HasAccess (menu trimming) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
SAIFMenu |
AddLinks — item links |
Iterates MenuAuthorizedItems.ApplicationItems and emits a LinkButton only If Item.IsVisible |
HasAccess (menu trimming) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
SAIFMenu |
AddFavorites |
Iterates MenuAuthorizedItems.Favorites only — favorites are themselves a branch of the per-user authorization query |
HasAccess (menu trimming) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
SAIFMenu |
AddFavorites — external-client link |
If AppGlobal.EnvironmentService.IsClientExternal adds the "Change Password" link (ChangePWLink) to the favorites list |
HasAccess (audience gate) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
SAIFMenuTop |
BuildLinkCollection |
Iterates MenuAuthorizedItems.AppItemsByCategory(SelectedCategory) and emits a link only If Item.IsVisible |
HasAccess (menu trimming) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
SAIFMenuTop |
Page_PreLoad |
CurrentPage = NavigationData.GetCurrentPage(); each toolbar button is made Visible/Enabled only when the matching clsMenuAuthorizedItem flag is set: IsDisplayInsert, IsDisplaySave, IsDisplayDelete, IsDisplayPrint, IsDisplayDownload, IsDisplaySavePreferences, IsDisplayHelp |
HasAccess (per-page action authorization) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
SAIFMenu / SAIFMenuTop |
NavigateToItem |
The clicked sequence number is resolved back through NavigationData.MenuAuthorizedItems.Item(ItemSeq) before MenuNavigate is raised with the item's ApplicationPath and PageLink |
HasAccess (navigation resolution) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb; SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
SAIFMenu / SAIFMenuTop |
CurrentItem / CurrentPage |
Resolve the active page through NavigationData.GetCurrentItem / GetItem / GetCurrentPage, all of which query only the authorized set |
HasAccess (current-page resolution) | SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb; SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
Per-page action-capability matrix¶
Each capability is a flag on the user's own clsMenuAuthorizedItem row for the current page, sourced from MENU_PAGE in SAIF.Business.Menu.
| Toolbar action | Gating flag | Underlying column | Enforcement point |
|---|---|---|---|
| Insert | IsDisplayInsert |
MENU_PAGE.INSERT_FLAG |
SAIFMenuTop.Page_PreLoad (see BR-MENU-059) |
| Save | IsDisplaySave |
MENU_PAGE.SAVE_FLAG |
SAIFMenuTop.Page_PreLoad |
| Delete | IsDisplayDelete |
MENU_PAGE.DELETE_FLAG |
SAIFMenuTop.Page_PreLoad |
IsDisplayPrint |
MENU_PAGE.PRINT_FLAG |
SAIFMenuTop.Page_PreLoad |
|
| Download | IsDisplayDownload |
MENU_PAGE.DOWNLOAD_FLAG |
SAIFMenuTop.Page_PreLoad |
| Save preferences | IsDisplaySavePreferences |
MENU_PAGE.SAVE_PREFERENCES_FLAG |
SAIFMenuTop.Page_PreLoad |
| Help | IsDisplayHelp |
MENU_PAGE.HELP_FLAG |
SAIFMenuTop.Page_PreLoad |
Data-level authorization¶
| Entity type | Validation method | Mechanism | Source |
|---|---|---|---|
| Menu item / authorization set | NavigationContext / clsMenuAuthorizedItemCollection |
Identity-derived set acquisition — the menu user is taken from the authenticated Windows identity (Request.LogonUserIdentity.Name, DOMAIN\ prefix stripped, upper-cased), never from a client-supplied value |
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb; SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
| Menu item click target | clsMenuAuthorizedItem |
MenuAuthorizedItems.Item(ItemSeq) resolves the click target, so the navigation target is always taken from the authorized set rather than posted data (see BR-MENU-046) |
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb; SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vb |
| Client audience | External vs. internal client | AppGlobal.EnvironmentService.IsClientExternal controls whether the "Change Password" link is offered (see BR-MENU-023) |
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vb |
No entity-ownership validation (policy/claim/account) and no segregation-of-duties checks exist in this library.
Notes¶
- 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. This library declares no AD resource names of its own. - Hiding and disabling a toolbar button prevents the UI from raising the corresponding
ToolbarClickevent, but the controls do not re-check the capability flag inside the click handlers (see BR-MENU-077), so a forged postback targeting a disabled action is not demonstrably blocked at this layer.* - The
navdatasession cache is never invalidated on menu-security change, so a privilege revocation takes effect only after the session ends.*SAIF.Presentation.Web.MVC.clsControllerBaseclearsSession("navdata")when it denies a page, which is the only invalidation path observed across the scanned libraries. AppGlobal.EnvironmentService.IsClientExternalis supplied by an external SAIF framework package not present in this repository; the rule that classifies a client as external cannot be confirmed here.**
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
- Overview
- Architecture
- Dependencies
- Operations and processes
- Business rules
- Database tables
- Control catalog
- API reference
Sources¶
SAIF.Presentation.Web.Controls.V2.Menu/SAIFMenu.vbSAIF.Presentation.Web.Controls.V2.Menu/SAIFMenuTop.vbSAIF.Presentation.Web.Controls.V2.Menu/SAIFImageButton.vbSAIF.Presentation.Web.Controls.V2.Menu/SAIF.Presentation.Web.Controls.V2.Menu.vbprojSAIF.Presentation.Web.MVC/NavigationContext.vb