Я пытаюсь реализовать некоторую безопасность в своем приложении. У меня есть таблица USER_AUTHORIZATION, которая содержит список действительных одиночных знаков для идентификаторов тех, кто должен использовать приложение. Формат - COMPANYNAME \ 111222333 и хранится в поле под названием UNAME. Я пытаюсь выполнить проверку при посещении приложения, которое видит, если текущий зарегистрированный пользователь находится в таблице действительных пользователей. Если их SSO не находится в таблице, я хочу отобразить сообщение об ошибке.Аутентификация пользователя по таблице SQL
Посмотреть
@model IEnumerable<BillingApp.Models.HOLIDAY_DATE_TABLE>
@using System.Data;
@using System.Data.SqlClient;
@{
ViewBag.Title = "Table 8: Holiday Date Table";
Layout = "../Shared/Layout2.cshtml";
var whoareyoupeople = @User.Identity.Name;
DateTime date = DateTime.Now;
string myerrorstring = "User " + whoareyoupeople + " attempted unauthorized access on " + date + ".";
string connStringswag = "Data Source=SWDB10DSQL;Initial Catalog=BillingUI;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework";
using (SqlConnection _connyswagyolo = new SqlConnection(connStringswag))
{
_connyswagyolo.Open();
string checkauth = "SELECT COUNT(*) FROM USER_AUTHORIZATION WHERE UNAME == " + whoareyoupeople + ")";
SqlCommand Command223 = new SqlCommand(checkauth, _connyswagyolo);
Command223.ExecuteNonQuery();
_connyswagyolo.Close();
}
@section featured2 {
@if (whoareyoupeople not found in table){
<center><h2 style="color:red">Access Denied for user @User.Identity.Name. You are not authorized to view this application.</h2></center>
string fileName = "C:\\BillingExport\\SECURITY\\seclog.txt";
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write)){
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(myerrorstring);
}
}
}
else{
//actual content to be displayed (table information) goes here
Мои две большие вопросы, как я формировать, если заявление, чтобы проверить результат запроса? Кроме того, я получаю сообщение об ошибке «CS1513:} ожидается».
Вы заметите, что следующий раздел кода имеет недостающую замыкающую брекету в используемой строке подключения. Это связано с тем, что по какой-либо причине первая закрывающая скобка всегда распознается визуальной студией 2012 как конец блока кода (i.e; @ {}).
Update: Я переместил код на контроллер
public ActionResult HolidayDateTable()
{
var whoareyoupeople = User.Identity.Name;
DateTime date = DateTime.Now;
string myerrorstring = "User " + whoareyoupeople + " attempted unauthorized access on " + date + ".";
string connStringswag = "Data Source=SWDB10DSQL;Initial Catalog=BillingUI;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework";
using (SqlConnection _connyswagyolo = new SqlConnection(connStringswag))
{
_connyswagyolo.Open();
string checkauth = "SELECT COUNT(*) FROM USER_AUTHORIZATION WHERE UNAME == " + whoareyoupeople + ")";
SqlCommand Command223 = new SqlCommand(checkauth, _connyswagyolo);
int count = (int)Command223.ExecuteScalar();
_connyswagyolo.Close();
if (count == 0)
{
return RedirectToAction("AccessDenied");
}
else
{
return View(db.HOLIDAY_DATE_TABLE);
}
}
}
В настоящее время появляется ошибка "Неправильный синтаксис около '='." Указание на строку int count = (int) Command223.ExecuteScalar();
Update 2: Я не играл с моим кодом, но независимо от того, что я делаю, предложенное решение INT кол = (ИНТ) Command223.ExecuteScalar(); , похоже, не работает. Ниже приведен мой обновленный код контроллера.
public ActionResult HolidayDateTable()
{
var whoareyoupeople = User.Identity.Name;
DateTime date = DateTime.Now;
string myerrorstring = "User " + whoareyoupeople + " attempted unauthorized access on " + date + ".";
string query = "SELECT COUNT(*) FROM USER_AUTHORIZATION WHERE UNAME == " + whoareyoupeople + ")";
SqlConnection conn = new SqlConnection("Data Source=SWDB10DSQL;Initial Catalog=BillingUI;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");
conn.Open();
SqlCommand cmd = conn.CreateCommand();
{
cmd.CommandText = string.Format("SELECT COUNT(*) FROM USER_AUTHORIZATION WHERE UNAME == " + whoareyoupeople + ")");
int count = (int)cmd.ExecuteScalar();
if (count == 0)
{
return RedirectToAction("AccessDenied");
}
else
{
return View(db.HOLIDAY_DATE_TABLE);
}
}
}
Update 3: Проблема была с моей строки запроса, а не C# кода. Мне пришлось удалить знак равенства. Теперь этот вопрос я имею
Incorrect syntax near '\601011308'.
указывая на Int Count = (INT) cmd.ExecuteScalar();
Это частичная запись значения в поле таблицы UNAME. Перед ним отсутствует COMPANYNAME (т. Е. COMPANYNAME \ 601011308). Я думал, что подсчет должен был возвратить количество совпадений, которое SSO имеет с базой данных (т. Е. Если зарегистрированный пользователь SSO равен 601011308, и это действительный пользователь для приложения, которое хранится в таблице, count должно возвращать 1) ,
Последнего код контроллер, для которого у меня есть вышеуказанная проблема в Update 3:
public ActionResult HolidayDateTable()
{
var whoareyoupeople = User.Identity.Name;
DateTime date = DateTime.Now;
string myerrorstring = "User " + whoareyoupeople + " attempted unauthorized access on " + date + ".";
SqlConnection conn = new SqlConnection("Data Source=SWDB10DSQL;Initial Catalog=BillingUI;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");
conn.Open();
SqlCommand cmd = conn.CreateCommand();
{
cmd.CommandText = string.Format("SELECT COUNT(*) FROM AUTHORIZED_USERS WHERE UNAME = " + whoareyoupeople + ")");
int count = (int)cmd.ExecuteScalar();
if (count == 0)
{
return RedirectToAction("AccessDenied");
}
else
{
return View(db.HOLIDAY_DATE_TABLE);
}
}
}
Не вызывайте свою базу данных из представления, делайте это в контроллере. У вас не должно быть сложной логики в ваших представлениях. – DLeh
Вы используете ASP.NET MVC? Если это так, то эта логика не относится к вашему мнению. Он принадлежит контроллеру и, возможно, фильтру действия. –
Вы хотите построить его с нуля, вместо того, чтобы полагаться на что-то встроенное? http://msdn.microsoft.com/en-us/library/vstudio/eeyk640h (v = vs.100) .aspx – Pleun