.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 (比较新,推荐)
学一个东西,需要先使用起来,用多了,就慢慢学会了。
作者:沐雪
文章均系作者原创或翻译,如有错误不妥之处,欢迎各位批评指正。本文版权归作者和博客园共有,如需转载恳请注明。
如果您觉得阅读这篇博客让你有所收获,请点击右下方【推荐】
为之网-热爱软件编程 http://www.weizhi.cc/