2015-09-22 2 views
1

Я использую один проект asp.net, этот проект настроен в IIS. Веб-сайт открыт для всех, когда я просматриваю код на странице asp.net, его окно регистрации «id предприятия» и позволяет всем пользователям просматривать все страницы aspx.Ограничить доступ ко всем страницам asp.net

Теперь моя команда менеджеров попросила нас ограничить тех, кто находится на уровне младших сотрудников (Junior engg, Developer, software engg).

Я написал запрос, передав идентификатор предприятия и подтвердив оценку, если его младший уровень, возвращающий значения «0», иначе возвращающие значения «1».

Мои вопросы: я не хочу идти и редактировать каждую страницу и проверять этот запрос и ограничивать каждую страницу.

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

Спасибо, --------------------------------------- Обновление по 09/24/2015

Index.aspx 
 

 
protected void Page_Load(object sender, EventArgs e) 
 
    { 
 
     string UserStatus = UtilFunctions.ValidateUser(); 
 
     Response.Write(UserStatus); 
 
     if (UserStatus == "0") 
 
     { 
 
      Response.Write("<div><font color=red><h1>You are not authorized to view this page</h1></font></div>"); 
 
      Response.End(); 
 
     } 
 
    } 
 

 

 
Utilifunctions.cs 
 
    public static String ValidateUser() 
 
    { 
 
     
 
     string CurrentUser = getLoggedOnUser(); 
 
     using (System.Data.SqlClient.SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["TestDB"].ConnectionString)) 
 
     { 
 
      using (SqlCommand myCommand = myConnection.CreateCommand()) 
 
      { 
 
       
 
       myConnection.Open();//Opens the Connection 
 
       myCommand.CommandText = "Select Permission From Temp_Validate Where EnterpriseId='" + CurrentUser + "'"; 
 
       SqlDataReader IDReader = myCommand.ExecuteReader(); //Gets the ID 
 
       IDReader.Read(); 
 
       string UserStatus = IDReader["Permission"].ToString(); 
 
       IDReader.Close(); 
 
       return UserStatus; 
 
      } 
 
     }

Я реализовал выше functionalite на моей странице index.aspx, если UserStatus равен «0», он будет отображать «Вы не authrized для просмотра сообщения «и это закончится.

У меня около 30 страниц aspx, в настоящее время работает в Production. Я не хочу, чтобы включить один и тот же код (index.aspx) в каждую загрузку страницы, чтобы остановить проверку пользователя.

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

Обновлено 09/28: Utilifunction.cs

public static String getLoggedOnUser() 
 
    {  
 
     String user = HttpContext.Current.User.Identity.Name.Substring(HttpContext.Current.User.Identity.Name.IndexOf("\\") + 1); 
 
     if (user == "") user = "anonymous"; 
 

 
     string UserStatus = IsValidUser(user); 
 

 
     if (UserStatus == "0") 
 
     { 
 
      HttpContext.Current.Response.Redirect("PSF_Error.aspx", true); 
 
     } 
 
     return user;    
 
    } 
 

 
    public static String IsValidUser(string currentUser) 
 
    { 
 
     
 
     using (System.Data.SqlClient.SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString)) 
 
     { 
 
      using (SqlCommand myCommand = myConnection.CreateCommand()) 
 
      { 
 
       //Gets email of the creator of current user 
 
       myConnection.Open();//Opens the Connection 
 
       myCommand.CommandText = "Select Permission From Temp_Validate Where EnterpriseId='" + currentUser + "'"; 
 
       SqlDataReader IDReader = myCommand.ExecuteReader(); //Gets the ID 
 
       IDReader.Read(); 
 
       string UserStatus = IDReader["Permission"].ToString(); 
 
       IDReader.Close(); 
 
       return UserStatus; 
 
      } 
 
     } 
 

 

 
    }

index.aspx

Page_load 
 
{ 
 
string CurrentUser = UtilFunctions.getLoggedOnUser(); 
 

 
}

+0

Где вы принимаете оценки валидации? то есть, как приложение знает, является ли пользователь младшим? Как правило, доступ к страницам должен быть задан с использованием ролей и файла web.config. Вы можете увидеть очень простой ответ на аналогичный вопрос, здесь: http://forums.asp.net/t/1434380.aspx?Restricting+Access+to+Pages+by+Roles В принципе, вы устанавливаете доступ , на основе поэтапных или каталогов по каталогам. Я не уверен, что это работает для вашего проекта. – dylanthelion

+0

У меня есть две таблицы «employee» - идентификатор сотрудника, имя, название, вторая таблица: титры Название, имя, уровень. Например: если я присоединяюсь к обеим таблицам, имя сотрудника: Mark, 12 (titleID), Подрядчик (Заголовок), S4 (Уровень), я не хочу разрешать пользователям уровня s4 на всех страницах. – user3442289

+0

Возможно, вы хотите реализовать своего поставщика роли. как только у вас будет настройка и настройка (в web.config), вы можете сделать это в коде позади. – g2000

ответ

0

У вас есть несколько вариантов, здесь:

1) Настройте ролевой доступ с помощью Owin или AspNet.Identity. Вероятно, это ваш лучший вариант, но я не смог найти для вас хороший учебник. Тем не менее, эти пакеты хорошо документированы, и я уверен, что вы можете понять их с некоторыми усилиями.

2) Создайте таблицу ролей и настройте доступ самостоятельно. Лучший пример, который я нашел, был здесь: http://www.codeproject.com/Articles/875547/Custom-Roles-Based-Access-Control-RBAC-in-ASP-NET

3) Перенаправление несанкционированных пользователей без использования ролей. Так что-то вроде:

public ActionResult SecurePage(User u) 
{ 
    if(u.level == "junior"){ 
     return RedirectToAction("CustomErrorPage"); 
    } else { 
     return View(); 
    } 
} 

Я не уверен, что этот вариант ужасно безопасен, но он должен работать.

Надеюсь, что это поможет!

+0

Спасибо, я исследовал, но не смог реализовать вышеупомянутое предложение 2. Я редактировал свой код, не могли бы вы предложить предложение для реализации этой функции без редактирования каждой страницы. спасибо, – user3442289

+0

Обновлено мои вопросы - --------------------------------------- Обновление от 09/24/2015 – user3442289

0

После настройки ролей вы можете использовать сеть.config в каждой директории с указанием authorization и/или использовать элемент 'location' в файле web.config.

0

Во-первых, извините за путаный код. Я использовал MVC, и вы четко разместили свой код позади.

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

Если вы хотите, скажем, поместить все свои защищенные страницы в тот же каталог и ограничить доступ к этому низкоуровневому доступу, вам придется фильтровать определенные пользователи или, если вы можете их реализовать, роли. Насколько я понимаю, запрещающие и разрешающие узлы в вашем файле web.config устанавливают правила авторизации на стороне сервера (таким образом, IIS, вероятно), поэтому ключевые слова и правила, которые вы можете использовать, ограничены. Проверьте эту страницу из, для некоторых основ:

http://weblogs.asp.net/gurusarkar/setting-authorization-rules-for-a-particular-page-or-folder-in-web-config

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

Извините, что я не могу предложить более удовлетворительный ответ, но я бы рекомендовал: 1) Приступить к работе и добавить чек на код для каждой страницы или 2) (и я настоятельно рекомендую этот вариант) закройте этот вопрос и опубликуйте другой вопрос о реализации ролей в .net и назначении ролей пользователям, в коде. Если, скажем, вы можете использовать страницу входа в систему, чтобы назначить каждому пользователю младшего уровня пользовательскую роль младшего и поместить все ваши защищенные страницы в каталог с именем SecurePages, вы можете добавить следующий код в свой web.config и добиться точно что вы пытаетесь сделать:

<location path="SecurePages"> 
    <system.web> 
    <authorization> 
     <deny roles="Junior"> 
     <deny users="*"> 
</authorization></system.web></location> 

Удачи вам!

+0

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

+0

Код, который я опубликовал на главной странице. Есть ли проблемы при перенаправлении страницы из файла cs. ? если пользователь не проверяет, я планирую перенаправить страницу ошибки из файла cs. HttpContext.Current.Response.Redirect ("PSF_Error.aspx ", true); – user3442289

+0

при загрузке индексной страницы, если пользователь действителен, он будет функционировать, в противном случае файл cs перенаправляется на страницу с ошибкой. Можете ли вы предложить мне, способ, которым я реализую, правильный или нет? спасибо, – user3442289

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