>从模型中获取角色列表.
>删除指定用户的现有角色.
>使用模型中的列表添加角色.
>如果出现错误,请在事务中执行此 *** 作.
我在控制器中的代码如下:
var user = await _userManager.FindByIDAsync(ID); if (user == null) { return VIEw("Error"); } using (_context.Database.BeginTransaction()) { var removeResult = await _userManager.RemoveFromrolesAsync(user,await _userManager.GetRolesAsync(user)); if (!removeResult.Succeeded) { return VIEw("Error"); } var addResult = await _userManager.AddToRolesAsync(user,model.MemberRoles); if (!addResult.Succeeded) { return VIEw("Error"); } }
其中model.MemberRoles为List< string>角色.奇怪的是,这个过程在_userManager.RemoveFromrolesAsync上失败,即使我将用户的现有角色直接传递给函数.我试过抛弃UserManager类并使用ef,但没有运气.我还验证了模型中的角色与数据库中的角色匹配.是否有任何明显错误会导致失败?谢谢.
编辑
这是我遇到的错误:
InvalIDOperationException: Role adminISTRATOR does not exist.Microsoft.AspNetCore.IDentity.EntityFrameworkCore.UserStore`4.<AddToRoleAsync>d__32.MoveNext()--- End of stack trace from prevIoUs location where exception was thrown ---
以下是我的数据库中定义的角色:
解决方法 当您尝试将用户添加到角色时,它首先尝试查找角色.在sql Profiler中,您可以看到它实际上是通过normalizedname字段而不是name字段进行搜索.exec sp_executesql N'SELECT top(2) [r].[ID],[r].[ConcurrencyStamp],[r].[name],[r].[normalizedname]FROM [AspNetRoles] AS [r]WHERE [r].[normalizedname] = @__normalizedRolename_0',N'@__normalizedRolename_0 nvarchar(256)',@__normalizedRolename_0=N'adminISTRATOR'
解决方案是在创建角色时将normalizedname字段设置为name字段的大写:
所以在SeedData类中:
/* Create Roles */IEnumerable<UserRole> allRoles = Enum.GetValues(typeof(UserRole)).Cast<UserRole>();foreach (UserRole role in allRoles){ if (!await roleManager.RoleExistsAsync(role.ToString())) { await roleManager.CreateAsync(new IDentityRole { name = role.ToString(),normalizedname = role.ToString().toupper() }); }}总结
以上是内存溢出为你收集整理的c# – ASP标识角色不存在错误全部内容,希望文章能够帮你解决c# – ASP标识角色不存在错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)