Невозможно использовать таблицу 'OpenIddictApplications' в схеме '' для сущности 'OpenIddictApplication', так как она используется для другой сущности
Я пытаюсь получить токен из основного приложения asp.net, используя OpenIddict.
Когда я запрашиваю токен из моей конечной точки, я получаю это исключение:
System.InvalidOperationException: невозможно использовать таблицу 'OpenIddictApplications' в схеме '' для сущности 'OpenIddictApplication', так как она используется для другой сущности. в Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(Строковое сообщение) в Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.EnsureDistinctTableNames(модель IModel) в Microsoft.EntityFrameworkCore.MliteFrameworkForeMatealMatealMatealMatealMatealMatealMatealMatealMateLifeMateMateMateMateMateMateMateFileMateCoreMateCore.Core.MatelMBRF_Med_MlFL_C_LF.CreateModel(контекст DbContext, IConventionSetBuilder ConventionSetBuilder, валидатор IModelValidator) в System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func
2 valueFactory) в Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() в Microsoft.EntityFrameworkCore.Internal.LazyRef1.get_Value()
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.<>c.<AddQuery>b__1_3(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure
1 средство доступа) в Microsoft.EntityFrameworkCore.DbContext.get_QueryProvider() в Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.<.ctor>b__3_0()
at Microsoft.EntityFrameworkCore.Internal.LazyRef
1.get_Value () в Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.System.Linq.IQueryable.get_Provider()
at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable
1 источник, предикат Expression`1) в OpenID.Controllers.AuthorizeController.d__2.MoveNext() в C:\Users\Enrique_Garcia\Desktop\OpenID\OpenID\Controllers\AuthorizeController.cs: строка 35
--- Конец трассировки стека из предыдущее местоположение, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача-задача) в Microsoft.AspNetCore.Mvc.Internal.ControlA) --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__25.MoveNext()
--- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в Microsoft.AspNetCore.Mvc.Interna l.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) в Microsoft.AspNetCore.Mvc.Internal22.Nove__Internal_Nove__ControlAction_In___Direct_In___Direct.dll --- Конец стека трассировки из предыдущего места, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
....
Уже вижу это, но я не использую Asp.Net Identity
ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddDbContext<UniverContext>(options =>
{
options.UseSqlServer(Configuration["Data:ConnectionString"]);
options.UseOpenIddict();
});
services.AddOpenIddict(options =>
{
options.AddEntityFrameworkCoreStores<UniverContext>();
options.AddMvcBinders();
options.EnableTokenEndpoint("/connect/token");
options.AllowPasswordFlow().AllowRefreshTokenFlow();
options.SetAccessTokenLifetime(TimeSpan.FromMinutes(1));
options.SetRefreshTokenLifetime(TimeSpan.FromMinutes(2));
options.DisableHttpsRequirement();
options.UseJsonWebTokens();
options.AddEphemeralSigningKey();
});
}
Настройка:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
app.UseDeveloperExceptionPage();
app.UseOpenIddict();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = "http://localhost:5000",
Audience = "resource_server",
RequireHttpsMetadata = false,
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = OpenIdConnectConstants.Claims.Subject,
RoleClaimType = OpenIdConnectConstants.Claims.Role
}
});
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseMvcWithDefaultRoute();
app.UseWelcomePage();
}
Заранее спасибо.
Это мой класс UniverContext:
public partial class UniverContext : DbContext
{
public virtual DbSet<Alumno> Alumno { get; set; }
public virtual DbSet<AlumnoInscrito> AlumnoInscrito { get; set; }
public virtual DbSet<Genero> Genero { get; set; }
public virtual DbSet<OfertaEducativa> OfertaEducativa { get; set; }
public virtual DbSet<OpenIddictApplications> OpenIddictApplications { get; set; }
public virtual DbSet<OpenIddictAuthorizations> OpenIddictAuthorizations { get; set; }
public virtual DbSet<OpenIddictScopes> OpenIddictScopes { get; set; }
public virtual DbSet<OpenIddictTokens> OpenIddictTokens { get; set; }
public virtual DbSet<Usuario> Usuario { get; set; }
public virtual DbSet<UsuarioDetalle> UsuarioDetalle { get; set; }
public UniverContext(DbContextOptions<UniverContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//modelBuilder.UseOpenIddict();
modelBuilder.Entity<Alumno>(entity =>
{
entity.HasIndex(e => e.GeneroId)
.HasName("IX_Alumno_GeneroId");
entity.Property(e => e.AlumnoId).ValueGeneratedNever();
entity.Property(e => e.GeneroId).HasDefaultValueSql("0");
entity.Property(e => e.Nombre).IsRequired();
entity.HasOne(d => d.Genero)
.WithMany(p => p.Alumno)
.HasForeignKey(d => d.GeneroId);
});
modelBuilder.Entity<AlumnoInscrito>(entity =>
{
entity.HasKey(e => new { e.AlumnoId, e.OfertaEducativaId })
.HasName("PK_AlumnoInscrito");
entity.HasIndex(e => e.OfertaEducativaId)
.HasName("IX_AlumnoInscrito_OfertaEducativaId");
entity.HasOne(d => d.Alumno)
.WithMany(p => p.AlumnoInscrito)
.HasForeignKey(d => d.AlumnoId);
entity.HasOne(d => d.OfertaEducativa)
.WithMany(p => p.AlumnoInscrito)
.HasForeignKey(d => d.OfertaEducativaId);
entity.HasOne(d => d.Usuario)
.WithMany(p => p.AlumnoInscrito)
.HasForeignKey(d => d.UsuarioId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_AlumnoInscrito_Usuario");
});
modelBuilder.Entity<Genero>(entity =>
{
entity.Property(e => e.GeneroId).ValueGeneratedNever();
entity.Property(e => e.Descripcion).IsRequired();
});
modelBuilder.Entity<OfertaEducativa>(entity =>
{
entity.Property(e => e.OfertaEducativaId).ValueGeneratedNever();
entity.Property(e => e.Descripcion).IsRequired();
});
modelBuilder.Entity<OpenIddictApplications>(entity =>
{
entity.HasIndex(e => e.ClientId)
.HasName("IX_OpenIddictApplications_ClientId")
.IsUnique();
entity.Property(e => e.Id).HasMaxLength(450);
entity.Property(e => e.ClientId)
.IsRequired()
.HasMaxLength(450);
});
modelBuilder.Entity<OpenIddictAuthorizations>(entity =>
{
entity.HasIndex(e => e.ApplicationId)
.HasName("IX_OpenIddictAuthorizations_ApplicationId");
entity.Property(e => e.Id).HasMaxLength(450);
entity.Property(e => e.ApplicationId).HasMaxLength(450);
entity.HasOne(d => d.Application)
.WithMany(p => p.OpenIddictAuthorizations)
.HasForeignKey(d => d.ApplicationId);
});
modelBuilder.Entity<OpenIddictScopes>(entity =>
{
entity.Property(e => e.Id).HasMaxLength(450);
});
modelBuilder.Entity<OpenIddictTokens>(entity =>
{
entity.HasIndex(e => e.ApplicationId)
.HasName("IX_OpenIddictTokens_ApplicationId");
entity.HasIndex(e => e.AuthorizationId)
.HasName("IX_OpenIddictTokens_AuthorizationId");
entity.Property(e => e.Id).HasMaxLength(450);
entity.Property(e => e.ApplicationId).HasMaxLength(450);
entity.Property(e => e.AuthorizationId).HasMaxLength(450);
entity.HasOne(d => d.Application)
.WithMany(p => p.OpenIddictTokens)
.HasForeignKey(d => d.ApplicationId);
entity.HasOne(d => d.Authorization)
.WithMany(p => p.OpenIddictTokens)
.HasForeignKey(d => d.AuthorizationId);
});
modelBuilder.Entity<Usuario>(entity =>
{
entity.Property(e => e.UsuarioId).HasDefaultValueSql("0");
entity.Property(e => e.Nombre).IsRequired();
entity.Property(e => e.Paterno)
.IsRequired()
.HasDefaultValueSql("N''");
});
modelBuilder.Entity<UsuarioDetalle>(entity =>
{
entity.HasKey(e => e.UsuarioId)
.HasName("PK_UsuarioDetalle");
entity.Property(e => e.UsuarioId).ValueGeneratedNever();
entity.Property(e => e.Password)
.IsRequired()
.HasColumnType("varchar(50)");
entity.HasOne(d => d.Usuario)
.WithOne(p => p.UsuarioDetalle)
.HasForeignKey<UsuarioDetalle>(d => d.UsuarioId)
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("FK_UsuarioDetalle_Usuario");
});
}
}
И что мой файл csproj содержит:
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
<AspNetContribOpenIdExtensionsVersion>1.0.0-*</AspNetContribOpenIdExtensionsVersion>
<OpenIddictVersion>1.0.0-*</OpenIddictVersion>
<PackageTargetFallback>portable-net45+win8</PackageTargetFallback>
<PackageReference Include="AspNet.Security.OAuth.Validation" Version="1.0.0-rtm-0255" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" />
<PackageReference Include="OpenIddict" Version="$(OpenIddictVersion)" />
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="$(OpenIddictVersion)" />
<PackageReference Include="OpenIddict.Mvc" Version="$(OpenIddictVersion)" />
Версия пакета openiddict: 1.0.0-бета2-0607
То, что я пытался, и это работает, это мой AuthorizationController:
if (request.Username != "email@email.com")
{
return BadRequest(new OpenIdConnectResponse
{
Error = OpenIdConnectConstants.Errors.InvalidGrant,
ErrorDescription = "The username/password couple is invalid"
});
}
if (request.Password != "123456+")
{
return BadRequest(new OpenIdConnectResponse
{
Error = OpenIdConnectConstants.Errors.InvalidGrant,
ErrorDescription = "The username/password couple is invalid"
});
}
Но после регистрации моего DbContext в классе запуска я пытаюсь использовать что-то вроде пользователя базы данных:
var user = _context.Usuario.SingleOrDefault(x => x.UsuarioId == int.Parse(request.Username));
В этой строке я получаю описанную ошибку.
Я создал репо, если вы хотите увидеть мой AuthorizationController, спасибо.
1 ответ
Мне кажется, что это исключение: OpenIddict регистрирует объекты по умолчанию при вызове options.AddOpenIddict()
но ваш собственный DbContext
определяет разные сущности, которые в итоге используют одинаковые имена таблиц (OpenIddictApplications
/OpenIddictAuthorizations
/OpenIddictScopes
/OpenIddictTokens
), которая рассматривается EntityFramework как недопустимая операция, учитывая, что типы сущностей различаются.
У вас есть два варианта, чтобы это исправить:
- Используйте стандартные объекты OpenIddict (например,
OpenIddictApplication
противOpenIddictApplications
). - Скажите OpenIddict, что вы предпочитаете использовать свои собственные сущности вместо встроенных:
// Register the OpenIddict services.
services.AddOpenIddict<OpenIddictApplications, OpenIddictAuthorizations, OpenIddictScopes, OpenIddictTokens>(options =>
{
// Register the Entity Framework stores.
options.AddEntityFrameworkCoreStores<ApplicationDbContext>();
// ...
});