ASP.NET C#-使用表单身份验证设置基于角色的安全性

ASP.NET C#-使用表单身份验证设置基于角色的安全性,c#,asp.net,forms-authentication,C#,Asp.net,Forms Authentication,我继承了一个ASP.NET C#应用程序,但它并没有完全正常工作。我被告知使用表单身份验证来防止未经授权的用户访问某些子目录 我在理解表单身份验证时遇到问题。这是一个公共互联网站点,所有用户都可以访问该站点的主要部分。但是,有一个子目录仅限于某些用户。我知道用户是有效的,因为他们将输入用户名和密码,我将在数据库中查找它们。我已将这些行添加到子目录的web.config文件中 <configuration> <appSettings/> <connec

我继承了一个ASP.NET C#应用程序,但它并没有完全正常工作。我被告知使用表单身份验证来防止未经授权的用户访问某些子目录

我在理解表单身份验证时遇到问题。这是一个公共互联网站点,所有用户都可以访问该站点的主要部分。但是,有一个子目录仅限于某些用户。我知道用户是有效的,因为他们将输入用户名和密码,我将在数据库中查找它们。我已将这些行添加到子目录的web.config文件中

<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <authorization>
      <allow roles="Administrators, Examiners"/>
            <deny users="*"/>
        </authorization>
    </system.web>

问题是如何在代码中设置用户属于某个角色

这是伪代码

如果用户名和密码匹配,则

将此用户角色设置为检查者


我不知道将用户设置为角色所需的代码。

本节介绍了有关表单身份验证的所有信息。这是一个非常基本的、循序渐进的过程,希望您在遵循这一过程中不会遇到任何问题。

关于表单身份验证,您需要了解的所有信息都包含在本手册中。这是一个非常基本的、循序渐进的过程,所以希望您在遵循它时不会遇到任何问题。

您需要实现一个与数据库一起使用的成员资格和角色提供程序。成员资格提供程序将对用户进行身份验证,并跟踪哪个用户已登录。角色提供程序将确定用户拥有哪些权限

就.NET成员资格和角色提供程序而言,您似乎从错误的方向解决了问题。NET framework将使用成员资格提供程序对用户进行身份验证,并通过角色提供程序告诉应用程序用户拥有哪些权限,而不是先验证用户,然后告诉Microsoft的成员资格和角色库谁已登录以及他们拥有哪些权限。基本上,您将为成员资格和角色提供者构建插件


有关实现成员资格提供程序的更多信息,以及有关实现角色提供程序的类似信息,请参见。

您需要实现与数据库一起使用的成员资格和角色提供程序。成员资格提供程序将对用户进行身份验证,并跟踪哪个用户已登录。角色提供程序将确定用户拥有哪些权限

就.NET成员资格和角色提供程序而言,您似乎从错误的方向解决了问题。NET framework将使用成员资格提供程序对用户进行身份验证,并通过角色提供程序告诉应用程序用户拥有哪些权限,而不是先验证用户,然后告诉Microsoft的成员资格和角色库谁已登录以及他们拥有哪些权限。基本上,您将为成员资格和角色提供者构建插件


有关实现成员资格提供程序的更多信息,以及有关实现角色提供程序的类似信息,请参阅。

查看您的成员资格数据库

  • 您可以在这里创建自己的成员数据库。在那里,您将找到一个名为aspnet_roles的表。在此表中,您可以定义不同的角色
  • 还有一个很好的教程,介绍如何使用内置来维护您的成员数据库,您也可以查看该数据库
要从这里开始,请使用登录方法:

protected void LoginButton_Click(object sender, EventArgs e)
{
 // Validate the user against the Membership framework user store
 if (Membership.ValidateUser(UserName.Text, Password.Text))
 {
 // Log the user into the site
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
 }
 // If we reach here, the user's credentials were invalid
 InvalidCredentialsMessage.Visible = true;
}
您可以在authenticate方法中检查用户凭据:

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
 // Get the email address entered
 TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;
 string email = EmailTextBox.Text.Trim();

 // Verify that the username/password pair is valid
 if (Membership.ValidateUser(myLogin.UserName, myLogin.Password))
 {
 // Username/password are valid, check email
 MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
 if (usrInfo != null && string.Compare(usrInfo.Email, email, true) == 0)
 {
 // Email matches, the credentials are valid
 e.Authenticated = true;
 }
 else
 {
 // Email address is invalid...
 e.Authenticated = false;
 }
 }
 else
 {
 // Username/password are not valid...
 e.Authenticated = false;
 }
}
要根据特定角色进行重定向,请使用以下代码:

protected void Login1_LoggedIn(object sender, EventArgs e)
{
    if (Roles.IsUserInRole(Login1.UserName, "Admin"))
    {
         Response.Redirect("~/Admin/Default.aspx");
    }
    else if (Roles.IsUserInRole(Login1.UserName, "Examiner"))
    {
         Response.Redirect("~/Examiner/Default.aspx");
    }
    else
    {
         Response.Redirect("~/Login.aspx");
    }
}

看看你的会员数据库

  • 您可以在这里创建自己的成员数据库。在那里,您将找到一个名为aspnet_roles的表。在此表中,您可以定义不同的角色
  • 还有一个很好的教程,介绍如何使用内置来维护您的成员数据库,您也可以查看该数据库
要从这里开始,请使用登录方法:

protected void LoginButton_Click(object sender, EventArgs e)
{
 // Validate the user against the Membership framework user store
 if (Membership.ValidateUser(UserName.Text, Password.Text))
 {
 // Log the user into the site
 FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
 }
 // If we reach here, the user's credentials were invalid
 InvalidCredentialsMessage.Visible = true;
}
您可以在authenticate方法中检查用户凭据:

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
 // Get the email address entered
 TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;
 string email = EmailTextBox.Text.Trim();

 // Verify that the username/password pair is valid
 if (Membership.ValidateUser(myLogin.UserName, myLogin.Password))
 {
 // Username/password are valid, check email
 MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
 if (usrInfo != null && string.Compare(usrInfo.Email, email, true) == 0)
 {
 // Email matches, the credentials are valid
 e.Authenticated = true;
 }
 else
 {
 // Email address is invalid...
 e.Authenticated = false;
 }
 }
 else
 {
 // Username/password are not valid...
 e.Authenticated = false;
 }
}
要根据特定角色进行重定向,请使用以下代码:

protected void Login1_LoggedIn(object sender, EventArgs e)
{
    if (Roles.IsUserInRole(Login1.UserName, "Admin"))
    {
         Response.Redirect("~/Admin/Default.aspx");
    }
    else if (Roles.IsUserInRole(Login1.UserName, "Examiner"))
    {
         Response.Redirect("~/Examiner/Default.aspx");
    }
    else
    {
         Response.Redirect("~/Login.aspx");
    }
}

浏览下面给出的链接


[

浏览下面给出的链接


[

这很有帮助。我发现我的前任已经创建了我需要的表。web配置也设置好了,但没有代码。我可以将web.config更改为指向我的本地数据库。然后,当我向它提供一个示例用户和密码时,你给我的Membership.ValidateUser的调用起了作用。我遇到的问题是我的密码不正确我的用户是加密的,所以我无法知道有什么。所以我需要代码来创建一个用户,并给他一个密码或修改现有用户的密码,这样我就可以成功地得到一个呼叫。我知道我需要什么。虽然其他答案也很有用,但我将你的答案标记为最佳答案。@Bob,我很高兴这有帮助。密码验证ORD是在服务器端完成的,您不必担心。您可以单击“向上投票”按钮来获得所有有用的答案,而不接受他们的答案,以给每个人一些信任。这很有用。我发现我的前任已经创建了我需要的表。web配置也已设置,但没有代码。我可以将web.config更改为point到我的本地数据库。然后你给我的会员资格。ValidateUser在我向它提供一个示例用户和密码时起作用。我的问题是,我为我的用户提供的密码是加密的,所以我无法知道有什么。所以我需要代码来创建一个用户并给他一个密码或修改现有用户的密码,以便接到一个成功的电话。我知道我需要什么。虽然其他答案也很有帮助,但我将你的答案标记为最好的。@Bob,我很高兴这有帮助。密码验证是d