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
    
  • 测试,

    • 网址:http://localhost:7200/connect/token

    • 必须以Post方式请求

    • 三个参数是固定的

      ClientId = "his.AspNetCore6.AuthDemo",// 客户端唯一标识
      ClientName = "Single AuthenticationCenter",
      ClientSecrets = new[]
      {
          new Secret("robert65".Sha256())
      },// 客户端密码,进行了加密
      
      • client_id:与代码中设置的id一致
      • client_secret:与代码中设置的密码一致
      • grant_type
        image
  • 校验,有效期为一个小时
    image

  • 应用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
    
posted @ 2022-09-17 17:13  his365  阅读(100)  评论(0编辑  收藏  举报