Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Аутентификация и Excel / 20 сообщений из 20, страница 1 из 1
28.11.2016, 06:14
    #39355670
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Всем добрый день.
Начну из далека. Есть сайт (WebForms), он работает и продолжает развиваться. Кто то забивает данные, а кто их видит в удобном оформлении. Короче говоря - статистика. И вот развитие дошло до этапа когда клиент хочет эти данные у себя в Excel_е видеть. И вот тут начинается....
Ругается в этом месте:
...
Imports Microsoft.Office.Interop.Excel
Imports Excel = Microsoft.Office.Interop.Excel
...
Dim excelApp As New Microsoft.Office.Interop.Excel.Application() <- на эту строку указывает.
...
Текст ошибки:
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).....

Не привожу весь текст ошибки, да бы не утомлять читателя.
Если я правильно понял гугл, ошибка говорит о том, что у клиента, который хочет перетащить данные в Excel нет прав на работу с ним (с Excel_ем). Решение напрашивается само сабой. Так возьми и дай ему эти права. Проблема вся в том, что я не знаю кому довать эти права. Наверно будете смеятся, но не торопитесь.
Начал разбираться с клиентом. Прочитать под каким именем работает клиент не получилось. User.Identity.Name и HttpContext.Current.User.Identity.Name возвращают пустое значение. И частично это объяснимо. В файле Web.config указано:
Код: plaintext
1.
2.
3.
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>    

Т.е. авторизация идет через указанный логин и пароль, должна идти...
Но на сайте эта авторизация не используется. Да! Указана! Но не используется. Сделана доморощенная авторизация. Почему?
Наверно на то есть оправдания. Количество пользователей не более двухсот. Логины и пароли назначены им один раз и по жизни. Это связано не с личными качествами клиента, а с той должностью которую он занимает. Реорганизация предприятий вещь не частая. Там и роли, там и права и обязанности все учтено. Вообщем получается так, что IIS о них ни чего не знает. Точнее знает, но они для него все на одно лицо. А вот я об этом лице ни чего не знаю. Догадываюсь, что это IUSRS (у меня IIS7.0), так называемый Anonymus . Но прочитать я его не могу. Почему? И второе. Если это анонимный пользователь, то как его тогда прописать в DCOM - MS ExcelApplication. Ведь он (DCOM) не знает о тех, кого создает IIS. Значить надо прописывать пользователя в системе (Win.server 2008), прописывать его в DCOM с правами и прописывать его в IIS как анонимного пользователя (что бы сайт продолжал работать без внесения изменений в плане авторизации и Excel мог запускаться). Подскажите правильный ход мыслей у меня? Или выдаю желаемое за действительное. Растолкуйте пожалуйста. Или куда копать?
...
Рейтинг: 0 / 0
28.11.2016, 07:45
    #39355687
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780,

Чтобы работать с Excel на стороне сервера, нельзя использовать Interop, ну категорически нельзя. Попробуй стороннюю библиотеку, например, ClosedXML ( NuGet ).

И подобных проблем у тебя больше не будет.
...
Рейтинг: 0 / 0
28.11.2016, 08:43
    #39355702
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780, "выдаю желаемое за действительное" - это мягко сказано.
Куда копать? Смотря в чём хотите разобраться.

Если в том, как работает IIS, то сюда: Application Pool Identities .
Если в том, как лучше данные выгрузить в Excel, то в направлении, предложеном hVostt.
...
Рейтинг: 0 / 0
29.11.2016, 08:16
    #39356525
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVostt, спасибо, заработало.
И если не трудно. Подскажи, как все таки посмотреть под каким именем работает пользователь?
...
Рейтинг: 0 / 0
29.11.2016, 09:54
    #39356573
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780hVostt, спасибо, заработало.
И если не трудно. Подскажи, как все таки посмотреть под каким именем работает пользователь?

Обычно любой пользователь (точнее если быть, то все) работает в приложении под именем типа "IIS AppPool\<PoolName>", где <PoolName> это наименование пула (для приложения по умолчанию, это DefaultAppPool).

Пользователь имеет очень ограниченные права, поэтому приложение не может перезаписать файлы приложения (бинарники, вьюхи, конфиги и прочее), что положительно сказывается на безопасности, и не стоит это менять без очень веской причины.

Более подробно по ссылке, которую тебе скинул skyANA, о других способах аутентификации можешь нагуглить, информации в сети предостаточно.
...
Рейтинг: 0 / 0
01.12.2016, 07:45
    #39358150
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Обращаюсь еще за помощью. Логическое продолжение начатой темы.
Файлы Excel создаются и это радует. Но моя задача: не сохраняя их на сервере отправлять клиенту. Точнее клиент на страничке жмет на кнопку и ему прилетает Excel_файл. Лучше который спросит "Открыть" "Сохранить" и т.д.
С инета перепробовал уже с десяток примеров, но как то все не работает.
Приведу последний вариант, скажите, что не так?


Protected Sub Button3_Click(sender As Object, e As System.EventArgs) Handles Button3.Click

'Создаю простую табличку (три столбца и три строки)
Using dt As New DataTable()
dt.Columns.Add("One")
dt.Columns.Add("Two")
dt.Columns.Add("Three")
dt.Rows.Add("Piter", 12, 13)
dt.Rows.Add("Nikola", 22, 23)
dt.Rows.Add("Elen", 32, 33)

'На основе полученной таблицы создаем Excel файл.
'Если раскомментировать строку <wb.SaveAs("C:\InetPub\wwwroot\Proba.xlsx")>, файл успешно сохраняется на диске (на сервере)
Using wb As New XLWorkbook()
wb.Worksheets.Add(dt, "Customers")
'wb.SaveAs("C:\InetPub\wwwroot\Proba.xlsx")

Response.Clear()
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader("content-disposition", "attachment; filename=C:\InetPub\wwwroot\Proba.xlsx")

Using memoryStream As MemoryStream = New MemoryStream()
wb.SaveAs(MemoryStream)
MemoryStream.WriteTo(Response.OutputStream)
MemoryStream.Close()
Response.End()
End Using
End Using
End Using
End Sub
...
Рейтинг: 0 / 0
01.12.2016, 08:37
    #39358171
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780,

После того, как ты сделал

wb.SaveAs(MemoryStream)

необходимо вернуть позицию текущего элемента в начало

MemoryStream.Seek(0, SeekOrigin.Begin)

Потом можно уже писать в респонз.
...
Рейтинг: 0 / 0
01.12.2016, 09:09
    #39358184
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVostt, сделал как сказал:
Код: html
1.
2.
3.
4.
5.
6.
7.
                    ...
                    ...
                    wb.SaveAs(memoryStream)
                    memoryStream.Seek(0, SeekOrigin.Begin)
                    memoryStream.WriteTo(Response.OutputStream)
                    ...
                    ...


Но, так же, ни чего не происходит. Может еще какие варианты есть?
...
Рейтинг: 0 / 0
01.12.2016, 12:16
    #39358354
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780,

Ты должен кроме ContentType ещё задать ContentLength, потому что размер данных указывается в заголовке.
...
Рейтинг: 0 / 0
01.12.2016, 12:29
    #39358366
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Библиотека от SyncFusion.

Настраивается с полпинка.

Есть примеры.

Очень удобно.

Данные с клиента (Angular) улетают на сервер и обратно прилетает уже XLSX
...
Рейтинг: 0 / 0
01.12.2016, 16:25
    #39358620
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Monochromatique,

Кендовский грид вообще эксель прям в браузере генерит, с сервака только данные поттягиваются.
...
Рейтинг: 0 / 0
01.12.2016, 16:57
    #39358680
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVosttVlad5780,

Ты должен кроме ContentType ещё задать ContentLength, потому что размер данных указывается в заголовке.
и Content-Disposition
...
Рейтинг: 0 / 0
01.12.2016, 20:30
    #39358904
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
ЕвгенийВи Content-Disposition

Этот заголовок уже есть.
...
Рейтинг: 0 / 0
02.12.2016, 09:52
    #39359112
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVostt
Ты должен кроме ContentType ещё задать ContentLength, потому что размер данных указывается в заголовке.

Совсем перестал, что-то понимать. Добавил ContentLength, как ты сказал. Ошибка при компиляции:

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
                ...
                ...
                Response.Clear()
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                Response.ContentLength = 1024
                Response.AddHeader("content-disposition", "attachment; filename=Proba.xlsx")
                ...
               ...

Error	1	'ContentLength' is not a member of 'System.Web.HttpResponse'.	


А в инете в примерах у Response есть такое свойство
...
Рейтинг: 0 / 0
02.12.2016, 11:31
    #39359184
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVosttMonochromatique,

Кендовский грид вообще эксель прям в браузере генерит, с сервака только данные поттягиваются.

Даже если клиентский комп вообще ничего про EXCEL не знает?
...
Рейтинг: 0 / 0
02.12.2016, 16:50
    #39359507
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
MonochromatiquehVosttMonochromatique,

Кендовский грид вообще эксель прям в браузере генерит, с сервака только данные поттягиваются.

Даже если клиентский комп вообще ничего про EXCEL не знает?

Да. Эксель генерится прямо в браузере средствами JavaScript без всяких сильверлайтов, флешей и апплетов. Настоящий эксель, а не CSV.
...
Рейтинг: 0 / 0
02.12.2016, 16:52
    #39359510
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780Совсем перестал, что-то понимать. Добавил ContentLength, как ты сказал. Ошибка при компиляции:

Код: c#
1.
Response.AppendHeader("Content-Length", РазмерФайла);
...
Рейтинг: 0 / 0
06.12.2016, 12:21
    #39361122
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVostt, добавил ("Content-Length", РазмерФайла), результат тот же. hVostt, может у тебя есть какой нибудь рабочий пример? Можешь выложить? Только пожалуйста не ссылки на ресурсы. Я их уже с сотню перепробовал.
...
Рейтинг: 0 / 0
06.12.2016, 12:48
    #39361142
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
Vlad5780,

вот из какого-то старого простенького проекта, это точно работало

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        [HttpGet]
        public ActionResult Download(long id)
        {
            var userId = this.User.Identity.GetUserId();
            var entity = this.Service
                .GetAttachmentQuery(userId, AccessMode.Read)
                .SingleOrDefault(p => p.Id == id);
            
            if (entity == null)
                return NotFound(nameof(AttachmentEntity), id);

            var manager = this.Service.GetAttachmentManager();

            Response.Buffer = false;
            Response.BufferOutput = false;
            Response.ContentType = entity.MimeType;
            Response.AppendHeader("Content-Length", entity.FileSize.ToRaw());
            Response.AppendHeader("content-disposition", "attachment; filename=" + entity.FileName);

            manager.Download(entity, Response.OutputStream);

            return new EmptyResult();
        }



manager.Download записывает содержимое файла в Response.OutputStream
...
Рейтинг: 0 / 0
27.12.2016, 09:13
    #39375786
Vlad5780
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аутентификация и Excel
hVostt, спасибо большое за помощь. Все получилось. Оказывается оно давно заработало. Проблема была в том, что кнопка для экспорта в Excel находилась внутри UpdatePanel и нужно было всего лишь задать PostBackTrigger. Чуть крыша не поехала пока до причины добрался.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Аутентификация и Excel / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]