【发布时间】:2021-04-25 09:24:30
【问题描述】:
我的应用程序当前在 WebForms 应用程序中使用 FormAuthentication 中的成员资格和角色。
我目前的角色是:
管理员
来宾
用户
创建了一些用户,但从未分配过角色,因为它是直接在数据库中完成的(在我了解成员资格和角色如何工作之前)。
分配了角色的所有用户都是“用户”。在数据库的 UsersInRoles 表中,所有管理员都具有“管理员”角色和“用户”角色。
下面的代码是在我从不同页面上的用户列表数据网格中单击用户之后。用户名通过url参数传递。
我有以下代码:
public partial class editUser : System.Web.UI.Page
{
public MembershipUser usr;
string[] rolesArray;
public string roleChoice;
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["username"] != null)
{
usr = Membership.GetUser(Request.QueryString["username"]);
} else
{
// no user passed, so default to current user
usr = Membership.GetUser(User.Identity.Name);
}
if (!Page.IsPostBack)
{
// Get the list of roles and populate dropdown
rolesArray = System.Web.Security.Roles.GetAllRoles();
RoleDDL.DataSource = rolesArray;
// add a "None" role to anyone that doesn't have a role assigned yet
RoleDDL.Items.Insert(0, new ListItem("None"));
// do not allow a user to be assigned the "Guest" role.
RoleDDL.Items.Remove("Guest");
RoleDDL.DataBind();
// Set current email on page load for the user. If username was passed then that user, otherwise the user that is logged in as an Admin
EmailTextBox.Text = usr.Email;
IsLockedOutCheckbox.Checked = usr.IsLockedOut;
IsApprovedCheckbox.Checked = usr.IsApproved;
// If the user is not locked out, disable the checkbox because you cannot set the checkbox programatically
if (IsLockedOutCheckbox.Checked == false)
{
IsLockedOutCheckbox.Enabled = false;
}
// Select current role for user
string[] currentUserRoles = System.Web.Security.Roles.GetRolesForUser(usr.UserName);
// Choose the current user role from currentUserRoles and assign to DDL. Always choose Admin if it exists, User only if Admin doesn't exist, and None if no roles.
foreach (string value in currentUserRoles) {
if (System.Web.Security.Roles.IsUserInRole(usr.UserName, "Admin"))
{
RoleDDL.SelectedValue = "Admin";
break; // "Admin" users are also "Users" users so break out of the for loop. Otherwise the drop down will select "Users".
}
if (System.Web.Security.Roles.IsUserInRole(usr.UserName, "Users"))
{
RoleDDL.SelectedValue = "Users";
}
else
{
RoleDDL.SelectedValue = "None";
}
}
}
}
}
运行我的代码后的下拉列表如下:
管理员
来宾
用户
我的问题是:
- 删除“来宾”失败,但仍显示在我的下拉列表中。
- 我的下拉列表中无法显示“无”。
我希望用户只选择无、管理员或用户。
我不会让 None 被保存 - 这将给出一个必须选择不同角色的错误。
我将检查当前下拉选择是否与他们所在的角色匹配。
如果有变化,那么:
对于管理员,我将为“管理员”添加角色。
对于用户,我将检查他们是否是管理员,如果是,则检查 RemoveRole("Admin")。
对于没有角色的用户(currentUserRoles 为空),我将添加一个“用户”角色。
我使用 Guest 作为角色以只读方式浏览网站。我不希望这是一个选择。
此外,大多数下拉菜单都有一个键/项和值。我从未将角色分配给下拉列表,所以我是否只在执行“RoleDDL.datasource = rolesArray”时分配键/项目?
我做错了什么?
【问题讨论】:
标签: c# roles membership