zoukankan      html  css  js  c++  java
  • 三、IDS4建立authorization server

    建立authorization server

    一、环境搭建

    1、创建项目

    2、引用NuGet的identityserver4

    3、配置asp.net core 管道

    打开Startup.cs, 编辑Configure方法:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseIdentityServer();
    }

     就是使用上面这个中间件. 

    4、运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息.

    把IISExpress相关的内容删掉, 然后端口改为5000.

    Program.cs里的BuildWebHost也应该加上Url:

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseUrls("http://0.0.0.0:5000")
                    .UseStartup<Startup>();

    其实不加也好用.

    运行就会弹出控制台:

    二、配置Identity Server

    还是Startup.cs,编辑ConfigureServices方法:

    这里不仅要把IdentityServer注册到容器中, 还要至少对其配置三点内容:

    1. 哪些API可以使用这个authorization server.

    2. 那些客户端Client(应用)可以使用这个authorization server.

    3. 指定可以使用authorization server授权的用户.

    首先需要把上面这些做成一个配置文件:

    建立Configuration/InMemoryConfiguration.cs:

    namespace ids4.Configuration
    {
        public class InMemoryConfiguration
        {
            public static IEnumerable<ApiResource> ApiResources()
            {
                return new[]
                {
                    new ApiResource("socialnetwork", "社交网络")
                };
            }
            public static IEnumerable<Client> Clients()
            {
                return new[]
                {
                    new Client
                    {
                        ClientId = "socialnetwork",
                        ClientSecrets = new [] { new Secret("secret".Sha256()) },
                        AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                        AllowedScopes = new [] { "socialnetwork" }
                    }
                };
            }
            public static IEnumerable<TestUser> Users()
            {
                return new[]
                {
                    new TestUser
                    {
                        SubjectId = "1",
                        Username = "mail@qq.com",
                        Password = "password"
                    }
                };
            }
        }
    }

    ApiResources: 这里指定了name和display name, 以后api使用authorization server的时候, 这个name一定要一致, 否则就不好用的.

    Clients: Client的属性太多了, 这里就指定几个. 其中ClientSecrets是Client用来获取token用的. AllowedGrantType: 这里使用的是通过用户名密码和ClientCredentials来换取token的方式. ClientCredentials允许Client只使用ClientSecrets来获取token. 这比较适合那种没有用户参与的api动作. AllowedScopes: 这里只用socialnetwork

    Users: 这里的内存用户的类型是TestUser, 只适合学习和测试使用, 实际生产环境中还是需要使用数据库来存储用户信息的, 例如接下来会使用asp.net core identity. TestUser的SubjectId是唯一标识.

    然后回到StartUp的ConfigureServices:

    前一篇文章讲过, 我们需要对token进行签名, 这意味着identity server需要一对public和private key. 幸运的是, 我们可以告诉identity server在程序的运行时候对这项工作进行设定: AddDeveloperSigningCredential(), 它默认会存到硬盘上的, 所以每次重启服务不会破坏开发时的数据同步. 这个方法只适合用于identity server4在单个机器运行, 如果是production farm你得使用AddSigningCredential()这个方法.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddTestUsers(InMemoryConfiguration.Users().ToList())
            .AddInMemoryClients(InMemoryConfiguration.Clients())
            .AddInMemoryApiResources(InMemoryConfiguration.ApiResources());
    }

    注意-StartUp.cs总配置总计就两处:

    然后运行一下:

    没报错, 红线部分是内存配置版的一些解释.

    此时要访问 http://localhost:5000/.well-known/openid-configuration

     

    三、获取Token,打开postman

     访问http://localhost:5000/connect/token

    1、发送一个正确的数据:

    client_id                 socialnetwork
    client_secret           secret
    grant_type              client_credentials
    username               main@qq.com
    password                password

     

    GIf

    2、由于identity server我们设置的是 ResourceOwnerPasswordAndClientCredentials 这个GrantType, 所以使用用户名密码以及使用ClientCredentials都可以. 那我们把用户名和密码去掉, 只发送Client Credentials:

    仍然获取到了token. 控制台上的信息与上一个稍有不同, 没有user相关的信息了:

    3、然后我们发送一个错误的client_id, 然后得到的结果是: invalid_client. 控制台的信息如下:

  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/fger/p/11014833.html
Copyright © 2011-2022 走看看