Аутентификация форм

У вас есть проблема с областью действия.

Это пример для воспроизведения вашей проблемы:

ques - глобальная переменная, которая обновляется в цикле for, поэтому при асинхронности Код завершается, выполнение будет считывать глобальную переменную с последним значением ques = result[i].

'use strict'
const result = ['a', 'b', 'c']
const mcqAll = []
var ques
for (var i = 0; i < result.length; i++) {
  ques = result[i]
  var sql_test_q_ops = 'SELECT op_text, op_id FROM mc_ops WHERE q_id = ' + result[i].q_id
  query(sql_test_q_ops)
    .then(() => {
      mcqAll.push({ i: ques })
      console.log(mcqAll)
    })
}

function query() {
  return new Promise(resolve => setTimeout(resolve, 100))
}

Но, если вы просто объявите ques следующим образом:

for (var i = 0; i < result.length; i++) {
  const ques = result[i]
  const sql_test_q_op...

все будет работать.

Хорошей практикой является использование const или let вместо var, поскольку последний создает опасную глобальную переменную области действия.


Что касается вашего комментария: вывод пустой, потому что этот цикл for является синхронизированным, поэтому вы отвечаете синхронизированным способом на ответ.

Пример того, как управлять этим делом, может быть таким:

'use strict'
const result = ['a', 'b', 'c']
const mcqAll = []

const promiseArray = result.map(ques => {
  const sql_test_q_ops = 'SELECT op_text, op_id FROM mc_ops WHERE q_id = ' + ques.q_id
  return query(sql_test_q_ops)
    .then(() => { mcqAll.push({ i: ques }) })
})

// Wait for all the query to complete before rendering the results
Promise.all(promiseArray)
  .then(() => {
    console.log({ mcqAll });
    res.render('mcqAllPage', { mcqAll })
  })
  .catch(err => res.send(500)) // this is an example

function query() {
  return new Promise(resolve => setTimeout(resolve, 100))
}

Учтите, что существует множество возможностей для реализации этого:

  • использовать для асинхронной синхронизации. итератор для последовательного выполнения запроса
  • повышает производительность, выполняя только один запрос с условием in вместо запроса для каждого q_id и управляя результатом с помощью некоторого кода для группировки результатов
  • используя массив обещаний, как в примере

Идите глубже и выберите тот, который лучше всего соответствует вашим потребностям.

Важно: .catch всегда цепочка обещаний!

5
задан Ian Nelson 13 March 2009 в 14:00
поделиться

6 ответов

Для удовлетворения Вас требования, Вы будете использовать Аутентификацию Форм с Членством. Если Ваше приложение использует базу данных SQL Server, можно использовать SQLMembershipProvider в качестве поставщика членства для достижения этого.

Исследуя ASP.NET 2.0's Членство, Роли и Профиль могут быть ссылкой хорошего начала.

О Вашей озабоченности по поводу передающих паролей как простой текст, когда соединение не защищается.

На самом деле пароли, которые отправляются, обычно хешируются (алгоритм будет зависеть от выбранного Поставщика Членства), и это - поскольку там в конечном счете хранятся. Конечно, если соединение не защищается, что хешированный пароль может получаться и использоваться для взламывания приложения, но по крайней мере Вы устраняете возможность, что простой пароль пользователя крадется и используется, например, получить доступ к другому сервису (поскольку Вы знаете, что многие люди используют тот же пароль через многочисленные услуги). Таким образом, чтобы быть безопасными действительно необходимо использовать https здесь.

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

5
ответ дан 14 December 2019 в 04:48
поделиться

Аутентификация форм не делает передает пароли обратно как простой текст. Пока Вы удостоверяетесь, что вход в систему защищен при получении его (т.е. с помощью https... ssl) там нет никакой угрозы безопасности.

Если действительно необходимо сделать авторизацию тот путь, можно полагаться на аутентификацию форм для... аутентификации и сделать авторизацию с собственным механизмом.

1
ответ дан 14 December 2019 в 04:48
поделиться

Автор форм является отличным выбором для того, что Вы после. Это поддерживает роли, но это не поддерживает группы. Однако это действительно имеет созданным в поддержке интеграции Active Directory, которую можно использовать для облегчения проблемы группы при необходимости. Лично, я придерживался бы с тем, что Вы имеете и узнаете больше о нем. Если бы Вы хотите использовать режим Forms Автора Форм, а не AD подлинный режим, я рассмотрел бы построение на поддержке группы с помощью существующей базы данных автора форм.

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

Yikes, я просто рассмотрел Ваш вопрос снова, и Вы сказали, что они не используют SSL. Насколько безопасный этот сайт должен быть? Мне, который был бы моей первостепенной задачей, должен переместиться в SSL!

1
ответ дан 14 December 2019 в 04:48
поделиться

Аутентификация форм не будет группы поддержки исходно. То, что мы делаем, использовать его, чтобы "пройти проверку подлинности", пользователь (докажите, кто они), и затем мы используем наши собственные хранилища данных для "авторизовывания" пользователя (опишите то, что они могут сделать).

1
ответ дан 14 December 2019 в 04:48
поделиться

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

Хотя я разрабатываю с Visual Studio и платформой .NET, мне не всегда нравится делать вещи "Microsoft" путь. Я нахожу, что много раз "Microsoft", путь представляет много издержек, которых можно избежать, если Вы знаете то, что Вы делаете.

Еще раз спасибо за вход.

0
ответ дан 14 December 2019 в 04:48
поделиться

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

0
ответ дан 14 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: