2017-10-12 4 views
0

Ich habe begonnen, eine Intranet-Website mit ASP.NET Web Forms zu entwickeln (ich bin ein Anfänger), die Windows-Authentifizierung verwendet, um Benutzer zu identifizieren, aber den Zugriff auf verschiedene Seiten zu kontrollieren Ich versuche, Benutzern Rollen basierend auf festgelegten Kriterien basierend auf Daten in SQL-Tabellen zuzuordnen (diese Daten können sich täglich ändern).Windows-Authentifizierung - Rollen mit benutzerdefinierten Kriterien festlegen

Bis jetzt habe ich die "out of the box" ASP.NET Web Forms Vorlage mit Windows-Authentifizierung, die eine funktionierende Verbindung zu meiner (remote) SQL Server-Datenbank hat.

Ich entschuldige mich, wenn dies an anderer Stelle beantwortet wurde, aber ich kann nicht scheinen, eine Lösung zu finden, die meinen Bedürfnissen entspricht.

Mit einigen grundlegenden IF-Logik, werde ich die folgenden Rollen haben: 'Admin', 'Moderator', 'HRA', 'Manager' und 'Mitarbeiter'.

oben schauen die protokollierten-in-Daten des Benutzers aus einer SQL-Tabelle (3-4 Felder max) festgelegten Kriterien wird die Rolle des Benutzers wie folgt ermitteln:

if (UserRole === null) Then 
    If (ORG_ID === 30001000) Then 
     UserRole === 'Admin' 

    else if (ORG_ID === 30001001) Then 
     UserRole === 'Moderator' 

    else if (ORG_ID === 30001002) Then 
     UserRole === 'HRA' 

    else if (CHIEF === 'Chief') Then 
     UserRole === 'Manager' 

    else 
     UserRole === 'Employee' 
    End If 
End if 

Ich vermute, dass dies gearbeitet werden würde in die Site.Master-Datei, die einmal pro Sitzung ausgeführt wird, aber ich bin fest, wie dies würde genau funktionieren und wenn etwas zur Konfigurationsdatei usw. hinzugefügt werden muss

Dank im Voraus, ich verstehe, wie dies funktionieren würde mit PHP aber ASP.NET und wie es funktioniert ist für mich völlig neu. Wenn es eine bessere Lösung gibt, dann großartig!

Es ist auch erwähnenswert, dass einige Teile meiner Website (z. B. ein Dashboards-Abschnitt) einige UserRoles benutzerdefinierten Zugriff auf Dashboards von einer SQL-Tabelle gesteuert steuern lassen - aber ich kann in Zukunft schauen.

Antwort

0

Ich dachte, ich würde das selbst beantworten, nur wenn es irgendjemand anderen nutzt. Ich implementiert meine eigenen benutzerdefinierten Rolle Provider und Verbindung mit SQL-Daten Rollen wie folgt zuzuordnen:

public class CustomRoleProvider : RoleProvider 
    { 
     public override bool IsUserInRole(string username, string roleName) 
     { 
      var roles = GetRolesForUser(username); 
      foreach (var role in roles) 
      { 
       if (role.Equals(roleName)) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

     public override string[] GetRolesForUser(string username) 
     { 
      //create our List to hold our Roles 
      List<string> r = new List<string>(); 

      r.Add("Employee"); 

      //get our sap number of current user to look up against the database 
      var persno = Int32.Parse(10 + HttpContext.Current.User.Identity.Name.Substring(HttpContext.Current.User.Identity.Name.Length - 5)); 

      //connect to our sql database 
      string strConnString = ConfigurationManager.ConnectionStrings["hrssportalConnectionString1"].ConnectionString; 
      string str; 
      SqlCommand com; 
      SqlConnection con = new SqlConnection(strConnString); 
      con.Open(); 

      //SQL Query 
      str = "SELECT org_publisher.persno, org_publisher.record_type, org_publisher.org_string, map_user_roles.role_name FROM org_publisher LEFT JOIN users ON org_publisher.persno = users.persno LEFT JOIN map_user_roles ON users.role_id = map_user_roles.role_id WHERE org_publisher.persno = " + persno; 
      com = new SqlCommand(str, con); 

      //get our data 
      //SqlDataReader reader = com.ExecuteReader(); 
      //reader.Read(); 

      DataTable dt = new DataTable(); 
      dt.Load(com.ExecuteReader()); 

      //if we have rows returned do our checks 
      if (dt != null) 
      { 

       //get our data for checking 
       //string org_string = reader["org_string"].ToString(); 
       //string line_manager = reader["record_type"].ToString(); 

       string org_string = dt.Rows[0]["org_string"].ToString(); 
       string line_manager = dt.Rows[0]["record_type"].ToString(); 

       //Line Manager Role check 
       if (line_manager == "<ChiefPosition>") 
       { 
        r.Add("Manager"); 
       } 

       //HRSS Role Check 
       if (org_string.Contains("30001803")) 
       { 
        r.Add("HRSS"); 
       } 

       //HRA Role Check 
       if (org_string.Contains("30003237")) 
       { 
        r.Add("HRA"); 
       } 

       //add all custom roles by cycling through rows 
       if (dt.Rows.Count > 0) 
       { 
        foreach (DataRow row in dt.Rows) 
        { 
         if (row["role_name"].ToString() != null) 
         { 
          r.Add(row["role_name"].ToString()); 
         } 
        } 
       } 

       //close our sql objects 
       dt.Dispose(); 
       con.Close(); 

       //return List as an array 
       string[] rolesArray = r.ToArray(); 
       return rolesArray; 
      } 
      else 
      { 
       //if no Rows returned from SQL, return only Employee role from List 
       string[] rolesArray = r.ToArray(); 
       return rolesArray; 
      } 
     } 

     public override void AddUsersToRoles(string[] usernames, string[] roleNames) 
     { 

     } 

     public override string[] FindUsersInRole(string roleName, string usernameToMatch) 
     { 
      throw new System.NotImplementedException(); 
     } 

     public override void CreateRole(string roleName) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool RoleExists(string roleName) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) 
     { 
      throw new NotImplementedException(); 
     } 

     public override string[] GetUsersInRole(string roleName) 
     { 
      throw new NotImplementedException(); 
     } 

     public override string[] GetAllRoles() 
     { 
      throw new NotImplementedException(); 
     } 

     public override string ApplicationName { get; set; } 
    } 

Dann in web.config:

<roleManager defaultProvider="CustomRoleProvider" enabled="true"> 
    <providers> 
    <clear/> 
    <add name="CustomRoleProvider" type="ClassLibrary.CustomRoleProvider" 
    applicationName="WebApplication1" writeExceptionsToEventLog="false"/> 
    </providers> 
</roleManager> 
Verwandte Themen