2014-09-30 2 views
0

Я пытаюсь реализовать некоторую безопасность в своем приложении. У меня есть таблица 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); 
      } 
     } 
     }    
+1

Не вызывайте свою базу данных из представления, делайте это в контроллере. У вас не должно быть сложной логики в ваших представлениях. – DLeh

+0

Вы используете ASP.NET MVC? Если это так, то эта логика не относится к вашему мнению. Он принадлежит контроллеру и, возможно, фильтру действия. –

+0

Вы хотите построить его с нуля, вместо того, чтобы полагаться на что-то встроенное? http://msdn.microsoft.com/en-us/library/vstudio/eeyk640h (v = vs.100) .aspx – Pleun

ответ

0

Вместо ExecuteNonQuery(), используйте ExecuteScalar() так Count() естественно возвращать целое число.

int count = (int)cmd.ExecuteScalar(); на самом деле то, что я только что реализовал вчера. Затем вы просто используете счет в своем заявлении else/if.

+0

спасибо, см. выше обновление – Dave

+0

Зачем использовать _ для вашего соединения? – JoeManiaci

Смежные вопросы