2017-10-12 4 views
0

Windows 인증을 사용하여 사용자를 식별하는 ASP.NET Web Forms (전 초급)을 사용하여 인트라넷 웹 사이트를 개발하기 시작했지만 다양한 페이지에 대한 액세스를 제어하기 위해, SQL 테이블 내의 데이터를 기반으로 설정된 기준에 따라 사용자에게 역할을 할당하려고합니다 (이 데이터는 매일 바뀔 수 있음).Windows 인증 - 사용자 지정 기준으로 역할 설정

지금까지 필자는 (원격) SQL Server 데이터베이스에 연결되어있는 Windows 인증을 사용하여 '기본 제공되는'ASP.NET Web Forms 템플릿을 사용했습니다.

다른 답변이 있으면 사과하지만 내 요구에 맞는 해결책을 찾지 못하는 것 같습니다.

일부 기본 IF 로직을 사용하여 'Admin', 'Moderator', 'HRA', 'Manager'및 'Employee'와 같은 역할을 수행 할 것입니다.

다음과 같이 사용자의 역할을 결정합니다 로그인 한 SQL 테이블에서 사용자의 데이터 (3-4 필드 최대), 설정 기준을 찾는 상대 :

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 

을 나는이 일 것 같은데요 세션 당 한 번 실행되는 Site.Master 파일에 들어 있지만, 정확히 어떻게 작동하는지에 관해서는 고민 중입니다.

사전에 감사 드리며, 이것이 어떻게 작동하는지 이해합니다 PHP하지만 ASP.NET과 어떻게 작동하는지 완전히 새로운 것입니다. 더 좋은 해결책이 있다면 그때!

내 사이트 (예 : Dashboards 섹션)의 일부 영역에서 일부 UserRoles가 SQL 테이블에 의해 제어되는 대시 보드에 대한 사용자 정의 액세스를 제어 할 수 있다는 점도 유의해야합니다. 그러나 앞으로는이를 볼 수 있습니다.

답변

0

나는 다른 누군가에게 어떤 용도로든 사용한다고 대답했다. 난 내 자신의 사용자 지정 역할 공급자 구현과 같은 역할을 할당 할 SQL 데이터에 연결 :

의 web.config에 다음
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; } 
    } 

:

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