I cannot use default security trimming mechanism (<authorization>, roles, etc.) because our application implements much more complicated business rules by using its own "Roles and Rights Management System" (RRM). RRM is a much more flexible tool than Windows roles. It is based on three major database tables tRole, tRight, and tRightOfRole (many-to-many relationships). tRole represents business roles like Executive, ProjectManager, etc. tRight represents very granular rights given to roles by adding records to tRightOfRole. There is also a way to assign rights directly to users, and many other features, like per-project roles, etc.
So, my current plan is to use IsAccessibleToUser() method, which in turn would call an appropriate RRM's method to determine page visibility on SiteMap for a current user. I'm thinking about adding a delegate bool AccessibleToUser(int pageID) and assigning this delegate to an appropriate RRM's method during site map initialization. Then, IsAccessibleToUser() would call this delegate, passing (int) CurrentNode.Key, to determine page visibility. This way I would better decouple SiteMapProvider from RRM.
I also think that to assure proper page accesibility I would use a custom page event handler attached to a page event in HttpModule (what event to use? PerInit?) Since I would need to know current pageID and to avoid using of custom base page class just for knowing it, I would re-use SiteMap.CurrentNode.IsAccessibleToUser() here.
So, both page accessibility and page visibility on Sitemap would be determined by RRM's method (through IsAccessibleToUser() call).