发布:2021/1/23 17:35:16作者:管理员 来源:本站 浏览次数:1724
打开Startup.cs, 编辑Configure方法:
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- app.UseDeveloperExceptionPage();
- app.UseIdentityServer();
- }
就是使用上面这个中间件.
把IISExpress相关的内容删掉, 然后端口改为5000.
Program.cs里的BuildWebHost也应该加上Url:
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseUrls("http://0.0.0.0:5000")
- .UseStartup<Startup>();
其实不加也好用.
运行就会弹出控制台:
还是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 = "",
- 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());
- }
然后运行一下:
没报错, 红线部分是内存配置版的一些解释.
此时要访问 http://localhost:5000/.well-known/openid-configuration
访问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. 控制台的信息如下:
© Copyright 2014 - 2025 柏港建站平台 ejk5.com. 渝ICP备16000791号-4