OpenIddict - 刷新令牌流在使用自定义键时导致实体错误

时间:2017-10-22 00:24:27

标签: openiddict

在测试刷新令牌流时,使用指定UseOpenIddict方法(在本例中)的自定义键的重载签名时出现以下错误。

InvalidOperationException:找不到实体类型“OpenIddictAuthorization”。确保已将实体类型添加到模型中。

有趣的是,如果我不使用重载方法使用int作为主键,它可以正常工作,我收到刷新令牌。只有当我使用重载时才会收到此错误。

这是启动时的上下文声明

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddDbContext<RouteManagerContext>(options =>
            {
                options.UseSqlServer(AppSettings.RouteManagerContext);
                options.UseOpenIddict<int>();
            });
            services.AddIdentity<ApplicationUser, ApplicationRole>().AddEntityFrameworkStores<RouteManagerContext>().AddDefaultTokenProviders();
            services.Configure<IdentityOptions>(options =>
            {
                options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name;
                options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
                options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;
            });
            services.AddOpenIddict(options =>
            {
                options.AddEntityFrameworkCoreStores<RouteManagerContext>();
                options.AddMvcBinders();
                options.EnableTokenEndpoint("/connect/token");
                options.AllowPasswordFlow()
                    .AllowRefreshTokenFlow()
                    .SetAccessTokenLifetime(TimeSpan.FromMinutes(1))
                    .SetRefreshTokenLifetime(TimeSpan.FromMinutes(20160))
                options.DisableHttpsRequirement();
            });
            services.AddAuthentication()
                .AddOAuthValidation()
                .AddFacebook(o => { o.ClientId = AppSettings.FacebookAppID; o.ClientSecret = AppSettings.FacebookAppSecret; });
            services.AddDocumentation(AppSettings);
        }

这是我的背景

public class RouteManagerContext : IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
    public RouteManagerContext(DbContextOptions<RouteManagerContext> options) : base(options)  { }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }
}

应用程序似乎配置正确,因为我拥有openiddict需要的数据库中的所有表:应用程序,授权,令牌等......

所有示例似乎都以相同的方式配置。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

通过调用options.UseOpenIddict<int>();,您要求Entity Framework Core使用默认的OpenIddict实体,但使用自定义键类型(int而不是string)。

然而,您还使用services.AddOpenIddict(),它使用默认实体和默认密钥类型配置OpenIddict。当OpenIddict调用实体框架核心存储时,由于它们的通用定义不同,因此无法在上下文中找到预期的实体。

要解决不一致问题,请使用services.AddOpenIddict<int>()

答案 1 :(得分:0)

我遇到了相同的错误,但是使用了Guig键options.UseOpenIddict<Guid>();

我使用OpenIddict 2.0且方法services.AddOpenIddict<Guid>()不存在

我使用此代码解决了错误:

 services.AddOpenIddict()
          .AddCore(options =>
          {
              options.UseEntityFrameworkCore()
              .UseDbContext<ApplicationDbContext>()
              .ReplaceDefaultEntities<Guid>();
          })

          .AddServer(options =>...) //here more options

我还将Guid用作身份实体的密钥

public class ApplicationDbContext : IdentityDbContext<IdentityUser<Guid>, IdentityRole<Guid>, Guid>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }