Use GetAppOnlyContext inside CreateRemoteEventReceiverClientContext inside my remote event receiver

Steel Contributor

I am working on a remote event receiver for our SharePoint online site,and i am running the remote event receiver under the current user permission using ClientContext context = TokenHelper.CreateRemoteEventReceiverClientContext(properties) as follow:-

 

 

public void ProcessOneWayEvent(SPRemoteEventProperties properties)
        {

           
                if (properties.EventType.ToString().ToLower() == "itemadded")
                {
                    var prop = properties;

                    var listItemID = properties.ItemEventProperties.ListItemId;
                    var listTitle = properties.ItemEventProperties.ListTitle;
                    using (ClientContext context = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
                    {

 

 

Now inside my code, and i am setting a unique permission for the created list item, and since contributor users do not have permission to set list item to have unique permission, so i am trying to run this peace of code using the application context (GetAppOnlyContext ), now i try this :-

 

 

public void ProcessOneWayEvent(SPRemoteEventProperties properties)
        {

           
                if (properties.EventType.ToString().ToLower() == "itemadded")
                {
                    var prop = properties;

                    var listItemID = properties.ItemEventProperties.ListItemId;
                    var listTitle = properties.ItemEventProperties.ListTitle;
                    using (ClientContext context = TokenHelper.CreateRemoteEventReceiverClientContext(properties))
                    {
//code goes here 
                            using (ClientContext context2 = Helpers.GetAppOnlyContext(properties.ItemEventProperties.WebUrl))
                            {
                                FieldUserValue creator2 = listItem["Author"] as FieldUserValue;
                                listItem2.BreakRoleInheritance(false, false);
                                listItem2.RoleAssignments.Add(context.Web.EnsureUser(creator2.LookupValue), new RoleDefinitionBindingCollection(context) { contributeDef });
                                listItem2.RoleAssignments.Add(context.Site.RootWeb.SiteGroups.GetByName("Risk Users"), new RoleDefinitionBindingCollection(context) { readerDef });
                                listItem2.RoleAssignments.Add(context.Site.RootWeb.SiteGroups.GetByName("Risk Admins"), new RoleDefinitionBindingCollection(context) { contributeDef });
                                listItem2.Update();
                                context2.ExecuteQuery();
                            }
                    }

 

 

but i am getting this error:-

 

Access denied. You do not have permission to perform this action or access this resource.

any advice on how i can run certain peace of code under the app context while the other code using the current user context? in other words to have 2 contexts inside my remote event receiver; CreateRemoteEventReceiverClientContext and inside it to have a context which runs under GetAppOnlyContext

0 Replies