.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

关于 IdentityServer4

IdentityServer4 是一个 OpenID Connect 和 OAuth 2.0 框架用于 ASP.NET Core 。IdentityServer4 在你的应用程序中集成了基于令牌认证、单点登录、API访问控制所需的所有协议和扩展点。参考

本文将使用 IdentityServer4 搭建独立认证服务器。

关于 Consul

Consul 是一个服务网格解决方案,通过服务发现、配置、功能分割提供一个全功能的控制层。这些功能可以单独使用,也可以同时使用以形成一个完整的网格服务。参考

本文将使用 Consul 注册多个服务。

关于 .Net Core

将使用 WebApi 构建多个服务

构建 IdentityServer 服务

添加 ASP.Net Core Web 项目

.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

添加空项目

.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

在程序包管理控制台中输入:Install-Package IdentityServer4.AspNetIdentity

添加 Config.cs 文件,并添加内容如下:
``` csharp
using System.Collections.Generic;
using IdentityServer4.Models;
using IdentityServer4.Test;

namespace IdentityServer
{
public sealed class Config
{
public static IEnumerable GetApiResources()
{
return new List
{
new ApiResource("ServiceA", "ServiceA API"),
new ApiResource("ServiceB", "ServiceB API")
};
}

public static IEnumerable<Client> GetClients() { return new List<Client> { new Client { ClientId = "ServiceAClient", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("ServiceAClient".Sha256()) }, AllowedScopes = new List<string> {"ServiceA"}, AccessTokenLifetime = 60 * 60 * 1 }, new Client { ClientId = "ServiceBClient", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("ServiceBClient".Sha256()) }, AllowedScopes = new List<string> {"ServiceB"}, AccessTokenLifetime = 60 * 60 * 1 } }; } public static List<TestUser> GetUsers() { return new List<TestUser> { new TestUser { Username = "test", Password = "123456", SubjectId = "1" } }; } public static IEnumerable<IdentityResource> GetIdentityResources() { return new List<IdentityResource>(); } }

}
```
注意:这里添加了两个 Client ,分别为 ServiceA、ServiceB ,因此接下来将构建这两个服务。

删掉StartUp.cs文件,在Program.cs中添加内容如下:
``` csharp
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;

namespace IdentityServer
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) { return WebHost.CreateDefaultBuilder(args).ConfigureServices(services => { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryApiResources(Config.GetApiResources()) .AddInMemoryClients(Config.GetClients()) .AddTestUsers(Config.GetUsers()); }).Configure(app => { app.UseIdentityServer(); }); } }

}
```

注意:AddDeveloperSigningCredential() 方法用于添加开发时使用的 ,生产环境中不要使用该方法。在 .NET Core 2.2 中新建的 Web 项目文件 csproj 中包含了如下内容:
csharp <PropertyGroup> <TargetFramework>netcoreapp2.2</TargetFramework> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> </PropertyGroup>
这里更改
csharp <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
为或直接删除该行,这么做的原因是当值为 InProcess 时,读写 tempkey.rsa 将产生权限问题。关于 AspNetCoreHostingModel 可参考 ASP.NET Core Module
csharp <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>

F5 启动该服务,显示如下:

.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

在浏览器中输入 :38033/.well-known/openid-configuration ,得到以下内容

.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

至此,一个包含两个服务认证的认证服务搭建完毕。

构建 ServiceA、ServiceB

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypzp.html