• IdentityServer4 搭建


    环境 .net5

    1. 安装dotnet 工具:

    dotnet new -i IdentityServer4.Templates
    dotnet tool install --global dotnet-ef

    mkdir tmp,

    cd tml

    dotnet new is4ef

    这会生成支持 EFCode的项目,项目名称是当前文件夹的名称 tmp。默认是Sqlite数据库。

    里面包含 一个QuickStart的文件夹,用以显示界面。

    迁移文件都生成好了。

    直接运行,会初始化数据库,并能看到界面,登录成功!

    2. 切换SQL Server 数据库。

    
    
    dotnet add package Microsoft.EntityFrameworkCore.SqlServer
    dotnet tool install --global dotnet-ef
    dotnet add package Microsoft.EntityFrameworkCore.Design
    修改StartUp.cs的ConfigurationService方法,部分代码如下
    var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    services.AddIdentityServer()
        .AddTestUsers(TestUsers.Users)
        .AddConfigurationStore(options =>
        {
            options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
        });

    执行如下命令,生成迁移代码:

    dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
    dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb

    这会有2个Context,

    PersistedGrantDbContext 下面有2个集合 DeviceCodes  PersistedGrants,用于临时操作数据,如授权代码和刷新令牌等
    public class PersistedGrant
        {
            public PersistedGrant();
    
            public string Key { get; set; }
            public string Type { get; set; }
            public string SubjectId { get; set; }
            public string SessionId { get; set; }
            public string ClientId { get; set; }
            public string Description { get; set; }
            public DateTime CreationTime { get; set; }
            public DateTime? Expiration { get; set; }
            public DateTime? ConsumedTime { get; set; }
            public string Data { get; set; }
        }
    
     public class DeviceFlowCodes
        {
            public DeviceFlowCodes();
    
            //
            // 摘要:
            //     Gets or sets the device code.
            //
            // 值:
            //     The device code.
            public string DeviceCode { get; set; }
            //
            // 摘要:
            //     Gets or sets the user code.
            //
            // 值:
            //     The user code.
            public string UserCode { get; set; }
            //
            // 摘要:
            //     Gets or sets the subject identifier.
            //
            // 值:
            //     The subject identifier.
            public string SubjectId { get; set; }
            //
            // 摘要:
            //     Gets or sets the session identifier.
            //
            // 值:
            //     The session identifier.
            public string SessionId { get; set; }
            //
            // 摘要:
            //     Gets or sets the client identifier.
            //
            // 值:
            //     The client identifier.
            public string ClientId { get; set; }
            //
            // 摘要:
            //     Gets the description the user assigned to the device being authorized.
            //
            // 值:
            //     The description.
            public string Description { get; set; }
            //
            // 摘要:
            //     Gets or sets the creation time.
            //
            // 值:
            //     The creation time.
            public DateTime CreationTime { get; set; }
            //
            // 摘要:
            //     Gets or sets the expiration.
            //
            // 值:
            //     The expiration.
            public DateTime? Expiration { get; set; }
            //
            // 摘要:
            //     Gets or sets the data.
            //
            // 值:
            //     The data.
            public string Data { get; set; }
        }
    View Code

    剩下的都是Configration 的,用于配置数据,如Client,Apiresouce,scopes等
    public DbSet<Client> Clients { get; set; }
            //
            // 摘要:
            //     Gets or sets the clients' CORS origins.
            //
            // 值:
            //     The clients CORS origins.
            public DbSet<ClientCorsOrigin> ClientCorsOrigins { get; set; }
            //
            // 摘要:
            //     Gets or sets the identity resources.
            //
            // 值:
            //     The identity resources.
            public DbSet<IdentityResource> IdentityResources { get; set; }
            //
            // 摘要:
            //     Gets or sets the API resources.
            //
            // 值:
            //     The API resources.
            public DbSet<ApiResource> ApiResources { get; set; }
            //
            // 摘要:
            //     Gets or sets the API scopes.
            //
            // 值:
            //     The API resources.
            public DbSet<ApiScope> ApiScopes { get; set; }
    View Code

    此时如果运行,会发生找不到数据库的错误,下面改动是代码生成数据库:

    private void InitializeDatabase(IApplicationBuilder app)
    {
        using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
        {
            serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
    
            var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
            context.Database.Migrate();
            if (!context.Clients.Any())
            {
                foreach (var client in Config.Clients)
                {
                    context.Clients.Add(client.ToEntity());
                }
                context.SaveChanges();
            }
    
            if (!context.IdentityResources.Any())
            {
                foreach (var resource in Config.IdentityResources)
                {
                    context.IdentityResources.Add(resource.ToEntity());
                }
                context.SaveChanges();
            }
    
            if (!context.ApiScopes.Any())
            {
                foreach (var resource in Config.ApiScopes)
                {
                    context.ApiScopes.Add(resource.ToEntity());
                }
                context.SaveChanges();
            }
        }
    }
    

    运行,应该可以看到界面了。

    如果有错误,检查当前的项目版本,是不是 .Net5, 然后确保Nuget 包是最近的



    气功波(18037675651)
  • 相关阅读:
    B-Tree索引的学习记录
    mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
    哈希索引
    MyISAM和InnoDB的区别
    负载均衡记录一
    哈希索引
    mysql ZEROFILL属性
    redis常用命令及使用场景
    js Function()构造函数
    书写闭包的时候需注意一下情况
  • 原文地址:https://www.cnblogs.com/qgbo/p/14585429.html
Copyright © 2020-2023  润新知