Visual Guard for .NET Mike
James discovers that adding security to an application can be remarkably
easy
BY MIKE JAMES
Application security is such a problem that most developers prefer to
ignore it. If ignoring it is impossible then we often implement a custom
solution with user lists and passwords, or we simply expect the user control
provided by the operating system to do the job. What we generally end
up with is something that might appear to do the job but which is in practice
nearly impossible to administer and quite impossible to validate. Visual
Guard for .NET puts an end to this shoddy approach to security by making
it trivial to implement and by providing good administration tools, and
it works for both desktop applications and ASP.NET websites.
What is really surprising about Visual Guard for .NET is how easy it
is to add to an existing application, and how widespread and fine-grained
the resulting security is. Using reflection Visual Guard can reach inside
your code and apply access rights to individual objects, selectively disabling
features according to who is using your application – something
you might have assumed needed you to make changes to your code. Indeed
all you have to do is to add a few references to the Visual Guard assemblies
and place the occasional line of initialisation code and add a user/password
style logon form. A suitable logon form is provided for you to use, but
you can opt to create a custom form. You really don’t need to make
any changes to the architecture of your program, and you certainly don’t
need to have had security of any sort in mind when you created it.
If you do opt to use the supplied form then adding Visual Guard is just
a matter of changing the Main method, i.e. where your application starts
to read:
Dim login As
New VGLoginForm
If login.ShowDialog() = _
DialogResult.OK
Then
login.Dispose()
Application.Run(New MDIForm)
End If
This displays the login form which asks for user name and password, if
it returns the OK dialog result then it’s ok for your application
to run, i.e. the user has been authenticated. This protects access to
all of the forms in your application, and if this is all you want to do
your programming task is complete!
Visual Guard automatically detects the instantiation of forms and applies
the protection that you have selected. Protecting other types of object
is also easy, however. You simply add the VGISecurable interface and a
call to SetSecurity in the constructor of any class you want to protect.
You don’t have to implement any methods in the VGISecurable interface;
it simply determines which classes are visible in the administration console
– see later.
| You can select any form from the list to
assign permissions |
|
Once selected you can set any property
of any control on the form to any value as the result of the action |

enlarge the picture |
|

enlarge the picture |
Administration
| An administrator can manage users and assign
them appropriate permissions using the console |
|
|

enlarge the picture |
|
As soon as you have made the minor changes
needed to implement Visual Guard you could pass the task of administering
the security to someone else. They don’t even really need
to know anything about your program. In most cases, though, the
developer probably would set up an initial configuration. All administration
is performed using the Visual Guard Console. Your first task is
to set up a repository which contains all the information on the
users and their permissions. You can select either Visual Guard’s
own built in authentication, standard Windows authentication or
database authentication. Each has its advantages in different situations.
You can add users and define permission sets and roles. A permission
set is, as its name suggests, is a list of permissions that can
be applied as a whole. Permission sets can be contained within permission
sets, so making it very easy to establish a hierarchy of permissions
from none to everything. However it should be equally obvious that
you don’t have to organise things hierarchically if this doesn’t
suit.
A role is essentially a group of users all assigned the same permissions.
The idea here is that you create roles that correspond to the people
and departments within the company using the application –
so a role could be a sales person who is allowed to enter orders
but not to modify existing orders, for example. Notice that users
are defined independently from the application they are being given
access to, and each user can have more than one role – which
applies can be selected when they log on. |
Much of creating users accounts and roles is a standard and familiar
administration task and highly delegateable. The area that you might not
consider quite as delegateable is the setting up of the permissions. Not
that this is difficult, but someone who has a good knowledge of the application
has a better chance of doing a logical job of working out what should
be controlled. For example, you can determine that a particular button
on a particular form should be disabled to restrict access to some facility.
You don’t have to assign this permission and you don’t have
to group it into a permission set at this stage – simply make it
clear that this is a critical facility and needs to be controlled.
It seems almost magical that you can decide to enable or disable a button
from outside of the application, but this is the advantage of being able
to use reflection to get inside the application and get and set properties.
A permission is a set of actions, such as setting the enabled property
of a button or menu item to false or setting the visibility of a data
column to hide a field, that Visual Guard will carry out on the application
before allowing a user with that permission to work with the object. Two
types of action are supported: property actions which simply set a property
belonging to an object to a specified value; and script actions which
can be much more sophisticated. You can use either C# or VB to create
a script action. In many cases the simpler property actions are all you
need to secure an application.
Creating a new permission is just a matter of picking from a list. You
can select property or script action and Visual Guard then presents you
with a list of objects in your application – forms or web pages
are likely to be the most common object that you are going to apply permissions
to, but any class that has the VGISecurable interface applied will appear
in the list and can be modified.
Notice that not only can you disable features of the user interface leaving
them greyed out, you can also customise the interface by hiding controls.
You can also pick an event that will trigger the action. Usually this
is just before the object loads, but you can select to tie the action
to any of the usual events that an object supports, mouse down, mouse
up, etc. A further level of sophistication is that you can set a condition
that has to be true for the action to be applied. For example, you could
arrange to apply the action only if the control was visible. Finally you
can edit any of the properties of any of the controls in a form or web
page. You can set as many properties on as many controls in a single action
as you care, and the editor works in much the same way as the Property
window in Visual Studio, allowing you to select property values where
appropriate.
A script action can be set up in more or less the same way but, instead
of editing properties as the final step, you are allowed to type into
a code window. Here you can do almost anything you want to the object
in question as the method that you are typing into executes within the
application when the action is triggered. In most cases you should be
able to protect an application with just a few simple actions (e.g. disabling
buttons and hiding data and options), but it is reassuring to know that
you can do more if it’s really necessary.
Once you grasp the power of the mechanism you can’t help but wonder
if there are other uses for it as well as securing applications? It’s
a sort of aspect oriented programming that allows code injection using
visual editors – all very clever!
Once you have permissions and permission sets the only job that really
remains is working out who should be allowed to get at what. It is also
going to be easy to administer on a day-to-day basis, as long as you define
roles in a meaningful way, e.g. sales people access features that are
relevant to sales and nothing else.
Conclusion
Visual Guard for .NET is a product worth knowing about. In one easy-to-use
package it solves all your security problems almost without putting you
to any effort. It also creates a security environment that will be familiar
to network administrators and so gives you the opportunity to delegate
much of the initial set-up and all of the day-to-day administration. And
I almost forgot to mention that it has reporting, logging and auditing
facilities that should keep the admin very happy! It’s a very clever
idea, it’s well implemented and I don’t think I’ll worry
about designing security into my applications ever again.
_ In addition to his roles as hands-on developer and editor of VSJ,
Mike James acts as network administrator for a distributed team of consultants
and writers. He is therefore all too aware of security headaches.
APRIL 2008 - VISUAL SYSTEMS JOURNAL - WWW.VSJ.CO.UK
|