2015-12-25 8 views
0

Я унаследовал приложение asp.net, которое дает пользователям доступ к страницам на основе значения в поле базы данных SQL Server. По мере загрузки каждой страницы выполняется процедура проверки идентификатора пользователя и имени страницы в базе данных, чтобы определить, имеет ли идентификатор пользователя доступ к определенной странице. Если access = 'Yes' пользователю разрешено просматривать все элементы на странице, если access = 'No' пользователь вышел из системы и перенаправлен на экран входа в систему.Разрешение на доступ к страницам

Что мне нужно сделать, чтобы сохранить ВСЕ страницы, к которым пользовательский идентификатор имеет доступ в начале, поэтому после входа пользователя в систему они видят только то, к чему у них есть доступ, в отличие от проверки, выполняемой каждым время, когда пользователь запрашивает доступ к странице?

+0

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

+0

@Bindrid - приложение имеет примерно 80 страниц, а попадание в базу данных и ожидание ответа - это мое время, так как этот сервер также попадает на несколько других процедур. – FartStopper

+0

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

ответ

2

Я покажу код. Что-то вроде этого.

string session_string=""; 
SqlConnection cn = new SqlConnection(YOUR_CONNECTION_STRING); 
cn.open(); 
SqlCommand cmd = new SqlCommand(); 
cmd.Connection=cn; 
cmd.CommandType=CommandType.Text; 
cmd.CommandText="select name_of_pages from permission where username='YOUR_USERNAME'"; 
SqlDataReader rdr = cmd.ExecuteReader(); 
if(rdr.hasRows==true){ 
    while(rdr.Read()){ 
     session_string=rdr["name_of_pages"] + ",";//You need to declare this variable globally before 
     session_string=session_string + rdr["name_of_pages"] + ","; //USE THIS LINE , NOT PREVIOUS ONE 
    } 
} 
rdr.close();//DONT FORGET THIS ALSO 
cn.close();//DONT FORGET THIS 
    Session["pages"]=session_string; 
    //Now to check 
    if(Session["pages"].Contains("Index.aspx")){ 
     //PERFORM SOMETHING POSITIVE 

    } 
    else 
    { 
     //PERFORM SOMETHING NEGATIVE 
    } 

Измените код в соответствии с вашими нуждами.

0

Хорошо, мы используем FormsAuthenticationTicket после входа пользователя в систему. С билетом мы идем против базы данных и получаем рулоны пользователей и persmissons. Это входит в переменную сеанса. (поскольку вы используете asp.net). Затем мы проверяем запрос страницы пользователя на этот объект в сеансе в Global asa. Если они не удались, мы отправляем их на страницу loggin.

+0

Может ли это удерживать несколько значений или может удерживать только одно значение? Примеры, которые я видел, показывают только сохранение значения 1. – FartStopper

+0

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

+0

@ScottSelby - по большей части их около 5 групп, имеющих одинаковые разрешения на одни и те же страницы. Тем не менее, есть несколько случаев, когда отдельному пользователю нужен доступ к одной странице, которая не находится на «страницах» по умолчанию для группы, в которой они содержатся. Как следует обрабатывать эти экземпляры? – FartStopper

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