从用户 MVC 5 中删除所有角色

Posted

技术标签:

【中文标题】从用户 MVC 5 中删除所有角色【英文标题】:Remove all Roles from a user 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

【问题讨论】:

【参考方案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 .";
    

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

【讨论】:

以上是关于从用户 MVC 5 中删除所有角色的主要内容,如果未能解决你的问题,请参考以下文章

如何从用户 discord.js v12 中删除所有角色?

Discord.js - 删除所有包含角色的用户的命令

如何在 ASP.NET MVC 5 中列出具有角色名称的用户

在 asp.net mvc 5 中使用身份自定义用户和角色

获取所有用户及其角色进入表 asp.net mvc

ASP。 NET MVC 5:如果用户是管理员,则返回所有用户的列表