Exemple #1
0
        public static void ConfigureClientContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            modelBuilder.Entity <Client>(client =>
            {
                client.ToTable(storeOptions.Client);
                client.HasKey(x => x.Id);

                client.Property(x => x.ClientId).HasMaxLength(200).IsRequired();
                client.Property(x => x.ProtocolType).HasMaxLength(200).IsRequired();
                client.Property(x => x.ClientName).HasMaxLength(200);
                client.Property(x => x.ClientUri).HasMaxLength(2000);

                client.HasIndex(x => x.ClientId).IsUnique();

                client.HasMany(x => x.AllowedGrantTypes).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.RedirectUris).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.PostLogoutRedirectUris).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedScopes).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.ClientSecrets).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.Claims).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.IdentityProviderRestrictions).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedCorsOrigins).WithOne(x => x.Client).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ClientGrantType>(grantType =>
            {
                grantType.ToTable(storeOptions.ClientGrantType);
                grantType.Property(x => x.GrantType).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ClientRedirectUri>(redirectUri =>
            {
                redirectUri.ToTable(storeOptions.ClientRedirectUri);
                redirectUri.Property(x => x.RedirectUri).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClientPostLogoutRedirectUri>(postLogoutRedirectUri =>
            {
                postLogoutRedirectUri.ToTable(storeOptions.ClientPostLogoutRedirectUri);
                postLogoutRedirectUri.Property(x => x.PostLogoutRedirectUri).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClientScope>(scope =>
            {
                scope.ToTable(storeOptions.ClientScopes);
                scope.Property(x => x.Scope).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ClientSecret>(secret =>
            {
                secret.ToTable(storeOptions.ClientSecret);
                secret.Property(x => x.Value).HasMaxLength(2000).IsRequired();
                secret.Property(x => x.Type).HasMaxLength(250);
                secret.Property(x => x.Description).HasMaxLength(2000);
            });

            modelBuilder.Entity <ClientClaim>(claim =>
            {
                claim.ToTable(storeOptions.ClientClaim);
                claim.Property(x => x.Type).HasMaxLength(250).IsRequired();
                claim.Property(x => x.Value).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ClientIdPRestriction>(idPRestriction =>
            {
                idPRestriction.ToTable(storeOptions.ClientIdPRestriction);
                idPRestriction.Property(x => x.Provider).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ClientCorsOrigin>(corsOrigin =>
            {
                corsOrigin.ToTable(storeOptions.ClientCorsOrigin);
                corsOrigin.Property(x => x.Origin).HasMaxLength(150).IsRequired();
            });
        }
Exemple #2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            var configurationOptions = new ConfigurationStoreOptions
            {
                ConfigureDbContext = builder =>
                {
                    builder.UseSqlServer("Data Source=.;Initial Catalog=Identity;Integrated Security=true;");
                }
            };

            var configurationBuilder = new DbContextOptionsBuilder <ConfigurationDbContext>().UseSqlServer("Data Source=.;Initial Catalog=Identity;Integrated Security=true;");

            services.AddSingleton(configurationOptions);
            services.AddSingleton(configurationBuilder.Options);


            services.AddIdentityServer(options =>
            {
                options.IssuerUri = "https://localhost:5001/identityserver";
                options.Events.RaiseSuccessEvents     = true;
                options.Events.RaiseFailureEvents     = true;
                options.Events.RaiseErrorEvents       = true;
                options.Events.RaiseInformationEvents = true;
                options.Discovery = new DiscoveryOptions
                {
                    ShowClaims         = true,
                    ShowEndpoints      = true,
                    ShowGrantTypes     = true,
                    ShowIdentityScopes = true,
                    ShowKeySet         = true,
                    ShowResponseModes  = true,
                    ShowResponseTypes  = true,
                    ShowTokenEndpointAuthenticationMethods = true,
                };
                options.Csp = new CspOptions
                {
                    AddDeprecatedHeader = options.Csp.AddDeprecatedHeader,
                    Level = options.Csp.Level
                };
                options.Authentication = new AuthenticationOptions
                {
                };
                options.UserInteraction = new UserInteractionOptions
                {
                };
                options.Caching = new CachingOptions
                {
                };
                options.Cors = new CorsOptions
                {
                };
                options.Endpoints = new EndpointsOptions
                {
                };
                options.InputLengthRestrictions = new InputLengthRestrictions
                {
                };
                options.AccessTokenJwtType = "JWT";
            })
            .AddDeveloperSigningCredential()
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext   = builder => builder.UseSqlServer("Data Source=.;Initial Catalog=Identity;Integrated Security=true;");
                options.EnableTokenCleanup   = true;
                options.TokenCleanupInterval = (int)TimeSpan.FromMinutes(5).TotalSeconds;
            })
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = builder => builder.UseSqlServer("Data Source=.;Initial Catalog=Identity;Integrated Security=true;");
            });
        }
Exemple #3
0
 void SetupConfigurationStore(ConfigurationStoreOptions options)
 {
     options.ConfigureDbContext =
         b => b.UseSqlServer(Configuration["Data:AppDb:ConnectionString"],
                             sql => sql.MigrationsAssembly(migrationsAssembly));
 }
Exemple #4
0
        public static void ConfigureResourcesContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            modelBuilder.Entity <IdentityResource>(identityResource =>
            {
                identityResource.ToTable(storeOptions.IdentityResource).HasKey(x => x.Id);

                identityResource.Property(x => x.Name).HasMaxLength(200).IsRequired();
                identityResource.Property(x => x.DisplayName).HasMaxLength(200);
                identityResource.Property(x => x.Description).HasMaxLength(1000);

                identityResource.HasIndex(x => x.Name).IsUnique();

                identityResource.HasMany(x => x.UserClaims).WithOne(x => x.IdentityResource).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <IdentityClaim>(claim =>
            {
                claim.ToTable(storeOptions.IdentityClaim).HasKey(x => x.Id);

                claim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });


            modelBuilder.Entity <ApiResource>(apiResource =>
            {
                apiResource.ToTable(storeOptions.ApiResource).HasKey(x => x.Id);

                apiResource.Property(x => x.Name).HasMaxLength(200).IsRequired();
                apiResource.Property(x => x.DisplayName).HasMaxLength(200);
                apiResource.Property(x => x.Description).HasMaxLength(1000);

                apiResource.HasIndex(x => x.Name).IsUnique();

                apiResource.HasMany(x => x.Secrets).WithOne(x => x.ApiResource).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.Scopes).WithOne(x => x.ApiResource).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.UserClaims).WithOne(x => x.ApiResource).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ApiSecret>(apiSecret =>
            {
                apiSecret.ToTable(storeOptions.ApiSecret).HasKey(x => x.Id);

                apiSecret.Property(x => x.Description).HasMaxLength(1000);
                apiSecret.Property(x => x.Value).HasMaxLength(2000);
                apiSecret.Property(x => x.Type).HasMaxLength(250);
            });

            modelBuilder.Entity <ApiResourceClaim>(apiClaim =>
            {
                apiClaim.ToTable(storeOptions.ApiClaim).HasKey(x => x.Id);

                apiClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ApiScope>(apiScope =>
            {
                apiScope.ToTable(storeOptions.ApiScope).HasKey(x => x.Id);

                apiScope.Property(x => x.Name).HasMaxLength(200).IsRequired();
                apiScope.Property(x => x.DisplayName).HasMaxLength(200);
                apiScope.Property(x => x.Description).HasMaxLength(1000);

                apiScope.HasIndex(x => x.Name).IsUnique();

                apiScope.HasMany(x => x.UserClaims).WithOne(x => x.ApiScope).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ApiScopeClaim>(apiScopeClaim =>
            {
                apiScopeClaim.ToTable(storeOptions.ApiScopeClaim).HasKey(x => x.Id);

                apiScopeClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });
        }
 public CustomContext(DbContextOptions <CustomContext> dbOptions, ConfigurationStoreOptions configStoreOptions, OperationalStoreOptions operStoreOptions)
     : base(dbOptions)
 {
     _configStoreOptions = configStoreOptions;
     _operStoreOptions   = operStoreOptions;
 }
Exemple #6
0
 public IdentityServerStoreOptionsProvider()
 {
     //Config your store options here.
     ConfigurationStoreOptions = new ConfigurationStoreOptions();
     OperationalStoreOptions   = new OperationalStoreOptions();
 }
Exemple #7
0
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);

            var configurationStoreOptions = new ConfigurationStoreOptions();

            builder.ConfigureClientContext(configurationStoreOptions);
            builder.ConfigureResourcesContext(configurationStoreOptions);

            var operationalStoreOptions = new OperationalStoreOptions();

            builder.ConfigurePersistedGrantContext(operationalStoreOptions);

            var tenantStoreOptions = new TenantStoreOptions();

            builder.ConfigureTenantContext <ApplicationTenant, ObjectId>(tenantStoreOptions);

            var tenantReferenceOptions = new TenantReferenceOptions();

            builder.HasTenancy <string>(tenantReferenceOptions, out _tenancyModelState);

            builder.Entity <ApplicationTenant>(b =>
            {
                b.Property(t => t.DisplayName).HasMaxLength(256);
            });

            // Configure properties on User (ASP.NET Core Identity).
            builder.Entity <ApplicationUser>(b =>
            {
                // Add multi-tenancy support to entity.
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                // Remove unique index on NormalizedUserName.
                b.HasIndex(u => u.NormalizedUserName).HasName("UserNameIndex").IsUnique(false);
                // Add unique index on TenantId and NormalizedUserName.
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(ApplicationUser.NormalizedUserName))
                .HasName("TenantUserNameIndex").IsUnique();
            });

            // Configure properties on Role (ASP.NET Core Identity).
            builder.Entity <ApplicationRole>(b =>
            {
                // Add multi-tenancy support to entity.
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                // Remove unique index on NormalizedName.
                b.HasIndex(r => r.NormalizedName).HasName("RoleNameIndex").IsUnique(false);
                // Add unique index on TenantId and NormalizedName.
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(ApplicationRole.NormalizedName))
                .HasName("TenantRoleNameIndex").IsUnique();
            });

            builder.Entity <Client>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                b.HasIndex(c => c.ClientId).IsUnique(false);
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(Client.ClientId)).IsUnique();
            });

            builder.Entity <IdentityResource>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                b.HasIndex(r => r.Id).IsUnique(false);
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(IdentityResource.Id)).IsUnique();
            });

            builder.Entity <ApiResource>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                b.HasIndex(r => r.Id).IsUnique(false);
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(ApiResource.Id)).IsUnique();
            });

            builder.Entity <ApiScope>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                b.HasIndex(s => s).IsUnique(false);
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(ApiScope)).IsUnique();
            });

            builder.Entity <PersistedGrant>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, indexNameFormat: $"IX_{nameof(PersistedGrant)}_{{0}}");
            });

            builder.Entity <IdentityServer4.EntityFramework.Entities.DeviceFlowCodes>(b =>
            {
                b.HasTenancy(() => _tenancyContext.Tenant.Id, _tenancyModelState, hasIndex: false);
                b.HasIndex(c => c.DeviceCode).IsUnique(false);
                b.HasIndex(tenantReferenceOptions.ReferenceName, nameof(IdentityServer4.EntityFramework.Entities.DeviceFlowCodes.DeviceCode)).IsUnique();
            });
        }
 public ApplicationDbContext(DbContextOptions <ApplicationDbContext> options, ConfigurationStoreOptions configurationStoreOptions, OperationalStoreOptions persistedGrantStoreOptions)
     : base(options)
 {
     _configurationStoreOptions  = configurationStoreOptions;
     _persistedGrantStoreOptions = persistedGrantStoreOptions;
 }
        /// <summary>
        /// Configures the resources context.
        /// </summary>
        /// <param name="modelBuilder">The model builder.</param>
        /// <param name="storeOptions">The store options.</param>
        public static void ConfigureResourcesContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            modelBuilder.Entity <IdentityResource>(identityResource =>
            {
                identityResource.ToTable(storeOptions.IdentityResource).HasKey(x => x.Id);

                identityResource.Property(x => x.Name).HasMaxLength(200).IsRequired();
                identityResource.Property(x => x.DisplayName).HasMaxLength(200);
                identityResource.Property(x => x.Description).HasMaxLength(1000);

                identityResource.HasIndex(x => x.Name).IsUnique();

                identityResource.HasMany(x => x.UserClaims).WithOne(x => x.IdentityResource).HasForeignKey(x => x.IdentityResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                identityResource.HasMany(x => x.Properties).WithOne(x => x.IdentityResource).HasForeignKey(x => x.IdentityResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <IdentityResourceClaim>(claim =>
            {
                claim.ToTable(storeOptions.IdentityResourceClaim).HasKey(x => x.Id);

                claim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <IdentityResourceProperty>(property =>
            {
                property.ToTable(storeOptions.IdentityResourceProperty);
                property.Property(x => x.Key).HasMaxLength(250).IsRequired();
                property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            });



            modelBuilder.Entity <ApiResource>(apiResource =>
            {
                apiResource.ToTable(storeOptions.ApiResource).HasKey(x => x.Id);

                apiResource.Property(x => x.Name).HasMaxLength(200).IsRequired();
                apiResource.Property(x => x.DisplayName).HasMaxLength(200);
                apiResource.Property(x => x.Description).HasMaxLength(1000);
                apiResource.Property(x => x.AllowedAccessTokenSigningAlgorithms).HasMaxLength(100);

                apiResource.HasIndex(x => x.Name).IsUnique();

                apiResource.HasMany(x => x.Secrets).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.Scopes).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.UserClaims).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.Properties).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ApiResourceSecret>(apiSecret =>
            {
                apiSecret.ToTable(storeOptions.ApiResourceSecret).HasKey(x => x.Id);

                apiSecret.Property(x => x.Description).HasMaxLength(1000);
                apiSecret.Property(x => x.Value).HasMaxLength(4000).IsRequired();
                apiSecret.Property(x => x.Type).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ApiResourceClaim>(apiClaim =>
            {
                apiClaim.ToTable(storeOptions.ApiResourceClaim).HasKey(x => x.Id);

                apiClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ApiResourceScope>((System.Action <EntityTypeBuilder <ApiResourceScope> >)(apiScope =>
            {
                apiScope.ToTable((TableConfiguration)storeOptions.ApiResourceScope).HasKey(x => x.Id);

                apiScope.Property(x => x.Scope).HasMaxLength(200).IsRequired();
            }));

            modelBuilder.Entity <ApiResourceProperty>(property =>
            {
                property.ToTable(storeOptions.ApiResourceProperty);
                property.Property(x => x.Key).HasMaxLength(250).IsRequired();
                property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            });


            modelBuilder.Entity <ApiScope>(scope =>
            {
                scope.ToTable(storeOptions.ApiScope).HasKey(x => x.Id);

                scope.Property(x => x.Name).HasMaxLength(200).IsRequired();
                scope.Property(x => x.DisplayName).HasMaxLength(200);
                scope.Property(x => x.Description).HasMaxLength(1000);

                scope.HasIndex(x => x.Name).IsUnique();

                scope.HasMany(x => x.UserClaims).WithOne(x => x.Scope).HasForeignKey(x => x.ScopeId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });
            modelBuilder.Entity <ApiScopeClaim>(scopeClaim =>
            {
                scopeClaim.ToTable(storeOptions.ApiScopeClaim).HasKey(x => x.Id);

                scopeClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            });
            modelBuilder.Entity <ApiScopeProperty>(property =>
            {
                property.ToTable(storeOptions.ApiScopeProperty).HasKey(x => x.Id);
                property.Property(x => x.Key).HasMaxLength(250).IsRequired();
                property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            });
        }
 public IDSContext(DbContextOptions <IDSContext> options, ConfigurationStoreOptions configurationStoreOptions, OperationalStoreOptions operationalStoreOptions) : base(options)
 {
     this.configurationStoreOptions = configurationStoreOptions;
     this.operationalStoreOptions   = operationalStoreOptions;
 }
        /// <summary>
        /// Configures the client context.
        /// </summary>
        /// <param name="modelBuilder">The model builder.</param>
        /// <param name="storeOptions">The store options.</param>
        public static void ConfigureClientContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            modelBuilder.Entity <Client>(client =>
            {
                client.ToTable(storeOptions.Client);
                client.HasKey(x => x.Id);

                client.Property(x => x.ClientId).HasMaxLength(200).IsRequired();
                client.Property(x => x.ProtocolType).HasMaxLength(200).IsRequired();
                client.Property(x => x.ClientName).HasMaxLength(200);
                client.Property(x => x.ClientUri).HasMaxLength(2000);
                client.Property(x => x.LogoUri).HasMaxLength(2000);
                client.Property(x => x.Description).HasMaxLength(1000);
                client.Property(x => x.FrontChannelLogoutUri).HasMaxLength(2000);
                client.Property(x => x.BackChannelLogoutUri).HasMaxLength(2000);
                client.Property(x => x.ClientClaimsPrefix).HasMaxLength(200);
                client.Property(x => x.PairWiseSubjectSalt).HasMaxLength(200);
                client.Property(x => x.UserCodeType).HasMaxLength(100);
                client.Property(x => x.AllowedIdentityTokenSigningAlgorithms).HasMaxLength(100);

                client.Property(x => x.TenantId).HasMaxLength(450).IsRequired();

                client.HasIndex(x => new { x.ClientId, x.TenantId }).IsUnique();

                client.HasMany(x => x.AllowedGrantTypes).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.RedirectUris).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.PostLogoutRedirectUris).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedScopes).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.ClientSecrets).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.Claims).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.IdentityProviderRestrictions).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedCorsOrigins).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.Properties).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ClientGrantType>(grantType =>
            {
                grantType.ToTable(storeOptions.ClientGrantType);
                grantType.Property(x => x.GrantType).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ClientRedirectUri>(redirectUri =>
            {
                redirectUri.ToTable(storeOptions.ClientRedirectUri);
                redirectUri.Property(x => x.RedirectUri).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClientPostLogoutRedirectUri>(postLogoutRedirectUri =>
            {
                postLogoutRedirectUri.ToTable(storeOptions.ClientPostLogoutRedirectUri);
                postLogoutRedirectUri.Property(x => x.PostLogoutRedirectUri).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClientScope>(scope =>
            {
                scope.ToTable(storeOptions.ClientScopes);
                scope.Property(x => x.Scope).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ClientSecret>(secret =>
            {
                secret.ToTable(storeOptions.ClientSecret);
                secret.Property(x => x.Value).HasMaxLength(4000).IsRequired();
                secret.Property(x => x.Type).HasMaxLength(250).IsRequired();
                secret.Property(x => x.Description).HasMaxLength(2000);
            });

            modelBuilder.Entity <ClientClaim>(claim =>
            {
                claim.ToTable(storeOptions.ClientClaim);
                claim.Property(x => x.Type).HasMaxLength(250).IsRequired();
                claim.Property(x => x.Value).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ClientIdPRestriction>(idPRestriction =>
            {
                idPRestriction.ToTable(storeOptions.ClientIdPRestriction);
                idPRestriction.Property(x => x.Provider).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ClientCorsOrigin>(corsOrigin =>
            {
                corsOrigin.ToTable(storeOptions.ClientCorsOrigin);
                corsOrigin.Property(x => x.Origin).HasMaxLength(150).IsRequired();
            });

            modelBuilder.Entity <ClientProperty>(property =>
            {
                property.ToTable(storeOptions.ClientProperty);
                property.Property(x => x.Key).HasMaxLength(250).IsRequired();
                property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            });
        }
 public ConfigurationDbContext(DbContextOptions <ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
     : base(options)
 {
     if (storeOptions == null)
     {
         throw new ArgumentNullException(nameof(storeOptions));
     }
     this._storeOptions = storeOptions;
 }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            try
            {
                services.AddCertificateManager();
                services.AddSingleton <ICryptoServices, CertificateCryptoServices>();

                //Register the Permission policy handlers
                services.AddSingleton <IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
                services.AddSingleton <IAuthorizationHandler, PermissionHandler>();

                services.AddSingleton <IEmailSender, NullEmailSender>();
                var mapperOneToOne   = MapperConfigurationBuilder.BuidOneToOneMapper;
                var mapperIgnoreBase = MapperConfigurationBuilder.BuidIgnoreBaseMapper;
                services.AddSingleton <IInputModelMapperAccessor>(new InputModelMapperAccessor
                {
                    MapperOneToOne   = mapperOneToOne,
                    MapperIgnoreBase = mapperIgnoreBase
                });

                services.AddPasswordGenerator();
                services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>();
                services.AddSingleton <IPagingHelper, PagingHelper>();

                services.Configure <IdentityServerDefaultOptions>(Configuration.GetSection("IdentityServerDefaultOptions"));

                var appOptions = Configuration
                                 .GetSection("AppOptions")
                                 .Get <AppOptions>();
                services.Configure <AppOptions>(Configuration.GetSection("AppOptions"));
                services.Configure <EntityFrameworkConnectionOptions>(Configuration.GetSection("EntityFrameworkConnectionOptions"));

                services.Configure <CertificatesOptions>(Configuration.GetSection("CertificatesOptions"));

                services.AddScoped <ISessionTenantAccessor, SessionTenantAccessor>();
                services.AddTransient <ISigninManager, DefaultSigninManager>();
                //     services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, SeedSessionClaimsPrincipalFactory>();
                services.AddScoped <IUserClaimsPrincipalFactory <IdentityUser>, FluffyBunnyAdminPermissionsClaimsPrincipalFactory>();


                services.AddCors(options => options.AddPolicy("CorsPolicy",
                                                              builder =>
                {
                    builder.AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowAnyOrigin();
                }));
                // set forward header keys to be the same value as request's header keys
                // so that redirect URIs and other security policies work correctly.
                var aspNETCORE_FORWARDEDHEADERS_ENABLED = string.Equals(Environment.GetEnvironmentVariable("ASPNETCORE_FORWARDEDHEADERS_ENABLED"), "true", StringComparison.OrdinalIgnoreCase);
                if (aspNETCORE_FORWARDEDHEADERS_ENABLED)
                {
                    //To forward the scheme from the proxy in non-IIS scenarios
                    services.Configure <ForwardedHeadersOptions>(options =>
                    {
                        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                        // Only loopback proxies are allowed by default.
                        // Clear that restriction because forwarders are enabled by explicit
                        // configuration.
                        options.KnownNetworks.Clear();
                        options.KnownProxies.Clear();
                    });
                }



                switch (appOptions.DatabaseType)
                {
                default:
                    services.AddInMemoryDbContextOptionsProvider();
                    break;

                case AppOptions.DatabaseTypes.Postgres:
                    services.AddPostgresDbContextOptionsProvider();
                    break;

                case AppOptions.DatabaseTypes.SqlServer:
                    services.AddSingleton <IMigrationsAssemblyProvider, SqlServerMigrationsAssemblyProvider>();
                    services.AddSqlServerDbContextOptionsProvider();
                    break;
                }
                services.AddDbContextTenantServices();

                var options = new ConfigurationStoreOptions();
                services.AddSingleton(options);

                var operationalStoreOptions = new OperationalStoreOptions
                {
                    EnableTokenCleanup = true
                };
                services.AddSingleton(operationalStoreOptions);


                services.AddDatabaseDeveloperPageExceptionFilter();



                services.AddDbContext <ApplicationDbContext>(config =>
                {
                    // for in memory database
                    config.UseInMemoryDatabase("InMemoryIdentityDatabase");
                });
                services.AddIdentity <IdentityUser, IdentityRole>()

                .AddEntityFrameworkStores <ApplicationDbContext>()
                .AddDefaultTokenProviders();
                services.AddAuthentication <IdentityUser>(Configuration);
                services.AddScoped <IExternalLoginContext, ExternalLoginContext>();



                services.AddControllers();
                IMvcBuilder builder = services.AddRazorPages();
                if (HostingEnvironment.IsDevelopment())
                {
                    builder.AddRazorRuntimeCompilation();
                }

                //*************************************************
                //*********** COOKIE Start ************************
                //*************************************************


                services.Configure <CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded    = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                services.ConfigureExternalCookie(config =>
                {
                    config.Cookie.SameSite = SameSiteMode.None;
                });
                services.ConfigureApplicationCookie(options =>
                {
                    options.Cookie.SameSite     = SameSiteMode.None;
                    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;

                    options.ExpireTimeSpan    = TimeSpan.FromSeconds(appOptions.AuthAndSessionCookies.TTL);
                    options.SlidingExpiration = true;
                    options.Cookie.Name       = $"{Configuration["applicationName"]}.AspNetCore.Identity.Application";
                    options.LoginPath         = $"/Identity/Account/Login";
                    options.LogoutPath        = $"/Identity/Account/Logout";
                    options.AccessDeniedPath  = $"/Identity/Account/AccessDenied";
                    options.Events            = new CookieAuthenticationEvents()
                    {
                        OnRedirectToLogin = (ctx) =>
                        {
                            if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == StatusCodes.Status200OK)
                            {
                                ctx.Response.StatusCode = StatusCodes.Status401Unauthorized;
                                return(Task.CompletedTask);
                            }
                            ctx.Response.Redirect(ctx.RedirectUri);
                            return(Task.CompletedTask);
                        },
                        OnRedirectToAccessDenied = (ctx) =>
                        {
                            if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == StatusCodes.Status200OK)
                            {
                                ctx.Response.StatusCode = StatusCodes.Status403Forbidden;
                                return(Task.CompletedTask);
                            }
                            ctx.Response.Redirect(ctx.RedirectUri);
                            return(Task.CompletedTask);
                        }
                    };
                });


                //*************************************************
                //*********** COOKIE END **************************
                //*************************************************

                // Adds a default in-memory implementation of IDistributedCache.
                services.AddDistributedMemoryCache();

                services.AddSession(options =>
                {
                    options.Cookie.IsEssential = true;
                    options.Cookie.Name        = $"{Configuration["applicationName"]}.Session";
                    // Set a short timeout for easy testing.
                    options.IdleTimeout         = TimeSpan.FromSeconds(appOptions.AuthAndSessionCookies.TTL);
                    options.Cookie.HttpOnly     = true;
                    options.Cookie.SameSite     = SameSiteMode.None;
                    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
                });
            }
            catch (Exception ex)
            {
                _deferedException = ex;
            }
        }
        protected override IdentityManagementContext GetContext(DbContextOptions <IdentityManagementContext> options)
        {
            var storeOptions = new ConfigurationStoreOptions();

            return(new IdentityManagementContext(options, storeOptions, new NonPersistingChangeTrackerAuditing()));
        }
        /// <summary>
        /// Configures the resources context.
        /// </summary>
        /// <param name="modelBuilder">The model builder.</param>
        /// <param name="storeOptions">The store options.</param>
        public static void ConfigureResourcesContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            //modelBuilder.Entity<IdentityResource>(identityResource =>
            //{
            //    identityResource.ToTable(storeOptions.IdentityResource).HasKey(x => x.Id);

            //    identityResource.Property(x => x.Name).HasMaxLength(200).IsRequired();
            //    identityResource.Property(x => x.DisplayName).HasMaxLength(200);
            //    identityResource.Property(x => x.Description).HasMaxLength(1000);

            //    identityResource.HasIndex(x => x.Name).IsUnique();

            //    identityResource.HasMany(x => x.UserClaims).WithOne(x => x.IdentityResource).HasForeignKey(x => x.IdentityResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            //    identityResource.HasMany(x => x.Properties).WithOne(x => x.IdentityResource).HasForeignKey(x => x.IdentityResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            //});

            //modelBuilder.Entity<IdentityClaim>(claim =>
            //{
            //    claim.ToTable(storeOptions.IdentityClaim).HasKey(x => x.Id);

            //    claim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            //});

            //modelBuilder.Entity<IdentityResourceProperty>(property =>
            //{
            //    property.ToTable(storeOptions.IdentityResourceProperty);
            //    property.Property(x => x.Key).HasMaxLength(250).IsRequired();
            //    property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            //});



            modelBuilder.Entity <ApiEntity>(apiResource =>
            {
                apiResource.ToTable(storeOptions.ApiResource).HasKey(x => x.ApiId);

                apiResource.Property(x => x.Nombre).HasMaxLength(200).IsRequired();
                apiResource.Property(x => x.NombreMostrar).HasMaxLength(200);
                apiResource.Property(x => x.Descripcion).HasMaxLength(1000);

                apiResource.HasIndex(x => x.Nombre).IsUnique();

                apiResource.HasMany(x => x.Secretos).WithOne(x => x.Api).HasForeignKey(x => x.ApiId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                apiResource.HasMany(x => x.Alcances).WithOne(x => x.Api).HasForeignKey(x => x.ApiId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                //apiResource.HasMany(x => x.USERCLAIMS).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                //apiResource.HasMany(x => x.PROPIEDADES).WithOne(x => x.ApiResource).HasForeignKey(x => x.ApiResourceId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ApiSecretoEntity>(apiSecret =>
            {
                apiSecret.ToTable(storeOptions.ApiSecret).HasKey(x => x.SecretoId);

                apiSecret.Property(x => x.Descripcion).HasMaxLength(1000);
                apiSecret.Property(x => x.Valor).HasMaxLength(4000).IsRequired();
                apiSecret.Property(x => x.Tipo).HasMaxLength(250).IsRequired();
            });

            //modelBuilder.Entity<ApiResourceClaim>(apiClaim =>
            //{
            //    apiClaim.ToTable(storeOptions.ApiClaim).HasKey(x => x.Id);
            //    apiClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            //});

            modelBuilder.Entity <ApiAlcanceEntity>(apiScope =>
            {
                apiScope.ToTable(storeOptions.ApiScope).HasKey(x => x.ApiAlcanceId);

                apiScope.Property(x => x.Nombre).HasMaxLength(200).IsRequired();
                apiScope.Property(x => x.NombreMostrar).HasMaxLength(200);
                apiScope.Property(x => x.Descripcion).HasMaxLength(1000);

                apiScope.HasIndex(x => x.Nombre).IsUnique();

                //apiScope.HasMany(x => x.UserClaims).WithOne(x => x.ApiScope).HasForeignKey(x => x.ApiScopeId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            //modelBuilder.Entity<ApiScopeClaim>(apiScopeClaim =>
            //{
            //    apiScopeClaim.ToTable(storeOptions.ApiScopeClaim).HasKey(x => x.Id);

            //    apiScopeClaim.Property(x => x.Type).HasMaxLength(200).IsRequired();
            //});

            //modelBuilder.Entity<ApiResourceProperty>(property =>
            //{
            //    property.ToTable(storeOptions.ApiResourceProperty);
            //    property.Property(x => x.Key).HasMaxLength(250).IsRequired();
            //    property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            //});
        }
Exemple #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConfigurationDbContext"/> class.
 /// </summary>
 /// <param name="options">The options.</param>
 /// <param name="storeOptions">The store options.</param>
 /// <exception cref="ArgumentNullException">storeOptions</exception>
 public ConfigurationDbContext(DbContextOptions <ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
     : base(options, storeOptions)
 {
 }
        /// <summary>
        /// Configures the client context.
        /// </summary>
        /// <param name="modelBuilder">The model builder.</param>
        /// <param name="storeOptions">The store options.</param>
        public static void ConfigureClientContext(this ModelBuilder modelBuilder, ConfigurationStoreOptions storeOptions)
        {
            if (!string.IsNullOrWhiteSpace(storeOptions.DefaultSchema))
            {
                modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);
            }

            modelBuilder.Entity <ClienteEntity>(client =>
            {
                client.ToTable(storeOptions.Client).HasKey(x => x.ClienteId);

                client.Property(x => x.ClienteIdDescripcion).HasMaxLength(200).IsRequired();
                client.Property(x => x.TipoProtocolo).HasMaxLength(200).IsRequired();
                client.Property(x => x.NombreCiente).HasMaxLength(200);
                client.Property(x => x.ClienteUrl).HasMaxLength(2000);
                client.Property(x => x.LogoUri).HasMaxLength(2000);
                client.Property(x => x.Descripcion).HasMaxLength(1000);
                client.Property(x => x.FrontChannelLogoutUri).HasMaxLength(2000);
                client.Property(x => x.BackChannelLogoutUri).HasMaxLength(2000);
                client.Property(x => x.ClientClaimsPrefix).HasMaxLength(200);
                client.Property(x => x.PairWiseSubjectSalt).HasMaxLength(200);
                client.Property(x => x.UserCodeType).HasMaxLength(100);

                client.HasIndex(x => x.ClienteIdDescripcion).IsUnique();

                client.HasMany(x => x.TiposConcesionesHabilitadas).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.ClienteRedirigirUris).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.ClienteRedirigirCerrarSesionUris).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedScopes).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.ClienteSecretos).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                //client.HasMany(x => x.Claims).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                //client.HasMany(x => x.IdentityProviderRestrictions).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                client.HasMany(x => x.AllowedCorsOrigins).WithOne(x => x.Cliente).HasForeignKey(x => x.ClienteId).IsRequired().OnDelete(DeleteBehavior.Cascade);
                //client.HasMany(x => x.Properties).WithOne(x => x.Client).HasForeignKey(x => x.ClientId).IsRequired().OnDelete(DeleteBehavior.Cascade);
            });

            modelBuilder.Entity <ClienteTipoConcesionEntity>(grantType =>
            {
                grantType.ToTable(storeOptions.ClientGrantType).HasKey(x => x.ClienteTipoConcesionId);
                grantType.Property(x => x.TipoConcesion).HasMaxLength(250).IsRequired();
            });

            modelBuilder.Entity <ClienteUrlRedirigirEntity>(redirectUri =>
            {
                redirectUri.ToTable(storeOptions.ClientRedirectUri).HasKey(x => x.ClienteUrlRedirigirId);
                redirectUri.Property(x => x.Url).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClienteUrlRedirigirCerrarSesionEntity>(postLogoutRedirectUri =>
            {
                postLogoutRedirectUri.ToTable(storeOptions.ClientPostLogoutRedirectUri).HasKey(x => x.ClienteUrlRedirigirCerrarSesionId);
                postLogoutRedirectUri.Property(x => x.Url).HasMaxLength(2000).IsRequired();
            });

            modelBuilder.Entity <ClienteAlcanceEntity>(scope =>
            {
                scope.ToTable(storeOptions.ClientScopes).HasKey(x => x.ClienteAlcanceId);
                scope.Property(x => x.Alcance).HasMaxLength(200).IsRequired();
            });

            modelBuilder.Entity <ClienteSecretoEntity>(secret =>
            {
                secret.ToTable(storeOptions.ClientSecret).HasKey(x => x.SecretoId);
                secret.Property(x => x.Valor).HasMaxLength(4000).IsRequired();
                secret.Property(x => x.Tipo).HasMaxLength(250).IsRequired();
                secret.Property(x => x.Descripcion).HasMaxLength(2000);
            });

            //modelBuilder.Entity<ClientClaim>(claim =>
            //{
            //    claim.ToTable(storeOptions.ClientClaim);
            //    claim.Property(x => x.Type).HasMaxLength(250).IsRequired();
            //    claim.Property(x => x.Value).HasMaxLength(250).IsRequired();
            //});

            //modelBuilder.Entity<ClientIdPRestriction>(idPRestriction =>
            //{
            //    idPRestriction.ToTable(storeOptions.ClientIdPRestriction);
            //    idPRestriction.Property(x => x.Provider).HasMaxLength(200).IsRequired();
            //});

            modelBuilder.Entity <ClienteOrigenCruzadoEntity>(corsOrigin =>
            {
                corsOrigin.ToTable(storeOptions.ClientCorsOrigin).HasKey(x => x.ClienteOrigenCruzadoId);
                corsOrigin.Property(x => x.Origen).HasMaxLength(150).IsRequired();
            });

            //modelBuilder.Entity<ClientProperty>(property =>
            //{
            //    property.ToTable(storeOptions.ClientProperty);
            //    property.Property(x => x.Key).HasMaxLength(250).IsRequired();
            //    property.Property(x => x.Value).HasMaxLength(2000).IsRequired();
            //});
        }
Exemple #18
0
 public IdentityServerConfigurationDbContext(DbContextOptions <IdentityServerConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
     : base(options, storeOptions)
 {
 }
 //public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
 //    : base(options)
 //{
 //}
 public ApplicationDbContext(DbContextOptions options,
                             ConfigurationStoreOptions configurationStoreOptions, OperationalStoreOptions operationalStoreOptions,
                             IConfiguration configuration) : base(options, configurationStoreOptions, operationalStoreOptions)
 {
     _configuration = configuration;
 }