IdentityServer4
IdentityServer4
-
引入包
- IdentityServer4 4.1.2
- IdentityServer4.AccessTokenValidation
-
创建MiniAPI项目(创建WebAPI项目时不生成Control即可是最小API)
-
创建一个初始化类ClientInitConfig
public class ClientInitConfig { public static IEnumerable<IdentityResource> IdentityResources => new IdentityResource[] { new IdentityResources.OpenId(), new IdentityResources.Profile() }; public static IEnumerable<ApiResource> GetApiResource() { return new[] { new ApiResource("UserApi", "用户获取API") { Scopes={ "scope1"} // 4.x必须写的 } }; } public static IEnumerable<ApiScope> GetScopes() { return new[] { new ApiScope("scope1"), new ApiScope("scope2") }; } /// <summary> /// 定义验证条件的Client /// </summary> /// <returns></returns> public static IEnumerable<Client> GetClients() { return new[] { new Client { ClientId = "his.AspNetCore6.AuthDemo",// 客户端唯一标识 ClientName = "Single AuthenticationCenter", ClientSecrets = new[] { new Secret("robert65".Sha256()) },// 客户端密码,进行了加密 AllowedGrantTypes = new []{GrantType.ClientCredentials },// 授权方式,客户端认证,只要ClientId和ClientSecrets AllowedScopes = new[] { "scope1" }, // 允许访问的资源 Claims = new List<ClientClaim>() { new ClientClaim(IdentityModel.JwtClaimTypes.Role, "Admin"), new ClientClaim(IdentityModel.JwtClaimTypes.NickName, "Robert"), new ClientClaim("Email", "9016814@qq.com") } } }; } }
-
服务添加
#region IOC builder.Services.AddIdentityServer() //ids4怎么用的 .AddDeveloperSigningCredential() // 临时生成的证书,即时的 .AddInMemoryClients(ClientInitConfig.GetClients()) // InMemort内存模式 .AddInMemoryApiScopes(ClientInitConfig.GetScopes()) // 指定作用域 .AddInMemoryApiScopes(ClientInitConfig.GetScopes()); // 能访问的资源 #endregion
-
中间件引用
#region IdentityServer4中间件,使用这个中间件类处理请求 app.UseIdentityServer(); #endregion
-
启动,在程序根目录
$ dotnet run --urls=http://*:7200
-
测试,
-
必须以Post方式请求
-
三个参数是固定的
ClientId = "his.AspNetCore6.AuthDemo",// 客户端唯一标识 ClientName = "Single AuthenticationCenter", ClientSecrets = new[] { new Secret("robert65".Sha256()) },// 客户端密码,进行了加密
- client_id:与代码中设置的id一致
- client_secret:与代码中设置的密码一致
- grant_type
-
校验,有效期为一个小时
-
应用Program.cs
// 配置ids4 builder.Services.AddAuthentication("Bearer") // scheme-- 表示通过Bearer方式解析用户信息,从header里面读取authorization,还必须以Bearer为前缀 .AddIdentityServerAuthentication(opts => { opts.Authority = "http://localhost:7200"; // ids4的地址:专门获取公钥 opts.ApiName = "UserApi"; opts.RequireHttpsMetadata = false; }); #region 添加token验证 app.UseAuthentication(); app.UseAuthorization(); #endregion
世界上没有什么事情是跑步解决不了的,如果有,那就再跑一会!