DekGenius.com
[ Team LiB ] Previous Section Next Section

Recipe 14.11 Verifying that an Assembly Has Been Granted Specific Permissions

Problem

When your assembly requests optional permissions (such as asking for disk access to enable users to export data to disk as a product feature) using the SecurityAction.RequestOptional flag, it might or might not get those permissions. Regardless, your assembly will still load and execute. You need a way to verify whether your assembly actually obtained those permissions. This can help prevent many security exceptions from being thrown. For example, if you optionally requested read/write permissions on the registry, but did not receive them, you could disable the user interface controls that are used to read and store application settings in the registry.

Solution

Check to see if your assembly received the optional permissions using the SecurityManager.IsGranted method like this:

using System;
using System.Text.RegularExpressions;
using System.Web;
using System.Net;
using System.Security;

Regex regex = new Regex(@"http://www\.oreilly\.com/.*");
WebPermission webConnectPerm = new WebPermission(NetworkAccess.Connect,regex);
if(SecurityManager.IsGranted(webConnectPerm))
{
   // connect to the oreilly site
}

This code would set up a Regex for the O'Reilly web site and then use it to create a WebPermission for connecting to that site and all sites containing the www.oreilly.com string. We would then check the WebPermission against the SecurityManager to see whether we have the permission to do this.

Discussion

The IsGranted method is a lightweight way of determining whether permission is granted for an assembly without incurring the full stackwalk that a Demand would give you. This method can be helpful not only in determining the permissions available at runtime, but for helping performance by not incurring the stackwalk from a Demand as well. The downside to this approach is that the code would still be subject to a luring attack if Assert were misused, so you need to consider where the call to IsGranted is being made in the overall scheme of your security.

Some of the reasons you might design an assembly to have optional permissions is for deployment in different customer scenarios. In some scenarios (like desktop applications), it might be acceptable to have an assembly that can perform more robust actions (talk to a database, create network traffic via HTTP, etc.). In other scenarios, you would defer these actions if the customer did not wish to grant enough permissions for these extra services to function.

See Also

See the "WebPermission Class," "SecurityManager Class," and "IsGranted Method" topics in the MSDN documentation.

    [ Team LiB ] Previous Section Next Section