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

时间:2017-10-12 19:40:11

标签: asp.net visual-studio c#-4.0 windows-authentication

我已经开始使用ASP.NET Web Forms开发一个Intranet网站(我是初学者),它使用Windows身份验证来识别用户,但是为了控制对各种页面的访问,我正在寻找基于用户的角色分配基于SQL表中数据的设定标准(此数据可以每天更改)。

到目前为止,我有一个带有Windows身份验证的“开箱即用”ASP.NET Web窗体模板,该模板与我的(远程)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

我猜这会在每个会话运行一次的Site.Master文件中运行,但我不知道这将如何正常工作,如果有什么需要添加到配置文件等。

在此先感谢,我理解这将如何与PHP,但ASP.NET和它的工作原理对我来说是全新的。如果有更好的解决方案那么棒!

值得注意的是,我的网站的某些部分(例如仪表板部分)将允许一些UserRoles控制对由SQL表控制的仪表板的自定义访问 - 但我可以在将来看到这一点。

1 个答案:

答案 0 :(得分:1)

我以为我会自己回答这个问题,只是对别人有用。我实现了自己的自定义角色提供程序并连接到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.config中:

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