.Net5中使用IdentityServer4的简单方法,以及坑

一、引用Nuget:IdentityServer4  最新版本 4.1.2

二、添加配置:

 public class Config
    {

        /// <summary>
        /// 定义资源
        /// </summary>
        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                new ApiResource("api1", "我的第一个API"),
                new ApiResource("api2", "我的第2个API")
            };
        }

        /// <summary>
        /// 主要用于为Client提供accesstoken中的scope声明的值。
        /// client中 AllowedScopes 配置的值一定要在这里存在。不然就报错(invalid_scope)。
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<ApiScope> GetApiApiScopes()
        {
            return new List<ApiScope>
            {
                new ApiScope("api1", "我的第一个API"),
                new ApiScope("demo-api", "我的第2个API")
            };
        }


        /// <summary>
        /// 定义访问的资源客户端
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
            {
               new Client{
                   ClientId="client",//定义客户端ID
                   ClientSecrets=
                   {
                       new Secret("secret".Sha256())//定义客户端秘钥
                   },
                   AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,//授权方式为用户密码模式授权,类型可参考GrantTypes枚举
                   AllowedScopes={ "api1" }//允许客户端访问的范围,必须在ApiScope里定义

               }
             };
        }

        /// <summary>
        /// 这个方法是来规范tooken生成的规则和方法的。一般不进行设置,直接采用默认的即可。
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new IdentityResource[]
            {
                new IdentityResources.OpenId()
            };
        }

    }

 

三、Startup里:

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            var builder = services.AddIdentityServer()//注册服务
                .AddInMemoryApiScopes(Config.GetApiApiScopes())//配置scope
              .AddInMemoryApiResources(Config.GetApiResources())//配置类定义的授权资源
              .AddInMemoryClients(Config.GetClients())//配置类定义的授权客户端
              .AddTestUsers(new List<TestUser> {
                  new TestUser {
                      Username = "Admin", Password = "123456", SubjectId = "001", IsActive = true
                  }
              }
              );
            //模拟测试用户,这里偷懒了,用户可以单独管理,最好不要直接在这里New
            builder.AddDeveloperSigningCredential();
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "IdS4Test", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "IdS4Test v1"));
            }
            app.UseIdentityServer();//添加中间件
            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

Postman测试下:

 

 

 

网上的一些教程,使用的是3.*的版本,若按照上面的教程来开发,但是使用的是最新版本的ids4,则会报错 “invalid_request”,“invalid_scope”,等问题,我的代码已修复这个问题。排错过程参考了一些文章:

https://www.cnblogs.com/chenxf1117/p/12542479.html   (ids4入门,---版本一定要是3.**)

http://www.identityserver.com.cn/Home/Detail/shiyongpingzhengbaohuapi   

https://www.cnblogs.com/monster17/p/13261647.html#4627616   (这篇是分析错误的,评论里也看下)

https://www.cnblogs.com/qwfy-y/p/14867527.html  (ids4里的新概念很多,感觉很绕)

https://github.com/jonny-xhl/identityserver4-simple/issues/1

 https://www.cnblogs.com/zoe-zyq/p/14429669.html   (比较新,推荐)

 

 学一个东西,需要先使用起来,用多了,就慢慢学会了。

 

 

 

 

 

posted @ 2022-07-13 16:15  沐雪架构师  阅读(270)  评论(0编辑  收藏  举报