ASP.NET 成员资格和角色提供程序






4.80/5 (26投票s)
简要描述如何使用 ASP.NET 中可用的成员资格和角色提供程序
引言
ASP.NET 2.0 提供了内置控件来管理 Web 应用程序中的成员资格。所有这些控件都使用 ASP.NET 提供程序,这些提供程序通过 web.config 文件加载。 成员资格提供程序和角色提供程序允许完整的系统来维护用户信息、验证用户身份和授权用户。 本文演示了如何使用和配置默认的成员资格和角色提供程序。
实现成员资格和角色提供程序
最初,使用 Visual Studio 2005/2008/2010 创建一个 ASP.NET 网站/Web 应用程序。 如果您使用的是 Visual Studio 2010,则登录和注册页面在应用程序中默认可用。 创建注册页面,然后从工具箱的登录控件部分拖动创建用户向导控件。 现在,为了存储用户信息,我们需要在 SQL Server 中创建数据库。 按照下面给出的步骤来使用内置的用户存储架构来维护用户信息。
- 转到 Visual Studio,Visual Studio 工具,然后打开 Visual Studio 命令提示符。
- 使用 aspnet_regsql.exe 命令来运行 ASP.NET SQL Server 安装向导。
- 选中“为应用程序服务配置 SQL Server”选项。
- 选择服务器实例和应用程序的数据库名称,如果未提供数据库名称,则会创建默认的
aspnetdb
数据库。 - 单击“确认设置”和“完成”按钮以创建数据库存储。
步骤 1

第二步

步骤 3

步骤 4

步骤 5

准备构建用于应用程序的安全系统,我们需要在 web.config 文件中配置成员资格提供程序。 以下 Forms 身份验证、成员资格和角色提供程序的设置应用于 web.config 文件。
Forms 身份验证设置
system.web 标记下的身份验证模式设置为“Forms
”,包含的元素包括 loginUrl
、defaultUrl
、timeout
、cookieless
和 protection
,它们分别指定登录页面 URL、默认页面 URL、cookie 过期时间和保护级别。web.config 文件中的设置将类似于下面显示的代码
<authentication mode="Forms">
<forms cookieless="UseCookies" defaultUrl="HomePage.aspx"
loginUrl="UnAuthorized.aspx" protection="All" timeout="30">
</forms>
</authentication>
成员资格提供程序设置
成员资格提供程序中需要考虑的一些重要元素是:name - 提供程序的名称,type - 提供程序的命名空间,connectionStringName - 连接字符串的名称,以及最重要的密码格式。 密码格式有三种格式:Hashed、Encrypted 和 Clear。 Hashed 格式提供了一种以加密格式存储密码的方式,该密码无法恢复到原始状态,而 Encrypted 格式提供加密和解密密码的功能。
<membership defaultProvider="Demo_MemberShipProvider">
<providers>
<add name="Demo_MemberShipProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="cnn"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10" passwordStrengthRegularExpression="">
</providers>
</membership>
角色提供程序设置
类似的方式是在 web.config 文件的 system.web 标记下指定默认提供程序的设置,如下所示。 这些设置简单且易于理解。
<roleManager enabled="true" cacheRolesInCookie="true"
cookieName="TBHROLES" defaultProvider="Demo_RoleProvider">
<providers>
<add connectionStringName="dld_connectionstring"
applicationName="/" name="Demo_RoleProvider"
type="System.Web.Security.SqlRoleProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
在 login.aspx 和 Registration.aspx 页面中,我们需要使用提供程序来完成应用程序的成员资格系统。
注册用户

可以使用可用的创建用户向导和以下事件处理程序轻松创建用户的注册页面
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
MembershipCreateStatus p = MembershipCreateStatus.Success;
Membership.CreateUser(CreateUserWizard1.UserName,
CreateUserWizard1.Password, CreateUserWizard1.Email,
CreateUserWizard1.Question, CreateUserWizard1.Answer, true, out p);
}
protected void CreateUserWizard1_ContinueButtonClick(object sender, EventArgs e)
{
Response.Redirect("login.aspx");
}
验证用户

可以使用 Login 控件的 login_Authenticate
事件来验证用户。 用于验证用户的代码放在这里
protected void Login1_Authenticate(object sender,AuthenticateEventArgs e)
{
if (Membership.ValidateUser(Login1.UserName, Login1.Password) == true)
{
Login1.Visible = true;
Session["user"] = User.Identity.Name;
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, true);
}
else
{
Response.Write("Invalid Login");
}
}
创建管理面板

在管理面板中,向管理员提供添加、编辑、删除和为用户分配角色的功能。
创建角色
以下代码片段显示了如何创建角色
Public void createRoles()
{
try
{
if (!Roles.RoleExists(txtrolename.Text))
{
Roles.CreateRole(txtrolename.Text);
BindUsers();
BindRoles();
Label1.Text = "Role(s) Created Successfully";
}
else
{
Label1.Text = "Role(s) Already Exists";
}
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
BindRoles
BindRoles
方法用于将存储中的可用角色绑定到用户控件。
public void BindRoles()
{
SqlDataAdapter da = new SqlDataAdapter("select RoleName from aspnet_Roles", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "Roles");
lstRoles.DataSource = ds;
lstRoles.DataTextField = "RoleName";
lstRoles.DataValueField = "RoleName";
lstRoles.DataBind();
}
BindUsers
BindUsers
方法用于将存储中的可用用户绑定到用户控件。
public void BindUsers()
{
SqlDataAdapter da = new SqlDataAdapter("select UserName from aspnet_users", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "Roles");
lstusers.DataSource = ds;
lstusers.DataTextField = "UserName";
lstRoles.DataValueField = "RoleName";
lstusers.DataBind();
}
以下方法采用 username
和 rolename
作为参数。
将角色分配给用户
可以按以下方式将可用角色分配给用户
private void AssignRoles()
{
try
{
if (!Roles.IsUserInRole(lstRoles.SelectedItem.Text))
{
Roles.AddUserToRole(lstusers.SelectedItem.Text,
lstRoles.SelectedItem.Text);
BindUsers();
BindRoles();
Label1.Text = "User Assigned To User Successfully";
}
else
{
Label1.Text = "Role(s) Already Assigned To User";
}
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
从用户中删除角色
您可以按以下方式从角色中删除用户
private void RemoveuserFromRole()
{
try
{
Roles.RemoveUserFromRole(lstusers.SelectedItem.Text, lstRoles.SelectedItem.Text);
BindUsers();
BindRoles();
Label1.Text = "User Is Removed From The Role Successfully";
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
删除角色
如果现有角色未使用,则可以使用该代码删除它们。
public void RemoveRole()
{
try
{
Roles.DeleteRole(lstRoles.SelectedItem.Text);
BindUsers();
BindRoles();
Label1.Text = "Role(s) Removed Successfully";
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
通过使用 web.config 设置来限制用户,具体如下
<authorization
<allow roles ="Admin"/>
<deny users ="*"/>
</authorization>
在上面的代码中,如果您编写 deny users =”*”
,然后 allow roles =”Admin”
,似乎没有区别,但该代码将无法正常工作,因为在开头编写 deny user =”*”
甚至会限制管理员访问文件夹。
根据角色显示/隐藏用户的菜单项
if (Roles.IsUserInRole("Admin"))
{
Menu1.Items[0].Text = "Admin";
}
else
{
Menu1.Items[0].Text = "";
}
结论
我们已经了解了使用可用的现成提供程序来实现 ASP.NET 应用程序的成员资格和角色的概述。 有关 Forms 身份验证、成员资格和角色提供程序的更多详细信息,您可以参考以下链接
历史
- 2011 年 11 月 9 日:初始版本
- 2011 年 11 月 27 日:更新了代码并将图像添加到文章中