存储未实现IUserRoleStore <tuser> ASP.NET Core 2.1身份

时间:2018-09-26 16:22:00

标签: c# asp.net-core .net-core asp.net-identity asp.net-core-2.1

我正在使用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)}

3 个答案:

答案 0 :(得分:24)

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

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

应该是

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

注意:顺序很关键。 AddRoles必须先于AddEntityFrameworkStores

答案 1 :(得分:0)

我知道作者已经解决了他的问题,但是我将为执行上述答案中所有步骤并且仍然有此错误的任何人添加此问题。

来自 Aspnet github

您必须在 Areas / Identity / IdentityHostingStartup.cs

中删除自动生成的IdentityHostingStartup.Configure方法。

答案 2 :(得分:0)

由于 asp.net Core 2.2 中没有关于该解决方案的任何答案,我想与我在 asp.net Core 2.2 中遇到的相同错误共享< / p>

首先,这是针对 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中)时,我遇到了问题。当我说完步骤并尝试运行项目时,它会引发异常“存储未实现IUserRoleStore”

问题是:实际上,这是asp.net core 2.1的示例(而且我强烈怀疑,为什么Microsoft将为用户提供文档中没有任何示例代码的文档,这可能没有道理) >

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

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

与您应在步骤 /Program.cs ConfigureService 中添加的代码相同:在提到的文档中为Identity添加角色服务

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

因此,如果您在asp.net core 2.2中遇到相同的问题,另一种解决方案是:

  1. 按照asp.net 2.2中的文档
  2. 遇到本章:向Identity添加角色服务时,只需忽略官方文档即可:

替换行

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中删除) / p>

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