5.9 KiB
5.9 KiB
Phase 7: User Access Audit - Context
Gathered: 2026-04-07 Status: Ready for planning
## Phase BoundaryAdministrators can audit every permission a specific user holds across selected sites, distinguish access types (direct/group/inherited), and export results to CSV or HTML. The audit accepts multiple users via a tenant people picker and uses global site selection (Phase 6) with per-tab override.
Requirements: UACC-01, UACC-02
Success Criteria:
- A User Access Audit tab is accessible and accepts a user identifier and site selection as inputs
- Running the audit returns a list of all access entries the user holds across the selected sites
- Results distinguish between direct role assignments, SharePoint group memberships, and inherited access
- Results can be exported to CSV or HTML in the same format established by v1.0 export patterns
User Identification Input
- People picker powered by Microsoft Graph API to show autocomplete dropdown of tenant users
- Supports selecting multiple users for batch audit
- Site selection uses global sites (Phase 6) with per-tab override (same pattern as Permissions/Storage tabs)
- Single "Run Audit" click scans all selected users across all selected sites in one operation
Results Presentation
- DataGrid with toggle to switch between group-by-user and group-by-site views
- Essential columns only: User, Site, Object (list/folder), Permission Level, Access Type (Direct/Group/Inherited), Granted Through
- Per-user summary banner above the detail grid showing: total accesses, sites count, high-privilege count
- Search/filter TextBox to filter within audit results by any column
- Column sorting on all columns
Access Type Distinction
- Both color-coded rows AND Access Type column with icons for maximum clarity
- Direct assignments: distinct color tint + icon
- Group memberships: distinct color tint + icon, plus group name in "Granted Through" column
- Inherited access: distinct color tint + icon
- High-privilege entries (Full Control, Site Collection Admin) flagged with a warning icon/bold styling
- External/guest users (#EXT#) flagged with a guest badge/icon (reuse existing PermissionEntryHelper.IsExternalUser)
Export Format — HTML
- Full interactive HTML with collapsible groups, sortable columns, search filter, color coding (consistent with existing HTML exports)
- Summary header section with per-user access counts and risk highlights
- Both group-by-user and group-by-site views available in a single report via toggle/tab
Export Format — CSV
- One CSV file per audited user (separate files for sharing individual audit results)
- Summary section included at top of each file (user, total accesses, sites count, high-privilege count)
- Flat row structure with all essential columns
Claude's Discretion
- Exact color palette for access type row tinting (should be accessible and distinguishable)
- Icon choices for Direct/Group/Inherited/Warning/External badges
- Microsoft Graph API scope and authentication integration approach
- Internal service architecture (new UserAccessAuditService vs extending PermissionsService)
- DataGrid grouping implementation details (WPF CollectionViewSource or custom)
- HTML report JavaScript implementation for toggle between views
- Localization key names for new strings
<code_context>
Existing Code Insights
Reusable Assets
PermissionsService.ScanSiteAsync(ctx, options, progress, ct)— scans all permissions on a site; audit can filter results by target user(s)PermissionEntryrecord — 9-field flat record with ObjectType, Title, Url, Users, UserLogins, Type, PermissionLevels, GrantedThrough, HasUniquePermissionsPermissionEntryHelper.IsExternalUser(loginName)— detects #EXT# guest usersPermissionEntryHelper.FilterPermissionLevels(levels)— removes "Limited Access"CsvExportService.BuildCsv(entries)— CSV generation with merge logic (pattern reference)HtmlExportService— HTML report generation with embedded JS (pattern reference)SitePickerDialog— reusable multi-site picker (already wired from toolbar in Phase 6)FeatureViewModelBase— base class with GlobalSites property and OnGlobalSitesChanged hookSessionManager.GetOrCreateContextAsync(profile, ct)— authenticated ClientContext providerWeakReferenceMessenger— cross-VM messaging for progress updates
Established Patterns
- Tab ViewModel extends
FeatureViewModelBasewith[ObservableProperty]for bindable state RunOperationAsyncpattern for long-running operations with progress reporting- Export commands as
IAsyncRelayCommandwithCanExportpredicate - Dialog factories as
Func<Window>?set from code-behind - Localization via
TranslationSource.Instance["key"]with Strings.resx / Strings.fr.resx _hasLocalSiteOverridepattern for per-tab site override protection
Integration Points
- New tab in
MainWindow.xamlTabControl - New
UserAccessAuditView.xaml+UserAccessAuditViewModel.csfollowing existing tab pattern - New service for user-centric permission querying (filters PermissionEntry by user)
- New export services for audit-specific CSV and HTML formats
- DI registration in
App.xaml.csfor new services and ViewModel - Localization keys in
Strings.resx/Strings.fr.resxfor audit tab UI
</code_context>
## Specific Ideas- The people picker should query Graph API as the admin types, with debounced autocomplete
- Per-user summary should highlight if a user has Site Collection Admin access (highest risk)
- The HTML report toggle between "by user" and "by site" should be a simple tab/button in the report header, not requiring page reload
- CSV files should be named with the user's email for easy identification (e.g.,
audit_alice@contoso.com_2026-04-07.csv)
None — discussion stayed within phase scope
Phase: 07-user-access-audit Context gathered: 2026-04-07