如何使用MySQL配置Identity Server 4

5

我正在尝试使用mysql作为后端数据库来配置Identity server 4,但是在Idserver4的官方网站上找不到任何关于配置的指导教程。

请问mysql是否可以用于此配置?


2
你确定吗?该网站的快速入门介绍了如何使用Entity Framework,它可以针对任何具有EF提供程序的数据库进行操作。将EF配置为与MySQL一起使用与将其配置为使用SQL Server相同。唯一需要考虑的是是否有可用于MySQL的EF Core提供程序。 - Panagiotis Kanavos
看起来有一个EF Core MySQL提供程序 - Panagiotis Kanavos
@PanagiotisKanavos 出现错误,MySql.Data 6.9.9 包与 netcoreapp1.1 不兼容。 - Muktesh Kumar
MySql.Data 6.9.9不支持.NET Core,但7.0.1支持。请先添加最新的MySQL.Data提供程序,然后再添加EF Core提供程序包。 - Panagiotis Kanavos
@PanagiotisKanavos 在 startup.cs 中出现错误,UseMySql 不可用 services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection"))); - Muktesh Kumar
您可以参考此链接 https://youtu.be/X4I0DUw6C84,这里是详细的文章 https://www.tutlinks.com/asp-net-core-react-identity-server-4-using-mysql/。 - navule
2个回答

5

关注 IdentityServer 示例中的 8_AspNetIdentity 示例。

添加 MySql.Data.EntityFrameworkCore NuGet 包。

在开始之前,为防万一,请将迁移应用到 Sql Server。稍后我们会再次回顾这一点。

从更改 Appsettings.json 中的 connectionString 开始。

        "DefaultConnection": "server=localhost;userid=root;pwd=rootpassword;persistsecurityinfo=True;port=3306;database=AspIdUsers;sslmode=none;AllowPublicKeyRetrieval=true;"

请注意,您的数据库密码在此处以明文形式呈现,因此如果该文件对更广泛的受众可见,请使用用户机密来提供它。

上下文定义需要一些工作,因为MySql将布尔值持久化为整数,如果未映射,这将导致强制转换异常。在ApplicationDbContext的OnModelCreating方法中添加以下内容:

            // Conversions required for "No coercion operator is defined between types 'System.Int16' and 'System.Boolean'."
            builder
        .Entity<ApplicationUser>()
        .Property(u => u.EmailConfirmed).HasConversion<Int16>()
        ;

            builder
        .Entity<ApplicationUser>()
        .Property(u => u.LockoutEnabled).HasConversion<Int16>()
        ;

            builder
          .Entity<ApplicationUser>()
          .Property(u => u.PhoneNumberConfirmed).HasConversion<Int16>()
          ;

            builder
          .Entity<ApplicationUser>()
          .Property(u => u.PhoneNumberConfirmed).HasConversion<Int16>()
          ;

            builder
          .Entity<ApplicationUser>()
          .Property(u => u.TwoFactorEnabled).HasConversion<Int16>()
          ;
            builder
           .Entity<ApplicationUser>()
           .Property(u => u.PhoneNumberConfirmed).HasConversion<Int16>()
           ;

告诉 Startup.cs 使用 MySql 而不是 Sql Server:
      services.AddDbContext<ApplicationDbContext>(options =>
                options.UseMySQL(connectionString));

更改迁移模块20180109192453_CreateIdentitySchema.Designer和ApplicationDbContextModelSnapshot,以在AspNetUserLogins、AspNetUserRoles、AspNetUserTokens的关键字段上设置最大长度(AspNetUserTokens具有三个部分的键,因此使用长度为200)。

            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
                {
                    b.Property<string>("LoginProvider")
                     .HasMaxLength(256);

                    b.Property<string>("ProviderKey")
                     .HasMaxLength(256);

                    b.Property<string>("ProviderDisplayName");

                    b.Property<string>("UserId")
                     .HasMaxLength(256)
                        .IsRequired();

                    b.HasKey("LoginProvider", "ProviderKey");

                    b.HasIndex("UserId");

                    b.ToTable("AspNetUserLogins");
                });

如果你遇到迁移错误提示你的键超出3072限制,注意表格并使用这个示例将其长度缩短。

如果操作迁移变得不可能,从SqlServer导出创建语句并手工制作它们的MySql等效语句。

成功创建数据库后,您需要使用MySql Workbency在AspNetUserClaims的Id列上设置自动增量。

然后你就可以愉快地开始了。

如果你选择Combined_AspId_and_EFStorage,事情会变得更加复杂。你无法访问ConfigurationDbContext和PersistedGrantDbContext。它们是通过Indentity Server 4 nuget包管理的,所以你需要注入自己的版本来解决强制问题。


-1
services.AddDbContext<yourDbContext>(options => options.UseMySql(yourConnectionName, mySqlOptions => mySqlOptions.CommandTimeout(timeout)));

1
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - rollstuhlfahrer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接