В доступе отказано в Office 365 / SharePoint Online с учетной записью глобального администратора

Я схожу с ума, так как два дня решаю вопрос. Проблема в;

Я делаю консольное приложение, которое общается с SharePoint Online, используя учетную запись глобального администратора (та, которая была указана как администратор при создании новой подписки). Я пытаюсь достичь того, что хочу добавить настраиваемое действие с использованием CSOM в каждое семейство сайтов и дочерний сайт Office 365. Этот код работает нормально, за исключением корневого семейства сайтов, которое предварительно создается Office 365 при регистрации (т. Е. https://xyz.sharepoint.com)

Для любого клиента для корневого семейства сайтов это дает мне ошибку ниже;

{"SchemaVersion": "15.0.0.0", "LibraryVersion": "16.0.3912.1201", "ErrorInfo": {"ErrorMessage": "Доступ запрещен. У вас нет разрешения на выполнение этого действия или доступ к этому ресурсу.", «ErrorValue»: нуль, «TraceCorrelationId»: «2a47fd9c-c07b-1000-cfb7-cdffbe3ab83a», «ErrorCode»: - 2147024891, «ErrorTypeName»: «System.UnauthorizedAccessException»}, «cdffbe3b3b3d-2a -cfb7-cdffbe3ab83a "}

Теперь пользователь является глобальным администратором. Я также снова добавил этого пользователя в качестве администратора семейства сайтов.

Тот же фрагмент кода отлично работает с другими семействами сайтов (семейство сайтов поиска, любое новое семейство сайтов ...).

вот код;

        using (ClientContext spcollContext = new ClientContext(web.Url))
        {
            SecureString passWord = new SecureString();
            foreach (char c in strAdminPassword.ToCharArray()) passWord.AppendChar(c);
            SharePointOnlineCredentials creds = new SharePointOnlineCredentials(strAdminUser, passWord);
            spcollContext.Credentials = creds;
            Web currentweb = spcollContext.Web;
            spcollContext.Load(currentweb);
            spcollContext.ExecuteQuery();

       //     authCookie = creds.GetAuthenticationCookie(new Uri(web.Url));

            var existingActions2 = currentweb.UserCustomActions;
            spcollContext.Load(existingActions2);
            spcollContext.ExecuteQuery();
            var actions2 = existingActions2.ToArray();
            foreach (var action in actions2)
            {
                if (action.Description == "CustomScriptCodeForEachsite" &&
                    action.Location == "ScriptLink")
                {
                    action.DeleteObject();
                    spcollContext.ExecuteQuery();
                }
            }

            var newAction2 = existingActions2.Add();
            newAction2.Description = "CustomScriptCodeForEachsite";
            newAction2.Location = "ScriptLink";

            newAction2.ScriptBlock = scriptBlock;
            newAction2.Update();
            spcollContext.Load(currentweb, s => s.UserCustomActions);
            spcollContext.ExecuteQuery(); // GETTING ERROR ON THIS LINE. 
        }

Примечание. Вышеупомянутая ошибка - это следы Fiddler.


person Nitin Khubani    schedule 16.04.2015    source источник
comment
Можете ли вы пойти и отследить оставшуюся часть сообщения об ошибке на основе TraceCorrelationId из UnauthorizedException. Это в деталях исключения: 2a47fd9c-c07b-1000-cfb7-cdffbe3ab83a   -  person Glenn Ferrie    schedule 16.04.2015
comment
Об этом я могу обратиться к команде MS Online. Позвольте мне задать их параллельно. Спасибо!   -  person Nitin Khubani    schedule 16.04.2015
comment
они всегда помогали с моими проблемами разработчика, когда они возникали.   -  person Glenn Ferrie    schedule 16.04.2015


Ответы (3)


Скорее всего, такое поведение вызвано функция настраиваемого сценария, в основном проблема возникает, когда функция настраиваемого сценария имеет значение выключен

Как проверить?

Вы можете проверить разрешения сайта с помощью следующего консольного приложения:

using (var ctx = GetContext(webUri, userName, password))
{
    var rootWeb = ctx.Site.RootWeb;
    ctx.Load(rootWeb, w => w.EffectiveBasePermissions);
    ctx.ExecuteQuery();
    var permissions = rootWeb.EffectiveBasePermissions;
    foreach (var permission in Enum.GetValues(typeof(PermissionKind)).Cast<PermissionKind>())
    {
        var permissionName = Enum.GetName(typeof(PermissionKind), permission);
        var hasPermission = permissions.Has(permission);
        Console.WriteLine("Permission: {0}, HasPermission: {1}", permissionName, hasPermission);
    }   
}

куда

public static ClientContext GetContext(Uri webUri, string userName, string password)
{
    var securePassword = new SecureString();
    foreach (var ch in password) securePassword.AppendChar(ch);
    return new ClientContext(webUri) {Credentials = new SharePointOnlineCredentials(userName, securePassword)};
}

Когда SP.PermissionKind.AddAndCustomizePages установлен на Ложь, при добавлении пользовательского действия возникает ошибка Доступ запрещен.

введите описание изображения здесь

Решение

Согласно Включите или отключите возможности создания сценариев:

Для сайтов, созданных самостоятельно, настраиваемые сценарии отключены по умолчанию.

Solution: enable Allow users to run custom scripts on self-service created sites

Включение или отключение сценариев из центра администрирования SharePoint

  1. Войдите в Office 365, используя свою рабочую или учебную учетную запись.
  2. Перейдите в центр администрирования SharePoint.
  3. Выберите "Настройки".
  4. В разделе Custom Script выберите:

    • Запретить пользователям запускать настраиваемый сценарий на личных сайтах или Разрешить пользователям запускать настраиваемый сценарий на личных сайтах.

    • Запретить пользователям запускать настраиваемый сценарий на сайтах, созданных пользователями, или Разрешить пользователям запускать настраиваемый сценарий на сайтах, созданных самостоятельно.

    введите описание изображения здесь

  5. Выберите ОК. Изменения вступят в силу около 24 часов.

Поскольку для вступления в силу любых изменений в настройках сценариев, внесенных через центр администрирования SharePoint Online, может потребоваться до 24 часов, вы можете включить сценарии для определенного семейства веб-сайтов немедленно через CSOM. API (SDK клиентских компонентов SharePoint Online), как показано ниже. :

public static void DisableDenyAddAndCustomizePages(ClientContext ctx, string siteUrl)
{
    var tenant = new Tenant(ctx);
    var siteProperties = tenant.GetSitePropertiesByUrl(siteUrl, true);
    ctx.Load(siteProperties);
    ctx.ExecuteQuery();

    siteProperties.DenyAddAndCustomizePages = DenyAddAndCustomizePagesStatus.Disabled;
    var result = siteProperties.Update();
    ctx.Load(result);
    ctx.ExecuteQuery();
    while (!result.IsComplete)
    {
        Thread.Sleep(result.PollingInterval);
        ctx.Load(result);
        ctx.ExecuteQuery();
    }
}

использование

using (var ctx = GetContext(webUri, userName, password))
{
    using (var tenantAdminCtx = GetContext(tenantAdminUri, userName, password))
    {                  
         DisableDenyAddAndCustomizePages(tenantAdminCtx,webUri.ToString());
    }
    RegisterJQueryLibrary(ctx);
 }

куда

public static void RegisterJQueryLibrary(ClientContext context)
{
    var actions = context.Site.UserCustomActions;
    var action = actions.Add();
    action.Location = "ScriptLink";
    action.ScriptSrc = "~SiteCollection/Style Library/Scripts/jQuery/jquery.min.js";
    action.Sequence = 1482;
    action.Update();
    context.ExecuteQuery();
}
person Vadim Gremyachev    schedule 19.04.2015
comment
Отличный ответ! Да, это проблема, приятель. В любом случае я могу включить его с помощью С #? Я видел msdn.microsoft.com/en-us/library/ говорит, что свойство есть. Как я могу включить его с помощью кода? - person Nitin Khubani; 20.04.2015

Если у вас нет времени на CSOM, как описано Вадимом, на странице также есть ссылка на сценарий PowerShell, который вы можете использовать:

Set-SPOsite <SiteURL> -DenyAddAndCustomizePages 0

Но обратите внимание, что SiteUrl должен быть адресом администратора. Если ваш клиент https://mysite.sharepoint.com, вы используете URL-адрес https://mysite-admin.sharepoint.com"

В нашем случае мы были в разгаре развертывания, когда это произошло, и не могли ждать 24 часа (или даже один час!), Чтобы продолжить. В наших тестовых семействах сайтов все было хорошо, но при развертывании в корне клиента мы обнаружили ошибку, описанную выше, и этот сценарий исправил ее. Судя по всему, эта функция отключена по умолчанию в корне клиента.

Текущий сайт не является сайтом администрирования клиента

Включение или отключение сценариев

person SouthShoreAK    schedule 15.09.2016

Моим первым ответом было бы то, что вам не следует добавлять CustomAction в коде на лету. Тем не менее, я уверен, что у вас есть веская причина для этого.

Попытайтесь установить флаг AllowUnsafeUpdates на SPWeb на true, как только вы укажете currentWeb. Не забудьте также установить его обратно на false после того, как вы вызовете последний ExecuteQuery()

По умолчанию AllowUnsafeUpdates равно false. Он используется для блокировки атак с использованием межсайтовых сценариев.

https://msdn.microsoft.com/en-us/library/Microsoft.SharePoint.SPWeb_properties.aspx

person Glenn Ferrie    schedule 16.04.2015
comment
Спасибо за обновление, GlennFerrie, однако AllowUpsafeUpdates - это код полного доверия, а не часть CSOM. Я задаю вопрос для sharepoint ONLINE и CSOM. - person Nitin Khubani; 16.04.2015
comment
Также главное, чтобы ОДИН код работал и для других семейств сайтов. Если бы это была проблема, то ошибка была бы постоянной для всех сайтов. - person Nitin Khubani; 16.04.2015