I have a workflow running when an item is adding to a document library. In this workflow, I have a code activity that I am attempting to set permissions to the list item. I am trying to break inheritance, and set some specific permissions. I've done this before so I'm not concerned with the code for this.
The issue that I am running in to is when checking the item back in to SharePoint. When I run checkin, I get the generic error saying The security validation for this page is invalid. There is no exception thrown in the code and I can step over it without issue. However, after this code block, the error is in the logs and the workflow says Failed to start (retrying). This workflow has worked numerous times prior to me adding this code activity.
Here is the code block I am working with (simplified, but non-functioning):
workflowProperties.Web.AllowUnsafeUpdates = true;
SPListItem item = workflowProperties.Item;
item.File.CheckOut();
item.BreakRoleInheritance(false);
item.SystemUpdate(false);
item.File.CheckIn("permissions updated");
workflowProperties.Web.AllowUnsafeUpdates = false;
Any ideas? I've tried running an UndoCheckout() on the File, but the same result occurs.
Edit 1
The reason I was performing the checkout is that I found my workflow would end up with 'Failed on start (retrying)' after the item permissions have been set. The logs say
Microsoft.SharePoint.SPException: The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation again. ---> System.Runtime.InteropServices.COMException (0x8102006D): The security validation for this page is invalid. Click Back in your Web browser, refresh the page, and try your operation
Edit 2
Ok, I can break role inheritance fine without checking in/out. The reason I had all of that in there was because I am attempting to assign new permissions, which I think requires the update. I had stripped that out when posting. This is a records library, and items are immediately declared records. That's the need for the check in/out.
Edit 3
I ended up moving this to an event receiver. Worked as expected.