2015-09-22 1 views
1

Je mets en place un projet asp.net, ce projet est configuré dans IIS. Le site est ouvert à tout le monde, quand je revois le code sur la page asp.net, sa fenêtre de vérification se connecte "id d'entreprise" et permet à tous les utilisateurs de voir toutes les pages ASPX. Maintenant, mon équipe de gestion nous a demandé de restreindre ceux qui sont sous les employés de niveau junior. (Junior engg, développeur, logiciel engg).Restreindre l'accès à toutes les pages asp.net

J'ai écrit la requête en transmettant l'identifiant d'entreprise et en validant la note, si elle est de niveau junior, en retournant des valeurs "0", sinon en retournant des valeurs "1".

Mes questions sont, je ne veux pas aller et éditer chaque page et vérifier cette requête et restreindre chaque page.

pouvez-vous s'il vous plaît suggérer, comment puis-je mettre en œuvre le plus simple et le meilleur moyen de restreindre les utilisateurs.

Merci, --------------------------------------- Mise à jour le 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; 
 
      } 
 
     }

I mis en œuvre le functionalite ci-dessus dans ma page index.aspx, si le userstatus égal à "0", il affichera la « Vous n'êtes pas authrized pour afficher ce message "et ça va finir.

J'ai environ 30 pages aspx, actuellement en production. Je ne veux pas aller inclure le même code (index.aspx) dans chaque chargement de page pour arrêter la validation de l'utilisateur.

pouvez-vous s'il vous plaît suggérer comment puis-je mettre en œuvre sans modifier toutes les pages.

Mis à jour le 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

Où obtenez-vous les valeurs de validation de qualité? c'est-à-dire, comment l'application sait-elle si un utilisateur est de niveau junior? Généralement, l'accès à la page doit être défini à l'aide des rôles et du fichier web.config. Vous pouvez voir une réponse très simple à une question similaire, ici: http://forums.asp.net/t/1434380.aspx?Restricting+Access+to+Pages+by+Roles Fondamentalement, vous définissez l'accès , basé sur des règles page par page ou répertoire par répertoire. Je ne suis pas sûr que cela fonctionne pour votre projet, cependant. – dylanthelion

+0

J'ai deux tables "employé" - ID employé, nom, titre, deuxième table: Titres Titre Id, Nom, niveau. exemple: si je joins les deux tables, nom de l'employé: Mark, 12 (titleID), Contractor (Titre), S4 (Level), je ne veux pas autoriser les utilisateurs de niveau s4 dans toutes les pages. – user3442289

+0

Vous souhaitez probablement implémenter votre fournisseur de rôle personnalisé. Une fois que vous l'avez installé et configuré (dans web.config), vous pouvez le faire dans le code derrière. – g2000

Répondre

0

Vous avez quelques options, ici:

1) Configurer l'accès basé sur les rôles avec Owin ou AspNet.Identity. C'est probablement votre meilleure option, mais je n'ai pas pu trouver un bon tutoriel pour vous. Ces paquets sont bien documentés, cependant, et je suis sûr que vous pouvez les comprendre avec quelques efforts.

2) Créez une table de rôles et personnalisez-la vous-même. Le meilleur exemple que j'ai trouvé était ici: http://www.codeproject.com/Articles/875547/Custom-Roles-Based-Access-Control-RBAC-in-ASP-NET

3) Rediriger les utilisateurs non autorisés sans utiliser de rôles. Donc, quelque chose comme:

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

Je ne suis pas sûr que cette option est terriblement sécurisé, mais cela devrait fonctionner.

Espérons que ça aide!

+0

Merci, j'ai fait des recherches mais pas en mesure de mettre en œuvre la suggestion ci-dessus 2. J'ai édité mon code, pouvez-vous s'il vous plaît fournir des suggestions pour la mise en œuvre de cette fonctionnalité sans éditer chaque et chaque page. merci, – user3442289

+0

Mis à jour mes questions - --------------------------------------- Mise à jour le 09/24/2015 – user3442289

0

Après avoir configuré les rôles, vous pouvez utiliser un site Web.fichier de configuration dans chaque répertoire en spécifiant authorization et/ou utilisez l'élément 'location' dans le fichier web.config.

0

Tout d'abord, désolé pour le code prêtant à confusion. J'ai utilisé MVC, et vous avez clairement posté votre code.

Je ne pense pas que vous puissiez réaliser ce que vous essayez de faire, sans ajouter votre code à chaque page, ou en apprendre davantage sur les rôles. Vous pouvez réduire la duplication de code de plusieurs façons intelligentes, mais je ne peux pas penser à tout ce qui ne semble pas être un hack total. Si vous voulez, par exemple, mettre toutes vos pages sécurisées dans le même répertoire et restreindre l'accès de bas niveau à ce répertoire, vous devrez filtrer par des utilisateurs spécifiques ou, si vous pouvez les implémenter, les rôles. Si je comprends bien, les nœuds deny et allow dans votre fichier web.config définissent des règles d'autorisation côté serveur (donc IIS, probablement), donc les mots-clés et les règles que vous pouvez utiliser sont limités. Consultez cette page sur, pour quelques notions de base:

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

Bien qu'il soit probable possible de construire une règle basée sur des valeurs dans votre base de données, faisant serait probablement beaucoup plus de travail que cela vaut la peine.

Désolé de ne pouvoir offrir une réponse plus satisfaisante, mais je recommanderais: 1) de vous mettre au travail, et d'ajouter une vérification du code derrière pour chaque page, ou 2) (et je suggère fortement cette option) fermez cette question et publiez-en une autre sur l'implémentation de rôles dans .net et l'attribution de rôles aux utilisateurs, dans le code. Si, par exemple, vous pouvez utiliser votre page de connexion pour attribuer à chaque utilisateur de niveau junior le rôle personnalisé de Junior et placer toutes vos pages sécurisées dans un répertoire nommé SecurePages, vous pouvez ajouter le code suivant à votre fichier web.config et obtenir exactement ce que vous essayez de faire:

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

Bonne chance!

+0

Merci, ça ne marche pas pour mon projet. Beaucoup de code compliqué à l'intérieur de la page, chaque page agit comme si elle était séparée. – user3442289

+0

Le code que j'ai posté dans la page principale. Y at-il des problèmes lorsque je redirige la page du fichier cs. ? Si l'utilisateur n'est pas valide, je prévois de rediriger la page d'erreur du fichier cs. HttpContext.Current.Response.Redirect ("PSF_Error.aspx ", true); – user3442289

+0

lorsque la page d'index de chargement, si l'utilisateur valide, il fonctionnera, sinon, cs fichier rediriger vers la page d'erreur.Pouvez-vous me suggérer, la façon dont je implémente est corrigée ou non? merci, – user3442289