【问题标题】:AddToRoleAsync fails to find RoleAddToRoleAsync 找不到角色
【发布时间】:2016-11-23 12:56:36
【问题描述】:

我有一个使用 Asp.net Core Identity 的小型测试应用程序。 在启动时,我检查某些系统角色是否到位:

if(await _roleManager.FindByNameAsync(“SYSADMIN”) == null)
{
  _context.Roles.Add(new IdentityRole(“SYSADMIN”));
  await _context.SaveChangesAsync();
}

然后我检查并创建一个系统管理员帐户,如果它不存在:

var result = await _userManager.CreateAsync(adminUser, config["AdminPassword"]);

然后我尝试将该用户添加到 SYSADMIN 角色:

if (result == IdentityResult.Success)
{                  
  await _userManager.AddToRoleAsync(adminUser, “SYSADMIN”);
}

但是得到一个角色不存在的错误。但是,我可以在 AspNetRoles 中看到具有上述名称的角色,并且当我第二次运行该应用程序时,它不会进入 _context.Roles.Add() 部分,因为 _roleManager.FindByNameAsync 返回角色。

以前有没有人见过这种行为,或者知道它失败的原因?

编辑 我注意到 NormalisedName 虽然在数据库中为 null - 这是它用来匹配的内容吗?

【问题讨论】:

  • 在我看来,您在前后不一致并试图预先规范化角色名称。如果 IDPPlatform.System.Roles.OrgAdmin 是一个字符串常量,可以规范化为 SYSADMIN 你应该在任何地方都使用这个常量。 _roleManager.FindByNameAsync 之类的方法将在方法内部对其进行规范化,因此您无需对其进行预规范化。与 _userManager.AddToRoleAsync 相同
  • 抱歉,这是一个复制/粘贴错误。它确实解析为“SYSADMIN”,并且该常量确实在任何地方都使用,我只是在此示例中替换了它以显示它解析的内容,因为它是放在 SQL Server 中 name 列中的字符串。我注意到 NormalisedName 虽然在数据库中为空 - 这是它用来匹配的内容吗?

标签: asp.net-core asp.net-identity-3


【解决方案1】:

所以这对我来说似乎是一个错误。如果您使用仅接受字符串的构造函数,它会填充名称,但不会填充规范化名称。看起来规范化的名称在AddToRoleAsync 中匹配,所以它永远不会起作用。

我需要使用以下命令来强制填充 NormalizedName:

_context.Roles.Add(new IdentityRole("SYSADMIN")
{
  NormalizedName = "SYSADMIN"
});

它现在正在工作。 我会向团队提交一个错误,希望它会得到修复。

【讨论】:

  • 我遇到了同样的问题。感谢您的解决方法。可能这正是它应该如何工作的。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2020-12-25
相关资源
最近更新 更多