Whenever we start the workflow programmatically using SPWorkflowManager.StartWorkflow(), it throws security validation exception. Since we run with elevated previleges, the way to fix is to call SPUtility.ValidateFormDigest(). I am assuming you will get the ListItem by using GetSPListItem().
var item = GetSPListItem()
if (item != null)
{
SPWeb web = item.Web;
SPWorkflowManager workflowManager = item.Web.Site.WorkflowManager;
var wfa = (from SPWorkflowAssociation spwfa in item.ParentList.WorkflowAssociations
where
spwfa.Name == UserProfileConstants.UserProfileApprovalWorkflow
&& spwfa.Enabled == true
select spwfa).FirstOrDefault();
if (wfa != null)
{
try
{
SPUtility.ValidateFormDigest();
web.AllowUnsafeUpdates = true;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
workflowManager.StartWorkflow(item, wfa, wfa.AssociationData, true);
});
}
catch (Exception ex)
{
item.Delete();
throw;
}
finally
{
web.AllowUnsafeUpdates = false;
}
}
else
{
item.Delete();
this.DisplayErrorMessage("No Active workflows found.");
}
}