Store 未实现 IUserRoleStore<TUser> ASP.NET Core Identity

问题描述 投票:0回答:4

我正在使用 ASP.NET Core 2.1 身份。 我已经覆盖了 IdentityUser,因为我需要为用户添加一些附加属性。

在 Startup.cs 中

services.AddDefaultIdentity<PortalUser>().AddEntityFrameworkStores<ApplicationDbContext>();

ApplicationDbContext.cs

public partial class ApplicationDbContext : IdentityDbContext<PortalUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {

    }
}

PortalUser类

public class PortalUser : IdentityUser
{
    [PersonalData]
    public DateTime? LastLoginDateUtc { get; set; }

    [PersonalData]
    public DateTime? RegistrationDateUtc { get; set; }
}

一切正常。 我可以通过添加用户。

_userManager.CreateAsync(user)

但是,当我调用 AddToRolesAsync 向用户添加角色时,出现异常。 有什么想法吗?

_userManager.AddToRolesAsync(user, new List<string> { roleName });

{System.NotSupportedException: Store does not implement IUserRoleStore<TUser>.
   at Microsoft.AspNetCore.Identity.UserManager`1.GetUserRoleStore()
   at Microsoft.AspNetCore.Identity.UserManager`1.AddToRolesAsync(TUser user, IEnumerable`1 roles)}
c# asp.net-core .net-core asp.net-identity asp.net-core-2.1
4个回答
118
投票

在 Startup.cs 中,我缺少 AddRoles 所以

services.AddDefaultIdentity<PortalUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

应该是

services.AddDefaultIdentity<PortalUser>()
    .AddRoles<IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

注意:顺序很重要。

AddRoles
必须先于
AddEntityFrameworkStores


7
投票

由于asp.net Core 2.2中没有任何关于解决方案的答案,我想分享我在asp.net Core 2.2

中遇到的相同错误

首先,这是 asp.net core 2.1 中相同错误的另一个解决方案 https://github.com/aspnet/AspNetCore.Docs/issues/8683

感谢作者的想法,当我按照asp.net core 2.2中的官方指导(网址在这里:MicrosoftDocs For asp.net core 2.2)时遇到了问题。当我完成他所说的步骤并尝试运行该项目时,它抛出一个异常 “Store 未实现 IUserRoleStore”

问题是:实际上,这是asp.net core 2.1的示例(我强烈怀疑为什么微软会向用户提供没有任何示例代码的文档,这可能没有意义)

你会发现,在 Areas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup::Configure 方法中有以下代码:

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

这与您应该在 /Program.cs ConfigureService 中添加的代码相同,作为步骤:在提到的文档中将角色服务添加到身份

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

所以如果你在asp.net core 2.2中遇到同样的问题,另一种解决方案是:

  1. 遵循 asp.net 2.2 中的文档
  2. 当你遇到本章:将角色服务添加到身份时,只需忽略官方文档并执行即可:

更换行

services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();

services.AddDefaultIdentity<IdentityUser>().AddRoles<IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

Areas/Identity/Data/IdentityHostingStartup.cs IdentityHostingStartup::Configure 方法中,但不要在program.cs中添加(该文件在asp.net core 2.2中无法删除)

我使用 Asp.net Identity 的项目稍后将在我的存储库中更新:UWPHelper,祝你好运:)


0
投票

我知道作者已经解决了他的问题,但我会为其他执行了上述答案中的所有步骤但仍然存在此错误的人添加此内容。

来自 Aspnet github

您必须删除 Areas/Identity/IdentityHostingStartup.cs 中自动生成的 IdentityHostingStartup.Configure 方法


0
投票

当我尝试将用户角色添加到我之前在 .NET 9 中工作的应用程序时,遇到了此异常。

我的第一个更改是添加:

.AddRoleStore<RoleStore<IdentityRole<long>, ApplicationDbContext, long>>()
.AddRoleManager<RoleManager<IdentityRole<long>>>()
.AddRoleStore<RoleStore<IdentityRole<long>, ApplicationDbContext, long>>()

至已配置的

builder.Services.AddIdentityCore<IdentityUser<long>>

添加此后,当我尝试做时

using var scope = app.Services.CreateScope();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser<long>>>();
await userManager.IsInRoleAsync(user, "Admin")

我遇到了这个例外。为了解决这个问题,我必须添加

.AddUserStore<UserStore<IdentityUser<long>, IdentityRole<long>, ApplicationDbContext, long>>()

配置时

AddIdentityCore

© www.soinside.com 2019 - 2024. All rights reserved.