【问题标题】:Remove all Roles from a user MVC 5从用户 MVC 5 中删除所有角色
【发布时间】:2017-04-25 18:27:22
【问题描述】:

愿你平安

我正在尝试删除用户的所有角色以禁用他的权限并阻止他访问某些页面。

我发现这种方法可以删除一个角色并且它有效:

await UserManager.RemoveFromRoleAsync(userid, role);

其中 userid 是我要禁用他的权限的用户 ID。

所以,我使用此代码删除同一用户的所有角色

foreach (string role in roles) {

 await UserManager.RemoveFromRoleAsync(userid, role);

}

但我卡在这里如何将 AspNetRoles 表中的角色 ID 保存到

string[] roles 

有什么帮助吗?

或者还有其他方法可以删除用户的所有角色吗?

我正在使用 asp.net 身份版本 2

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity-2


    【解决方案1】:

    用户管理器有一个Task<IList<string>> GetRolesAsync(TKey userId)方法

    返回用户的角色

    还有Task<IdentityResult> RemoveFromRolesAsync(TKey userId, params string[] roles)那个

    从多个角色中删除用户

    所以结合两者来实现你想要的

    var roles = await UserManager.GetRolesAsync(userid);
    await UserManager.RemoveFromRolesAsync(userid, roles.ToArray());
    

    【讨论】:

    • 感谢您的快速回复。。当我使用写的两行时,出现错误消息:无法从Ilist转换为字符串,我通过使用await UserManager解决了这个问题。 RemoveFromRolesAsync(userid, roles.ToString());但角色并未移除
    • 我的错误。将角色转换为字符串数组。原始调用返回一个列表,但第二个方法需要一个数组。我忘记将其转换为数组。我已经更新了答案以反映变化。
    • 工作.. 非常感谢!
    • UserManager.Delete 会自动删除角色吗?
    • 显然您必须先获取角色,然后将它们转换为数组。单独调用RemoveFromRolesAsync(user, new string[] { "Administrator" } 是行不通的!因为没有在 .NET Core 的 Identity 实现的上下文中获取角色?我简直不敢相信,但直接调用 remove 方法没有结果。
    【解决方案2】:

    我不熟悉这一切,但我尝试从 Blazor 页面更新和删除角色。这段代码似乎有效。

    设置使用和注入:

    @using Microsoft.AspNetCore.Identity
    @using Microsoft.Extensions.Configuration
    
    @inject RoleManager<IdentityRole> roleManager
    @inject UserManager<IdentityUser> userManager
    @inject SignInManager<IdentityUser> signInManager
    @inject AuthenticationStateProvider userData
    

    页面元素代码:

    <h3>Access Roles</h3>
    
    <select class="custom-select custom-select-sm" @onchange="SetUserAccess">
        <option value="-1" disabled selected>Select access...</option>
    
        @foreach (var access in typeAccess)
        {
            <option value="@access">@access</option>
        }
    
    </select>
    
    <p>
        <h5>@message</h5>
    </p>
    

    C#代码:

    @code
    {
        private UserRoles _userRoles = new UserRoles();
        private List<string> typeAccess = new List<string>();
        private IList<string> oldRoles = new List<string>();
        private string newRole = "";
        private string message = "";
    
    
    
        protected override void OnParametersSet()
        {
            base.OnParametersSet();
            typeAccess.Add("Administrator");
            typeAccess.Add("Employee");
            typeAccess.Add("Office Staff");
        }
    
        private async Task SetUserAccess(ChangeEventArgs selectedAccess)
        {
            foreach (var role in typeAccess)
            {
                var roleExist = await roleManager.RoleExistsAsync(role);
    
                if (roleExist == false)
                {
                    await roleManager.CreateAsync(new IdentityRole(role));
                }
            }
    
            var authState = await userData.GetAuthenticationStateAsync();
            string userName = authState.User.Identity.Name;
            var user = await userManager.FindByEmailAsync(userName);
            
    
            if (user != null)
            {
                oldRoles = await userManager.GetRolesAsync(user);
                newRole = selectedAccess.Value.ToString();
    
                @for (int i = 0; i < oldRoles.Count; i++)
                {
                    await userManager.RemoveFromRolesAsync(user, oldRoles);
                }
    
                await userManager.AddToRoleAsync(user, newRole);
            }
    
            message = $"{ userName } has had their role changed from { oldRoles[0] } to { newRole }.";
        }
    }
    

    这会删除所有现有角色并设置新角色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-06
      • 2015-07-21
      • 1970-01-01
      • 2020-09-24
      • 2020-12-27
      • 2018-11-29
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多