Я потратил некоторое время, думая об этом и пришел к некоторым заключениям. Сеансовые куки направляющих защищены от несанкционированного использования по умолчанию, таким образом, Вы действительно не должны волноваться о cookie, изменяемом на клиентском конце.
Вот то, что я сделал:
, Когда пользователь устанавливает флажок "Remember Me", я просто установил сессию [: expireson] дата, чтобы быть входом в систему + 2 недели. Никто не может украсть cookie и остаться, вошел в систему навсегда или подмена как другой пользователь, потому что сеансовые куки направляющих защищены от несанкционированного использования.
Почему бы вам не вызвать процедуру магазина? Передайте значения в процедуру сохранения, чтобы получить вставленные значения, а из SP вернуть последнее введенное начальное значение, используя SCOPE_IDENTITY().
. Надеюсь, что это поможет.
Начиная с SQL Server 2008, к синтаксису TSQL добавлено предложение OUTPUT . Это позволяет добавлять данные, на которые влияет запрос DML, в поток табличных данных.
Несмотря на то, что запрос SCOPE_IDENTITY () после запроса возвращает правильную информацию, он заставляет SQL Server выполнить 2 запроса, где предложение output ограничивает это одним запросом.
Зная это, выполняемый запрос может быть изменен следующим образом (при условии, что [Id]
является именем идентификатора):
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date)
Еще одна проблема не заключается в удалении SqlCommand
, Большинство объектов Sql...
в ADO.net реализуют IDisposable
и должны быть утилизированы должным образом.
Собрав все воедино, я реализовал бы этот фрагмент кода следующим образом:
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString))
using (var cmd = new SqlCommand(@"
INSERT INTO MagicBoxes (OwnerID, [Key], Name, [Permissions], Active, LastUpdated)
OUTPUT INSERTED.Id
VALUES (@OwnerID, @BoxKey, @BoxName, 0, 1, @Date) ", conn))
{
cmd.Parameters.AddRange(new[]
{
new SqlParameter("@OwnerID", SqlDbType.Int).Value = OwnerID,
new SqlParameter("@BoxKey", SqlDbType.VarChar).Value = BoxKey,
new SqlParameter("@BoxName", SqlDbType.VarChar).Value = BoxName,
new SqlParameter("@Date", SqlDbType.DateTime).Value = DateTime.Now
});
conn.Open();
var id = (int)cmd.ExecuteScalar();
}