【问题标题】:SqlException: Invalid object name 'OpenIddictTokens'SqlException:无效的对象名称“OpenIddictTokens”
【发布时间】:2017-06-14 15:49:33
【问题描述】:

当我尝试登录时出现错误: 处理请求时发生未处理的异常。

SqlException:对象名称“OpenIddictTokens”无效。 System.Data.SqlClient.SqlCommand+c.b__107_0(任务 结果)

DbUpdateException:更新条目时出错。看 有关详细信息的内部异常。 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch+d__32.MoveNext()

为了确认,这是输出窗口的输出:

插入 [OpenIddictTokens] ([ApplicationId], [AuthorizationId], [主题],[类型])值(@p0,@p1,@p2,@p3);从 [ID] 中选择 [OpenIddictTokens] WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity(); 抛出异常:'System.Data.SqlClient.SqlException' Microsoft.EntityFrameworkCore.Relational.dll

我注意到数据库中没有一个 OpenIddict 表。有很多使用 OpenIddictDbContext 的示例,我使用的是 but there is a new approach,但有些东西不起作用。

我的启动文件是:

public void ConfigureServices(IServiceCollection services)
{
    try
    {
        services.AddMvc();

        services.AddEntityFrameworkSqlServer();

        services.AddScoped<UserStore<AppUser, AppRole, AppDbContext, int, AppUserClaim, AppUserRole, AppUserLogin, AppUserToken, AppRoleClaim>, AppUserStore>();
        services.AddScoped<UserManager<AppUser>, AppUserManager>();
        services.AddScoped<RoleManager<AppRole>, AppRoleManager>();
        services.AddScoped<SignInManager<AppUser>, AppSignInManager>();
        services.AddScoped<RoleStore<AppRole, AppDbContext, int, AppUserRole, AppRoleClaim>, AppRoleStore>();

        var connection = Configuration["ConnectionStrings"];
        services.AddDbContext<AppDbContext>(options => {
            options.UseSqlServer(connection);
            options.UseOpenIddict<int>();
        });

        services
            .AddIdentity<AppUser, AppRole>()
            .AddUserStore<AppUserStore>()
            .AddUserManager<AppUserManager>()
            .AddRoleStore<AppRoleStore>()
            .AddRoleManager<AppRoleManager>()
            .AddSignInManager<AppSignInManager>()
            .AddDefaultTokenProviders();

        services.AddOpenIddict<int>()
            .AddEntityFrameworkCoreStores<AppDbContext>()
            .AddMvcBinders()
            .EnableTokenEndpoint("/API/authorization/token")
            .AllowPasswordFlow()
            .AllowRefreshTokenFlow()
            .DisableHttpsRequirement();

        services.AddSingleton<DbSeeder>();

    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        throw;
    }
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, DbSeeder dbSeeder)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
        {
            HotModuleReplacement = true
        });
    }
    else
    {

    }

    app.UseStaticFiles();

    app.UseIdentity();

    app.UseOpenIddict();

    app.UseOAuthValidation();

    app.UseMvc();

    try
    {

        dbSeeder.SeedAsync();
    }
    catch (AggregateException e)
    {
        throw new Exception(e.ToString());
    }
}

}

还有我的 DbContext:

public partial class AppDbContext : IdentityDbContext<AppUser, AppRole, int, AppUserClaim, AppUserRole, AppUserLogin, AppRoleClaim, AppUserToken>
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //fix table names
        modelBuilder.Entity<AppUser>(b =>
        {
            b.ToTable("Users");
        });

        modelBuilder.Entity<AppRole>(b =>
        {
            b.ToTable("Roles");
        });

        modelBuilder.Entity<AppUserClaim>(b =>
        {
            b.ToTable("UserClaims");
        });

        modelBuilder.Entity<AppRoleClaim>(b =>
        {
            b.ToTable("RoleClaims");
        });

        modelBuilder.Entity<AppUserRole>(b =>
        {
            b.ToTable("UserRoles");
        });

        modelBuilder.Entity<AppUserLogin>(b =>
        {
            b.ToTable("UserLogins");
        });

        modelBuilder.Entity<AppUserToken>(b =>
        {
            b.ToTable("UserTokens");
        });


        //add our

我覆盖了我的所有身份类(IdentityRole、IdentityRoleClaim、IdentityUser ...)以使用 &lt;int&gt; 作为 TKey。

我不知道为什么没有创建 OpenIdDict 表。我已经删除了我的数据库,创建新的并运行

dotnet ef migrations add "Initial" -o "Data\Migrations"
dotnet ef database update

,但只创建身份表。

【问题讨论】:

    标签: asp.net-core openid-connect openiddict


    【解决方案1】:

    如果我打电话给modelBuilder.UseOpenIddict&lt;int&gt;(),它会有所帮助(创建表格):

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.UseOpenIddict<int>();
    
        //fix table names
    

    【讨论】:

    • 我不得不跳过 因为我使用默认的身份模型,但你的回答让我到了那里。 :)
    【解决方案2】:

    查看“startup.cs”类和“appsettings.json”配置文件中的连接字符串。在我的例子中是 SQL Server Express 实例的名称。

    【讨论】:

      【解决方案3】:

      在您的包管理器控制台中执行此操作:

      add-migration
      

      然后

      update-database
      

      它应该修复错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        相关资源
        最近更新 更多