Parameter security
In onze omgeving maken we gebruik van een ASP.NET webportal voor het aanbieden van rapportages welke allemaal zijn gemaakt in Reporting Services 2005. De security met betrekking tot wie welke rapporten mag openen en wie welke parameters mag selecteren wordt bepaald in deze portal aan de hand van de NTUserName van de gebruiker (Active Directory). De portal vergelijkt deze NTUsername met een Werknemerstabel waarin meer informatie staat over de gebruiker, bijvoorbeeld zijn functie en kostenplaats.

Wie mag wat selecteren?
Om te bepalen wie wat mag selecteren (parameters) wordt ook weer gekeken naar de NTUserName van de gebruiker. Met behulp van stored procedures wordt nu de parameterbox op de rapportenportal gevuld met waarden.

Dit lijkt prima te werken tot je met drillthrough rapporten gaat werken. Stel dat ik een rapport (A) maak met een link naar een doorklikrapport (B). A stuurt een aantal parameters mee naar B om enkel de data te tonen die relevant is.

Zodra ik A exporteer naar Excel blijven de hyperlinks naar B intact. Ik kan vanuit Excel klikken op de link en kom netjes op rapport B uit. Het probleem is nu dat alle parameters worden getoond in de url. De gebruiker kan nu met een beetje handigheid de url aanpassen en gegevens te zien krijgen die niet voor zijn ogen zijn bestemd.

Voor dit probleem zijn meerdere oplossing mogelijk:
1) In de query van je rapport neem je iets op mbt security in combinatie met een security tabel
2) Op de database (niet aan te raden)
3) Versleutelingen meesturen in de link

In ons geval hebben we gekozen voor oplossing 3. Ik zal de details besparen waarom we dit gekozen hebben.

Uitleg mbv een eenvoudig voorbeeld
Rapport A heeft een parameter: GeselecteerdeJaar
Rapport B heeft een parameter GeselecteerdeJaar en Parameters SecurityPmt/ SecurityPmt2
Doel: Stel dat de gebruiker het jaar aanpast in de URL dan moet het rapport geen data laten zien.

In de hyperlink van A-> B stellen we in bij parameter mapping:
Linkerkant GeselecteerdeJaar, Rechterkant: =Parameters!GeselecteerdeJaar.Value
Linkerkant SecurityPmt, Rechterkant: =Parameters!GeselecteerdeJaar.Value * 2

We zeggen dus dat de SecurityPmt in Rapport B het gekozen jaar is * 2. Stel dat we 2008 kiezen als jaar zal hij 4016 meesturen als securityparameter.

Vervolgens moeten we nog een controle instellen op Rapport B.
We stellen een default value in voor SecurityPmt2
=IIF(Parameters! SecurityPmt.Value / 2 = Parameters!GeselecteerdeJaar.Value,1,0).

We zeggen hier: deel de securityparameter door 2. De uitkomst moet gelijk zijn aan het gekozen jaar. Als dit waar is dan word ik waarde 1, anders word ik waarde 0.

Tot slot zetten we een beveiliging op de dataregion door de visibility aan te passen:

=IIF(Parameters! SecurityPmt2.Value=1,False,True)

Als de waarde v/d parameter 1 is moet hij NIET ONZICHTBAAR worden. Als hij 0 is wel.


Dit is dus een goede methode om extra beveiliging toe te passen bij het doorsturen van parameters. Het voorbeeld dat ik geef met *2 is natuurlijk niet voldoende. Zoek hier een mooie formule bij die niet te raden is en stuur deze mee.