ImageGear.ART can be used in a variety of architectural solutions and sometimes it is necessary to provide access to the same ART page for different users with different access levels. ImageGear does not provide a complete solution for access control; instead, it provides a basic set of tools required to implement access control.
By default, access control functionality is disabled. In order to enable it, you have to implement your own class inherited from ImGearARTAccessController and initialize the ImGearARTPage.AccessController property.
Access control can be applied to the following ART classes: ImGearARTPage, ImGearARTGroup, and annotation classes derived from the ImGearARTMark class. All these classes have a public property AccessController, but only the ART page allows you to set a value of the AccessController. For ART Groups and Annotations, this property is initialized internally when a corresponding object is added to the page and cannot be changed directly.
The ImGearARTAccessController class defines a few abstract overloaded methods (bool OnIsAccessAllowed), that you have to implement in your own class. These methods will be called each time the page / group / annotations are accessed. If access is not available, the OnIsAccessAllowed method has to return false. If the method returns true, it means that access is allowed and the corresponding operation will be performed in a regular way, but if the method returns false, an ImGearARTAccessDenied exception will be thrown.
If the exception throwing is undesirable, then before accessing the methods/properties of the ART object, you can explicitly call the IsAccessAllowed method of the access controller and ensure that the current user has the necessary rights:
| C# Example | 
 Copy Code   | 
if (artPage.AccessController.IsAccessAllowed(ImGearARTAccessRights.View))
{
    string author = artPage.Author;
    //… 
} | 
  
 
| VB.NET Example | 
 Copy Code   | 
If artPage.AccessController.IsAccessAllowed(ImGearARTAccessRights.View) Then
            
    Dim author As String = artPage.Author
    '…
End If | 
  
Access Rights
ImageGear defines the following access rights:
 | 
 | 
| 
 Right  | 
 Description  | 
| View | 
 Controls if an object can be viewed  | 
| Create | 
 Controls if an object can be created  | 
| Delete | 
 Controls if an object can be deleted  | 
| Edit | 
 Controls if an object properties can be changed  | 
| Resize | 
 Controls if a mark object can be resized  | 
| Move | 
 Controls if a mark object can be moved  | 
| Export | 
 Controls if a mark object can be exported  | 
Access Token
An access token is an object that describes the current security context of the ART Page. The information that token contains varies on implementation, as a rule it includes identity and privileges of the current user.
ImageGear does not provide implementation of an access token, instead there is a defined, empty abstract class ImGearARTAccessToken. The implementation of an access token should inherit the ImGearARTAccessToken class in order to be able to use it with the ImGearARTAccessController.
The ImGearARTAccessController class contains the abstract property AccessToken which should be used to switch the current user of the ART Page:
| C# Example | 
 Copy Code   | 
ImGearARTAccessToken accessToken = _userDataBase.GetAccessToken("User name #1");
if (accessToken != null)
{
    _artPage.AccessController.AccessToken = accessToken;
    // ...
} | 
 
| VB.NET Example | 
 Copy Code   | 
Dim accessToken As ImGearARTAccessToken = _userDataBase.GetAccessToken("User name #1")
If accessToken IsNot Nothing Then
    _artPage.AccessController.AccessToken = accessToken
    ' ...
End If | 
 
There are no specific requirements for the access token implementation. This abstraction was introduced to simplify switching between users and is not used internally by ImageGear. 
 
Secure Object Data
We use the term “secure object” to refer to any object in ImageGear ART in which the access must be limited: ImGearARTPage class, ImGearARTGroup class, and any annotation class derived from ImGearARTMark. 
Sometimes it may be necessary to associate some data with a secure object which can be used by the AccessController. For this purpose, ImGearARTPage / ImGearARTGroup / ImGearARTMark classes have the SecureObjectData property of ImGearARTSecureObjectData type.
Examples
Access Controller Implementation Example:
| C# Example | 
 Copy Code   | 
class UserAccessToken : ImGearARTAccessToken
{
    private ImGearARTAccessRights _accessRights;
    public UserAccessToken(ImGearARTAccessRights accessRights)
    {
        _accessRights = accessRights;
    }
    public ImGearARTAccessRights UserRights
    {
        get
        {
            return _accessRights;
        }
    }
}
class SimpleAccessController : ImGearARTAccessController
{
    public override ImGearARTAccessToken AccessToken
    {
        get;
        set;
    }
    protected override bool OnIsAccessAllowed(ImGearARTAccessRights accessRights)
    {
        UserAccessToken userAccessToken = this.AccessToken as UserAccessToken;
        if (userAccessToken != null)
        {
            // compare current User Access Rights and required rights
            return (userAccessToken.UserRights & accessRights) == accessRights;
        }
        return false;
    }
    protected override bool OnIsAccessAllowed(
        ImGearARTAccessRights accessRights, ImGearARTGroup group)
    {
        // allow access for any user to default Group, and disable access to other groups
        if (group.Name == "[Untitled]")
            return true;
        return false;
    }
    protected override bool OnIsAccessAllowed(
        ImGearARTAccessRights accessRights, ImGearARTMark mark)
    {
        UserAccessToken userAccessToken = this.AccessToken as UserAccessToken;
        if (userAccessToken != null)
        {
            // compare current User Access Rights and required rights
            return (userAccessToken.UserRights & accessRights) == accessRights;
        }
        return false;
    }
} | 
 
| VB.NET Example | 
 Copy Code   | 
Class UserAccessToken
    Inherits ImGearARTAccessToken
    Private _accessRights As ImGearARTAccessRights
    Public Sub New(accessRights As ImGearARTAccessRights)
        _accessRights = accessRights
    End Sub
    Public ReadOnly Property UserRights() As ImGearARTAccessRights
        Get
            Return _accessRights
        End Get
    End Property
End Class
Class SimpleAccessController
    Inherits ImGearARTAccessController
    Public Overrides Property AccessToken() As ImGearARTAccessToken
        Get
            Return _accessToken
        End Get
        Set(value As ImGearARTAccessToken)
            _accessToken = value
        End Set
    End Property
    Private _accessToken As ImGearARTAccessToken
    Protected Overrides Function OnIsAccessAllowed(accessRights As ImGearARTAccessRights) As Boolean
        Dim userAccessToken As UserAccessToken = TryCast(Me.AccessToken, UserAccessToken)
        If userAccessToken IsNot Nothing Then
            ' compare current User Access Rights and required rights
            Return (userAccessToken.UserRights And accessRights) = accessRights
        End If
        Return False
    End Function
    Protected Overrides Function OnIsAccessAllowed(accessRights As ImGearARTAccessRights, group As ImGearARTGroup) As Boolean
        ' allow access for any user to default Group, and disable access to other groups
        If group.Name = "[Untitled]" Then
            Return True
        End If
        Return False
    End Function
    Protected Overrides Function OnIsAccessAllowed(accessRights As ImGearARTAccessRights, mark As ImGearARTMark) As Boolean
        Dim userAccessToken As UserAccessToken = TryCast(Me.AccessToken, UserAccessToken)
        If userAccessToken IsNot Nothing Then
            ' compare current User Access Rights and required rights
            Return (userAccessToken.UserRights And accessRights) = accessRights
        End If
        Return False
    End Function
End Class | 
 
Access Controller usage Example:
| C# Example | 
 Copy Code   | 
void Example()
{
    // View (read-only) access rights
    UserAccessToken user1 = new UserAccessToken(ImGearARTAccessRights.View);
            
    // View & Edit & Create (Edit right does not include Move & Resize) rights
    UserAccessToken user2 = new UserAccessToken(
        ImGearARTAccessRights.View & 
        ImGearARTAccessRights.Edit & 
        ImGearARTAccessRights.Create);
    // create art page and access controller
    ImGearARTPage artPage = new ImGearARTPage();
    artPage.AccessController = new SimpleAccessController();
    // switch access controller to user1
    artPage.AccessController.AccessToken = user1;
    try
    {
        // try to add mark
        ImGearARTLine line = new ImGearARTLine(
            new ImGearPoint(),
            new ImGearPoint(),
            new ImGearRGBQuad());
        // Access Denied exception is thrown, because 'user1' 
        // does not have 'Create' right
        artPage.AddMark(line, ImGearARTCoordinatesType.DEVICE_COORD);
    }
    catch (ImGearARTAccessDeniedException)
    {
    }
    // switch access controller to user2
    artPage.AccessController.AccessToken = user2;
    ImGearARTLine line2 = new ImGearARTLine(
        new ImGearPoint(), new ImGearPoint(), new ImGearRGBQuad());
    // OK, 'user2' has Create right
    artPage.AddMark(line2, ImGearARTCoordinatesType.DEVICE_COORD);
} | 
 
| VB.NET Example | 
 Copy Code   | 
Private Sub Example()
    ' View (read-only) access rights                                                                                            
    Dim user1 As New UserAccessToken(ImGearARTAccessRights.View)
    ' View & Edit & Create (Edit right does not include Move & Resize) rights                                                   
    Dim user2 As New UserAccessToken(ImGearARTAccessRights.View And ImGearARTAccessRights.Edit And ImGearARTAccessRights.Create)
    ' create art page and access controller                                                                                     
    Dim artPage As New ImGearARTPage()
    artPage.AccessController = New SimpleAccessController()
    ' switch access controller to user1                                                                                         
    artPage.AccessController.AccessToken = user1
    Try
        ' try to add mark                                                                                                       
        Dim line As New ImGearARTLine(New ImGearPoint(), New ImGearPoint(), New ImGearRGBQuad())
        ' Access Denied exception is thrown, because 'user1'                                                                    
        ' does not have 'Create' right                                                                                          
        artPage.AddMark(line, ImGearARTCoordinatesType.DEVICE_COORD)
    Catch generatedExceptionName As ImGearARTAccessDeniedException
    End Try
    ' switch access controller to user2                                                                                         
    artPage.AccessController.AccessToken = user2
    Dim line2 As New ImGearARTLine(New ImGearPoint(), New ImGearPoint(), New ImGearRGBQuad())
    ' OK, 'user2' has Create right                                                                                              
    artPage.AddMark(line2, ImGearARTCoordinatesType.DEVICE_COORD)
End Sub |