AddApiAuthorization без неявного преобразования ссылок ASP Core 3.0 - PullRequest
0 голосов
/ 31 января 2020

Попытка реализовать Identity в ASP. NET Core 3.1. Возникают некоторые проблемы, заставляющие меня думать об этом.

Это мои настройки

  1. У меня есть отдельные проекты

    • WebPortal
    • Portal.ApplicationCore
    • Portal.Infrastructure
    • Portal.Domain
  2. В Portal.Domain я наследую модели идентичности

     public class AppRole : IdentityRole<int>
     {
           [Required]
           public int OrganizationID { get; set; }
    
           [Required(ErrorMessage = "Display name is Required.")]
           [MaxLength(100, ErrorMessage = "Please enter Display name less than 100 characters.")]
           public string DisplayName { get; set; }
    
           [ForeignKey("OrganizationID")]
           public Organization Organization { get; set; }
      }
    
      public class AppUser : IdentityUser<int>
      {
           [Required]
           public int OrganizationID { get; set; }
    
           [ForeignKey("OrganizationID")]
           public Organization Organization { get; set; }
      }
    
  3. В Portal.Infrastructure я реализовал DBContext

      public class ApplicationDbContext : IdentityDbContext<AppUser, AppRole, int>
      {
             private IDbContextTransaction _transaction;
             public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
              : base(options)
             {
             }
    
             public DbSet<Organization> Organizations { get; set; }
    
    
        }
    

Наконец, в моем сообщении об ошибке Startup.cs -

Серьезность Код Описание Ошибка состояния подавления строки файла проекта CS0311 Тип «Portal.Infrastructure.DAL.DatabaseContext.ApplicationDbContext» нельзя использовать в качестве параметра типа «TContext» в типе generi c или методе «IdentityServerBuilderConfigurationExtensions.AddApiAuthorerBerver» ( ». Не существует неявного преобразования ссылок из 'Portal.Infrastructure.DAL.DatabaseContext.ApplicationDbContext' в 'IdentityServer4.EntityFramework.Interfaces.IPersistedGrantDbContext'.

AddApiAuthorization Error

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 31 января 2020

Наконец-то я решил свою проблему. Я опубликую это здесь, и это может кому-то помочь.

  1. Я создаю пользовательский ApiAuthorizationDbContext

    /// <summary>
    /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET 
    ///Identity and Identity Server.
    /// </summary>
    /// <typeparam name="TUser"></typeparam>
    /// <typeparam name="TRole"></typeparam>
    /// <typeparam name="TKey">Key of the IdentityUser entity</typeparam>
    public class KeyApiAuthorizationDbContext<TUser, TRole, TKey> : 
    IdentityDbContext<TUser, TRole, TKey>, IPersistedGrantDbContext
    where TUser : IdentityUser<TKey>
    where TRole : IdentityRole<TKey>
    where TKey : IEquatable<TKey>
    {
        private readonly IOptions<OperationalStoreOptions> _operationalStoreOptions;
    
        /// <summary>
        /// Initializes a new instance of <see cref="ApiAuthorizationDbContext{TUser, 
        ///TRole, TKey}"/>.
        /// </summary>
        /// <param name="options">The <see cref="DbContextOptions"/>.</param>
        /// <param name="operationalStoreOptions">The <see 
        ///cref="IOptions{OperationalStoreOptions}"/>.</param>
        public KeyApiAuthorizationDbContext(
        DbContextOptions options,
        IOptions<OperationalStoreOptions> operationalStoreOptions)
        : base(options)
        {
            _operationalStoreOptions = operationalStoreOptions;
        }
    
        /// <summary>
        /// Gets or sets the <see cref="DbSet{PersistedGrant}"/>.
        /// </summary>
        public DbSet<PersistedGrant> PersistedGrants { get; set; }
    
        /// <summary>
        /// Gets or sets the <see cref="DbSet{DeviceFlowCodes}"/>.
        /// </summary>
        public DbSet<DeviceFlowCodes> DeviceFlowCodes { get; set; }
    
        Task<int> IPersistedGrantDbContext.SaveChangesAsync() => 
                base.SaveChangesAsync();
    
        /// <inheritdoc />
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value);
        }
    }
    
    /// <summary>
    /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET 
    ///Identity and Identity Server.
    /// </summary>
    /// <typeparam name="TUser"></typeparam>
    public class ApiAuthorizationDbContext<TUser> : 
    KeyApiAuthorizationDbContext<TUser, IdentityRole, string>
    where TUser : IdentityUser
    {
        /// <summary>
        /// Initializes a new instance of <see 
        ///cref="ApiAuthorizationDbContext{TUser}"/>.
        /// </summary>
        /// <param name="options">The <see cref="DbContextOptions"/>.</param>
        /// <param name="operationalStoreOptions">The <see 
        ///cref="IOptions{OperationalStoreOptions}"/>.</param>
        public ApiAuthorizationDbContext(
        DbContextOptions options,
        IOptions<OperationalStoreOptions> operationalStoreOptions)
        : base(options, operationalStoreOptions)
        {
        }
    }
    
  2. Изменить DbContext

    public class ApplicationDbContext : KeyApiAuthorizationDbContext<AppUser, AppRole, 
    int>
    {
        public ApplicationDbContext(
            DbContextOptions options,
            IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, 
            operationalStoreOptions)
        {
        }
        public DbSet<Organization> Organizations { get; set; }
    }
    
  3. Наконец, изменить startup.cs

    services.AddIdentityServer()                
        .AddApiAuthorization<AppUser, ApplicationDbContext>();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...