Nano Hash - криптовалюты, майнинг, программирование

Использование Datazen в iframe с внешней аутентификацией

Мне удалось успешно использовать внешнюю аутентификацию с datazen через HTTPWEBREQUEST из кода программной части с VB.NET, но я не понимаю, как использовать это с iframe или даже с div. Я думаю, может быть, файлы cookie/токен авторизации не отслеживают iframe? Datazen начинает загружаться правильно, но затем перенаправляет обратно на страницу входа, как будто он не проходит аутентификацию. Не уверен, как сделать эту часть, этот материал довольно нов для меня, и любая помощь будет принята с благодарностью!

К ошибкам веб-страницы относятся:

-OPTIONS url send @ jquery.min.js:19b.extend.ajax @ jquery.min.js:19Viewer.Controls.List.ajax @ Scripts?page=list:35Viewer.Controls.List.load @ Scripts? page=list:35h.callback @ Scripts?page=list:35 VM11664 about:srcdoc:1

XMLHttpRequest не может загрузить http://datazenserver.com/viewer/jsondata. Ответ на предварительную проверку содержит неверный код состояния HTTP 405Scripts?page=list:35.

load(): не удалось загрузить данные JSON. V…r.C…s.List {версия: «2.0», описание: «KPI и загрузчик и контроллер списка панелей мониторинга», URL: «/viewer/jsondata», индекс: «/viewer/», json: null…} (анонимно function) @ Scripts?page=list:35c @ jquery.min.js:4p.fireWith @ jquery.min.js:4k @ jquery.min.js:19r @ jquery.min.js:19 Scripts?page=list: 35

GET http://datazenserver.com/viewer/login 403 (Запрещено) (анонимная функция) @ Scripts?page=list:35c @ jquery.min.js:4p.fireWith @ jquery.min.js:4k @ jquery.min.js:19r @ jquery.min.js:19

            ' ''//////////////////////////////////
            Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create("http://datazenserver.com/"), HttpWebRequest)
            myHttpWebRequest.CookieContainer = New System.Net.CookieContainer()

            Dim authInfo As String = Session("Email")


            myHttpWebRequest.AllowAutoRedirect = False

            myHttpWebRequest.Headers.Add("headerkey", authInfo)
            myHttpWebRequest.Headers.Add("Access-Control-Allow-Origin", "*")
            myHttpWebRequest.Headers.Add("Access-Control-Allow-Headers", "Accept, Content-Type, Origin")
            myHttpWebRequest.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")

            Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)
            Response.AppendHeader("Access-Control-Allow-Origin", "*")

            ' Create a new 'HttpWebRequest' Object to the mentioned URL.

            ' Assign the response object of 'HttpWebRequest' to a 'HttpWebResponse' variable.
 
            Dim streamResponse As Stream = myHttpWebResponse.GetResponseStream()
            Dim streamRead As New StreamReader(streamResponse)


            frame1.Page.Response.AppendHeader("Access-Control-Allow-Origin", "*")
            frame1.Page.Response.AppendHeader("headerkey", authInfo)
            frame1.Attributes("srcdoc") = "<head><base href='http://datazenserver.com/viewer/' target='_blank'/></head>" & streamRead.ReadToEnd()


Ответы:


1

Возможно, вам придется сделать больше на стороне клиента, и я не знаю, сможете ли вы это сделать из соображений безопасности.

Внешняя аутентификация в Datazen выглядит примерно так:

User-Agent         |  Proxy               |  Server
-------------------|----------------------|------------------------------------
1. /viewer/home   --> 2.  Append header  --> 3.  Check cookie (not present)
                  <-- 5.  Forward        <-- 4.  Redirect to /viewer/login

6. /viewer/login  --> 7.  Append header  --> 8.  Append cookie
                  <-- 10. Forward        <-- 9.  Redirect to /viewer/home

11. /viewer/home  --> 12. Append header  --> 13. Check cookie (valid)
                  <-- 15. Forward        <-- 14. Give content

16. .................. Whatever the user wanted ..........................

Таким образом, даже если вы работаете с прокси-сервером с заголовком, вы все равно получаете файл cookie, который он использует.

Это просто контекст.

Мое предположение, исходя из вашего описания симптомов, состоит в том, что myHttpWebResponse должен иметь набор файлов cookie (я полагаю, DATAZEN_AUTH_TOKEN), но по сути он выбрасывается - вы нигде его не используете.

Вам нужно будет указать клиенту вашего браузера добавлять этот файл cookie к любым последующим (на основе iframe) запросам к домену вашего сервера Datazen, но я не верю, что это возможно из-за ограничений безопасности. Однако я не очень много знаю о CORS, поэтому может быть способ разрешить это.

Я не знаю, есть ли хороший способ сделать то, что вы хотите сделать здесь. В лучшем случае я могу придумать начало хака, который сработает, но я даже не могу найти хороший способ заставить его работать, и вам действительно не захочется туда идти.

По сути, если вы хотите встроить Datazen в iframe, я бы отказался от внешней аутентификации. Я бы уклонился от этого в любом случае, но особенно там.

Но если вы абсолютно уверены, что вам это нужно, а не что-то вроде ADFS, вам понадобится какой-то способ добавить этот файл cookie в ваши запросы iframe.


Единственный способ, которым я могу думать, чтобы заставить эту работу работать, - это поместить все в один и тот же домен:

  • www.example.com
  • datazen.example.com (вероятно, это ваш прокси)

Затем вы можете установить файл cookie из своего ответа, который хранит некоторую зашифрованную (и, вероятно, истекающую) форму Session("Email") и передает ее обратно в ваш html.

Это делает ваш iframe относительно простым, потому что вы можете просто сказать ему загрузить программу просмотра домой. Кое-что по эффекту:

<iframe src="//datazen.example.com/viewer/home"></iframe>

В своем прокси-сервере вы обнаружите файл cookie, установленный вашим веб-сервером, расшифруете токен электронной почты, убедитесь, что срок его действия не истек, а затем установите заголовок для последующего запроса на сервер Datazen.

Это может быть упрощено в паре мест, но это должно максимально соответствовать вашей исходной реализации, если вы можете возиться с настройками DNS.


Я полагаю, что другая версия этого может включать передачу параметра вашему прокси и совместное использование некоторого общего ключа шифрования. Это избавит вас от необходимости находиться в одном домене.

Итак, если у вас было что-то вроде:

var emailEncrypted = encrypt(Session("Email") + ":somesalt:" + DateTime.UtcNow.ToString("O"));

Затем используйте любой язык шаблонов, который вы хотите настроить для своего iframe:

<iframe src="//{{ customDomain }}/viewer/home?emailkey={{ emailEncrypted }}"></iframe>

Затем ваш прокси обнаружил этот параметр emailkey, расшифровал его и проверил срок действия, что может сработать.

Теперь у вас будет выбор, как поступить с этим, потому что Datazen даст вам 302 на /viewer/login, чтобы получить файл cookie, и вам нужно убедиться, что вы передаете правильный emailkey через него.

  1. Что бы я сделал, вы могли бы принять этот параметр emailkey в своем прокси, установить совершенно новый файл cookie самостоятельно, а затем следить за этим файлом cookie при последующих запросах.

    Хотя в этот момент, вероятно, было бы разумно переключить режим внешней аутентификации, чтобы просто использовать файлы cookie. В любом случае, это, вероятно, лучшая версия, если предположить, что это единственное место, где вы используете Datazen, и вы можете безопасно изменить что-то столь фундаментальное. Это существенно уменьшит вашу бизнес-логику.

    Но вам не пришлось бы. Если вы не хотите это менять, вы можете просто проверить файл cookie и превратить его в заголовок.

  2. Вы должны сделать (1), но на всякий случай я не уверен в одном: можете ли вы передавать пользователей напрямую в /viewer/login, чтобы получить файл cookie от Datazen. Обычно вы бы этого не сделали, но, похоже, вы должны быть в состоянии.

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

Вы, конечно, захотите убедиться, что у вас есть хорошая форма шифрования, и шаблон истечения срока действия важен. Но вы должны быть в состоянии обеспечить это, если вы делаете это правильно.

01.02.2016
  • Да, я смог получить и добавить файл cookie DATAZEN_AUTH_TOKEN в свой запрос/ответ (после того, как я сделал этот пост), что, как мне кажется, я тоже где-то сделал неправильно, но вы правы, похоже, что в какой-то момент он тоже потерялся. Я вижу все в веб-ответе, как если бы я аутентифицировался, но я не знаю, как правильно с этим справиться. Извините за мои способности новичка с этим веб-запросом. Я также пытался выполнить эту клиентскую часть с помощью ajax, но мне так и не удалось правильно аутентифицироваться таким образом. 02.02.2016
  • @Luke Люк, я действительно не помню поведения файлов cookie по умолчанию в HttpWebRequest, но могу представить, если бы он поддерживал их через перенаправления, и в этом случае это имело бы смысл. Ваш ответ будет иметь полностью аутентифицированное тело, но затем вы поместите его в iframe, и ваш файл cookie, конечно, не будет передан вместе с ним. Я действительно не уверен, есть ли какой-либо надежный способ сделать это. Если только, я полагаю, если бы вы могли поместить все в один и тот же домен (с поддоменами), вы могли бы установить файл cookie и использовать его на своем прокси-сервере или напрямую для внешней аутентификации. Это сработает. 02.02.2016
  • @ Люк, я немного отредактировал свой ответ, чтобы добавить теорию о том, как это может работать. Опять же, я не очень хорошо разбираюсь в CORS, но это поможет избежать большинства головных болей. По крайней мере, это что-то. Что бы это ни стоило, я могу сказать вам с некоторой степенью уверенности, что в конечном итоге это станет слишком хлопотным, и если вам это абсолютно не нужно, вам, вероятно, не следует продолжать этот путь. Внешняя аутентификация устарела и почти не поддерживается в исходном виде. Я понимаю ваш вариант использования и считаю, что это должно сработать, но это мои слова предупреждения. 03.02.2016
  • Есть ли способ передать стандартные учетные данные аутентификации datazen? Я не уверен, какой смысл иметь внешнюю аутентификацию, если вы ничего не можете с ней сделать, кроме как читать сзади. Даже если мне придется открыть другую страницу или загрузить с ней div, все в порядке. Я просто пытаюсь предотвратить множественные входы на наш сайт. Наша текущая аутентификация для нашего сайта использует автономный сервер sql. Об аутентификации Windows не может быть и речи, потому что у нас есть внешние клиенты. 03.02.2016
  • @ Люк, я отредактировал свой ответ, включив рабочий процесс, который может вам больше подойти. Требуется немного больше усилий, чтобы все получилось правильно, но это не должно быть чем-то экстраординарным. 03.02.2016
  • @Luke В любом случае, честно говоря, внешняя аутентификация была добавлена ​​как дополнительная функция для предварительного приобретения конкретного клиента. Вот почему он никогда не поддерживался так, как такие вещи, как ADFS. Именно поэтому, насколько мне известно, это не поддерживается в SSRS. Я имею в виду, когда вы думаете о других веб-сайтах, очень немногие поддерживают настоящий сценарий единого входа. Я могу войти в свое приложение с помощью Facebook, но не могу войти в Facebook с помощью своего приложения. Datazen предлагает это как удобство, но это не идеальная система. Лучший доступный вариант единого входа — это Windows, который, как вы говорите, вам не подойдет. 03.02.2016
  • Спасибо за вашу помощь и внимание к этому Мэтью. Другой сценарий, который я пытался реализовать, заключался в загрузке страницы входа в iframe в стандартном режиме аутентификации, поиске полей имени пользователя и пароля в iframe, их автоматическом заполнении и входе в систему. И я включил все поля CORS, которые смог найти. чтобы позволить мне иметь доступ к содержимому iframe, но все равно безрезультатно. =/ И они оба были в одном домене.. 04.02.2016
  • @ Люк Хм, да, я не уверен. На самом деле я никогда раньше не использовал iframe, но я знаю, что с ними связано много проблем с безопасностью. Если это тот же домен, что-то делать с файлами cookie в вашем прокси-сервере должно быть выполнимо. Для всех неподдерживаемых внешних аутентификаций это полезно для вашего конкретного сценария. 04.02.2016

  • 2

    В итоге я просто взял поля имени пользователя и пароля и ввел их с помощью javascript. Но этот кусок мне очень помог. Вы должны убедиться, что вы установили

    document.domain ='basedomain.com';

    в javascript на обоих сайтах, чтобы получить доступ к содержимому iframe, иначе вы столкнетесь с междоменными проблемами.

    11.02.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..