C# 自定义角色身份验证ASP.NET 4.5

C# 自定义角色身份验证ASP.NET 4.5,c#,asp.net,webforms,C#,Asp.net,Webforms,我正在努力创建自己的用户访问角色,并利用IIdentity和IPrincipal类 编辑 我一直在看,但我不能让它工作 我创建了一个简单的终端用户表,其中包含电子邮件、密码和角色列。但是目前,我不认为这些角色没有被解析为身份或原则,我也不确定如何做到这一点 我已经看了一些指南,大多数指南要么依靠VS和.NET Framework为您构建基础,提供许多外观笨拙的表,要么是MVC,这一点都没有帮助 在我的表中,我定义了三个角色,分别是客户、销售和管理员,我希望某些用户无法访问某些页面。这些在我的we

我正在努力创建自己的用户访问角色,并利用IIdentity和IPrincipal类

编辑

我一直在看,但我不能让它工作

我创建了一个简单的终端用户表,其中包含电子邮件、密码和角色列。但是目前,我不认为这些角色没有被解析为身份或原则,我也不确定如何做到这一点

我已经看了一些指南,大多数指南要么依靠VS和.NET Framework为您构建基础,提供许多外观笨拙的表,要么是MVC,这一点都没有帮助

在我的表中,我定义了三个角色,分别是客户、销售和管理员,我希望某些用户无法访问某些页面。这些在我的webconfig中反映为拒绝全局访问,但仅在经过身份验证的情况下才允许访问某些角色

目前,登录功能正在运行,除非用户登录,否则将拒绝用户,但不考虑特定角色。我有一个对象存储在整个站点所有用户数据的会话中,但在web配置中完全忽略了“角色”

最终,我需要对uRole做些什么,但我不确定做什么或如何做

有人能给我指一下正确的方向吗

非常感谢

登录C#:


几个月前,当我试图解决这个问题时,我遇到了这个问题。您目前正在登录,根据您展示的代码,我必须假设这是一个带有预构建web表单工具包的web表单项目。因此,您仍然使用OWIN登录

不是基于代码的演练,但这是您需要做的,如果您遇到困难,我很乐意提供进一步帮助:

  • 更改global.asax,以便它在
    应用程序\u AthenticateRequest
    上对用户进行身份验证,并删除其方法中与OWIN相关的任何内容
  • 您需要一个从
    IIdentity
    派生的类,并接受username、authtype和isAuthenticated的参数,还需要一个从
    IPrincipal
    派生的类,该类将包含派生的
    IIdentity
    ,以及角色。我选择了公共getter和setter以及私有变量,比如name、is-auth等
  • 一个获取用户身份的类,在这个类中,您将获得密码和用户名,并创建要设置的派生
    IIdentity
    的实例,同时检查数据库中保存的信息
  • 全局方法
    应用程序\u AthenticateRequest
    需要在每次页面加载时验证用户,因此您需要有一个方法来创建派生
    IPrincipal
    的实例,通过抓取派生
    IIdentity
    并检查用户所扮演的角色来检查用户是否经过身份验证
  • 修改webconfig,使其使用
    表单身份验证
    ,而不使用OWIN,因此在
    应用设置
    中添加
    ,因为我假设您有一个预构建的站点,不要尝试删除OWIN,只需禁用它即可 然后,您应该能够登录,并且您声明的自定义角色将被派生的
    IIdentity
    使用,而派生的
    IIdentity将被webconfig基于位置的安全性确认

    希望这能帮助你和其他人

    public partial class Login : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void logindd_Click(object sender, EventArgs e)
        {
            EndUser newEndUser = new EndUser();
    
            string user = ((TextBox)loginForm1.FindControl("UserName")).Text;
            string conRef = ((TextBox)loginForm1.FindControl("Password")).Text;
    
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString))
            {
                try
                {
                    con.Open();
                    string checkIdent = @"SELECT Count(*) FROM EndUser WHERE EndUser.Email=@email AND EndUser.Password=@pass";
                    using (SqlCommand cmd = new SqlCommand(checkIdent, con))
                    {
                        cmd.Parameters.AddWithValue("@email", user);
                        cmd.Parameters.AddWithValue("@pass", pass);
    
                        int chk = (int)cmd.ExecuteScalar();
    
                        if (chk > 0)
                        {
                            //grabbing user role
                            SqlCommand cmd2 = new SqlCommand("SELECT EndUser.Role FROM EndUser WHERE EndUser.Password=@pass;",con);
                            cmd2.Parameters.AddWithValue("@pass", pass);
                            SqlDataReader sdr = null;
                            sdr = cmd2.ExecuteReader();
                            sdr.Read();
                            string uRole = sdr["Role"].ToString();
    
                            UserIdentity userr = new UserIdentity(user, true, uRole);
                            userr.Roles.Add(uRole);
                            FormsAuthentication.Initialize();
                            FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, user, DateTime.Now, DateTime.Now.AddMinutes(30), false, userr.Roles.ToString());
                            Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(fat)));
    
                            newEndUser.email = user;
                            newEndUser.pass = pass;
                            Session["EndUserObj"] = newEndUser;
    
                            FormsAuthentication.RedirectFromLoginPage(user, false);
                        }
                        else
                        {
                            ErrorLbl.Visible = true;
                            ErrorLbl.Text = "Details are incorrect";
                        }
                    }
                }
                catch (Exception er)
                {
                    ErrorLbl.Visible = true;
                    ErrorLbl.Text = er.ToString();
                }
            }
        }
    }