代码之家  ›  专栏  ›  技术社区  ›  Kevin

Windows身份验证-使用自定义条件设置角色

  •  0
  • Kevin  · 技术社区  · 7 年前

    我已经开始开发一个内部网站使用ASP。NET Web表单(我完全是初学者),它使用Windows身份验证来识别用户,但为了控制对各种页面的访问,我希望根据SQL表中的数据(这些数据可以每天更改)根据设置的标准为用户分配角色。

    到目前为止,我有现成的ASP。NET Web窗体模板,具有Windows身份验证,与我的(远程)SQL Server数据库有工作连接。

    使用一些基本的IF逻辑,我将扮演以下角色:“管理员”、“主持人”、“HRA”、“经理”和“员工”。

    从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
    

    我猜这会被应用到网站中。主文件,每个会话运行一次,但我坚持认为这将如何确切地工作,如果有什么需要添加到配置文件等。

    提前感谢,我知道这将如何与php,但ASP。NET及其工作原理对我来说是一个全新的概念。如果有更好的解决方案,那太好了!

    还值得注意的是,我网站的某些部分(例如仪表板部分)将允许一些用户角色控制对由SQL表控制的仪表板的自定义访问,但我可以在将来研究这个问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Kevin    7 年前

    我想我会自己回答这个问题,以防万一对其他人有用。我实现了自己的自定义角色提供程序,并连接到sql数据以分配如下角色:

    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; }
        }
    

    然后在web中。配置:

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