Создание документов Серверная часть Sitefinity без прав администратора

У меня возникла проблема с API-интерфейсом telerik sitefinity. Я пытаюсь создать сертификаты PDF в бэкэнде и опубликовать их в библиотеке документов. Вот мой код того, как я создаю и публикую сертификаты.

   byte[] byteArray = reportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out fileNameExtension, out streamids, out warnings);

                var documentLibraryList = SitefinityHelper.GetDocumentLibraries();

                string certificationLibraryTitle = ConfigurationManager.AppSettings["CertificationLibrary"].ToString().ToUpper();

                DocumentLibrary certLibrary = null;

                //Make sure the parent library exists before doing anything else.
                foreach (DocumentLibrary library in documentLibraryList)
                {
                    if (library.Title.ToUpper() == certificationLibraryTitle.ToUpper())
                    {
                        certLibrary = library;
                        break;
                    }
                }
                //If not null, good to create the pdf cert, but need to check for previous ones.
                if (certLibrary != null)
                {
                    try
                    {


                        string pdfCertificationTitle = currentUser.UserName + "_"+ "Certification_" + moduleViewModel.ExamID.ToString();

                        UserCertifications previousCertifcationRecord = certBo.GetUserCertificationByTitle(pdfCertificationTitle);

                        if (previousCertifcationRecord == null)
                        {
                            //No previous record exists, create the new record. 

                            MemoryStream memStream = new MemoryStream(byteArray);

                            Guid documentID = Guid.NewGuid();

                            string format = ".pdf";

                            LibrariesManager librariesManager = LibrariesManager.GetManager();

                            Document pdfDocument = librariesManager.CreateDocument(documentID);

                            DocumentLibrary parentLibrary = librariesManager.GetDocumentLibraries().Where(d => d.Id == certLibrary.Id).SingleOrDefault();

                            pdfDocument.Parent = parentLibrary;

                            pdfDocument.Title = pdfCertificationTitle;
                            pdfDocument.DateCreated = DateTime.UtcNow;
                            pdfDocument.PublicationDate = DateTime.UtcNow;
                            pdfDocument.LastModified = DateTime.UtcNow;
                            pdfDocument.UrlName = Regex.Replace(pdfCertificationTitle.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");

                            librariesManager.RecompileAndValidateUrls(pdfDocument);
                            librariesManager.Upload(pdfDocument, memStream, format);

                            librariesManager.SaveChanges();

                            var bag = new Dictionary<string, string>();
                            bag.Add("ContentType", typeof(Document).FullName);

                            WorkflowManager.MessageWorkflow(documentID, typeof(Document), null, "Publish", false, bag);

                            string fullUrl = SitefinityHelper.GetDocumentUrl(pdfCertificationTitle);

                            //Save the certification to the DB.
                            certBo.InsertNewUserCertification(pdfCertificationTitle, fullUrl, currentUser.UserID);
                        }
                    }

                    catch (Exception ex)
                    {
                        ExceptionManager.LogException(this, ex);
                    }
                }

Сообщение об исключении, с которым я сталкиваюсь:

Telerik.Sitefinity.Libraries.Model.DocumentLibrary, Telerik.Sitefinity.Model не был предоставлен ManageDocument в документе для участников с идентификаторами

Однако это исключение возникает только тогда, когда я пытаюсь создать и опубликовать документ в формате PDF, когда я вошел в систему как пользователь, не являющийся администратором/не серверной частью. Когда я вхожу в систему как бэкэнд-пользователь, этот код выполняется просто отлично. Я считаю, что должен быть способ установить разрешение, чтобы предоставить пользователям, не являющимся бэкэнд, надлежащие полномочия для создания документов, но я просто не знаю, как это сделать, и поиск в Google не дал многого. Если бы кто-нибудь мог помочь, я был бы очень признателен.

Это использует Sitefinity версии 6.2


person zic10    schedule 06.05.2014    source источник


Ответы (1)


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

        LibrariesManager librariesManager = LibrariesManager.GetManager();

        using(new ElevatedModeRegion(librariesManager))
        {

            Document pdfDocument = librariesManager.CreateDocument(documentID);

            DocumentLibrary parentLibrary = librariesManager.GetDocumentLibraries().Where(d => d.Id == certLibrary.Id).SingleOrDefault();

            pdfDocument.Parent = parentLibrary;

            pdfDocument.Title = pdfCertificationTitle;
            pdfDocument.DateCreated = DateTime.UtcNow;
            pdfDocument.PublicationDate = DateTime.UtcNow;
            pdfDocument.LastModified = DateTime.UtcNow;
            pdfDocument.UrlName = Regex.Replace(pdfCertificationTitle.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");

            librariesManager.RecompileAndValidateUrls(pdfDocument);
            librariesManager.Upload(pdfDocument, memStream, format);

            librariesManager.SaveChanges();

            var bag = new Dictionary<string, string>();
            bag.Add("ContentType", typeof(Document).FullName);

                            bool suppressSecurityChecks = WorkflowManager.GetManager().Provider.SuppressSecurityChecks;
            try
            {
                WorkflowManager.GetManager().Provider.SuppressSecurityChecks = true;
                WorkflowManager.MessageWorkflow(documentID, typeof(Document), null, "Publish", false, bag);

            }
            catch (Exception ex)
            {

            }
            finally 
            {
                WorkflowManager.GetManager().Provider.SuppressSecurityChecks = suppressSecurityChecks;
            }  
      }
person Radoslav Georgiev    schedule 07.05.2014
comment
Спасибо за ответ. У меня проблема со вторым блоком использования. В частности, к Telerik.Sitefinity.Workflow.WorkFlowManager.MessageWorkflow нельзя получить доступ с помощью ссылки на экземпляр, вместо этого укажите имя типа. - person zic10; 07.05.2014
comment
Я попытался с вышеуказанным редактированием. Перечисленное выше исключение по-прежнему выдается. - person zic10; 14.05.2014