[This is preliminary documentation and subject to change.]
The event is raised whenever the authorization context of the policy is changed.
The following are the reasons that cause the AuthorizationContextChanged
event to be raised:
CAUTION If you change the authorization context outside of the policy (for example by adding a role to a custom principal currently associated with the policy), be sure to raise the AuthorizationContextChanged
event manually by calling the RaiseAuthorizationContextChangedEvent method.
The AuthorizationContextChanged
event handlers are not serialized along with the policy; if you're transferring policies across AppDomain or machine boundaries, the event handlers won't be marshaled and used in the remote domain.
The following example illustrates when the AuthorizationContextChanged event is raised and how to handle it:
[Visual Basic]
Imports System
Imports System.Diagnostics
Imports System.Security.Principal
Imports LaMarvin.Constable
Imports LaMarvin.Constable.Model
Imports LaMarvin.Constable.Principal
Public Class AuthorizationContextChangedEvent
Public Shared Sub Main()
' Create policy and hook the AuthorizationContextChanged event.
Dim policy As New AuthorizationPolicy
AddHandler policy.AuthorizationContextChanged, AddressOf HandleAuthorizationContextChanged
' Populate the policy with a simple model - the Author can execute the Save
' action that moves the policy from the New to the Saved state. (More precisely, the Save action
' moves the policy's subject, such as 'document', from New to the Saved state.)
policy.Roles.AddNew("Author")
' The first state added to the policy becomes the current state, so this also
' raises the AuthorizationContextChanged just like setting the CurrentState
' property directly.
Console.WriteLine("Adding first state")
policy.States.AddNew("New")
policy.States.AddNew("Saved")
policy.Actions.AddNew("Save")
policy.ActionRules.AddNew("Save", "Author", "New", "Saved")
' Setting the CurrentPrincipal raises the AuthorizationContextChanged event.
Console.WriteLine("Assigning CurrentPrincipal")
policy.CurrentPrincipal = New ExtendedPrincipal(New GenericIdentity("John"), New String() {"Author"})
Debug.Assert(policy.IsActionExecutable("Save"))
' Executing an action also raises the AuthorizationContextChanged event (even
' if no state change takes place).
Console.WriteLine("Executing Save action")
policy.ExecuteAction("Save")
' Setting the CurrentState also raises the AuthorizationContextChanged event.
Console.WriteLine("Assigning CurrentState")
policy.CurrentState = policy.States("New")
End Sub
Private Shared Sub HandleAuthorizationContextChanged(ByVal sender As Object, ByVal e As EventArgs)
Console.WriteLine(" ** Authorization context changed ** ")
End Sub
End Class
[C#]
using System;
using System.Diagnostics;
using System.Security.Principal;
using LaMarvin.Constable;
using LaMarvin.Constable.Model;
using LaMarvin.Constable.Principal;
public class AuthorizationContextChangedEvent
{
public static void Main()
{
// Create policy and hook the AuthorizationContextChanged event.
AuthorizationPolicy policy = new AuthorizationPolicy();
policy.AuthorizationContextChanged += new EventHandler(HandleAuthorizationContextChanged);
// Populate the policy with a simple model - the Author can execute the Save
// action that moves the policy from the New to the Saved state. (More precisely, the Save action
// moves the policy's subject, such as 'document', from New to the Saved state.)
policy.Roles.AddNew("Author");
// The first state added to the policy becomes the current state, so this also
// raises the AuthorizationContextChanged just like setting the CurrentState
// property directly.
Console.WriteLine("Adding first state");
policy.States.AddNew("New");
policy.States.AddNew("Saved");
policy.Actions.AddNew("Save");
policy.ActionRules.AddNew("Save", "Author", "New", "Saved");
// Setting the CurrentPrincipal raises the AuthorizationContextChanged event.
Console.WriteLine("Assigning CurrentPrincipal");
policy.CurrentPrincipal = new ExtendedPrincipal(new GenericIdentity("John"), new string[] {"Author"});
Debug.Assert(policy.IsActionExecutable("Save"));
// Executing an action also raises the AuthorizationContextChanged event (even
// if no state change takes place).
Console.WriteLine("Executing Save action");
policy.ExecuteAction("Save");
// Setting the CurrentState also raises the AuthorizationContextChanged event.
Console.WriteLine("Assigning CurrentState");
policy.CurrentState = policy.States["New"];
}
private static void HandleAuthorizationContextChanged(object sender, EventArgs e)
{
Console.WriteLine(" ** Authorization context changed ** ");
}
}
The code above produces the following console output: Adding first state ** Authorization context changed ** Assigning CurrentPrincipal ** Authorization context changed ** Executing Save action ** Authorization context changed ** Assigning CurrentState ** Authorization context changed **
AuthorizationPolicy Class | LaMarvin.Constable Namespace |