Ocelot之结合IdentityServer4认证一
作者:互联网
Ocelot之结合IdentityServer4认证一
前言
上章节介绍了Ocelot之基于Polly熔断,这节介绍.NET Core平台下Ocelot之结合IdentityServer4认证。
环境
Win10+VS2022 +.NET5.0 + Ocelot17.0.0.0 + Consul 1.6.1.1+IDS4
1 OAuth2.0(协议)
系统从而产生一个短期的进入令牌,用来代替密码,供第三方应用使用。
规范了下授权的流程,五种模式:
l 客户端凭证(client credentials)
l 密码式(password)
l 隐藏式(implicit)
l 授权码(authorization-code)
l 混合式(Hybrid)
2 IdentityServer4
IdentityServer4 是一个 OpenID Connect 和 OAuth 2.0 框架用于 ASP.NET Core 。IdentityServer4 在你的应用程序中集成了基于令牌认证、单点登录、API访问控制所需的所有协议和扩展点。
3 项目实现
在上节“Ocelot之基于Polly熔断”的项目实现上继续改造。
3.1 创建IDS4项目
1. 创建项目
dotnet CLI快速安装模板Identityserver模板
dotnet new -i IdentityServer4.Templates |
创建IdentityServery 项目
dotnet new is4empty -n IdentityServer_ResourceOwnerPasswordCredentials |
2.引用IdentityServer4依赖
3.修改端口
在Properties\launchSettings.json文件中更改它。
这里修改为:
"applicationUrl": "https://localhost:5001;http://localhost:5000" |
4.定义API接口的活动范围API Scope
API 是系统中要保护的资源。资源定义可以通过多种方式加载。模板已经创建了 Config.cs。打开它,将代码更新为如下所示:
public static IEnumerable<ApiScope> ApiScopes => new ApiScope[] { new ApiScope("api1", "My API")}; |
5.添加用户
就像基于内存存储的资源(即范围 Scopes)和客户端一样,对于用户也可以这样做。
TestUser类型表示一个测试用户及其身份信息。 Config.cs文件中添加以下代码以创建用户:
public static List<TestUser> GetUsers() { return new List<TestUser> { new TestUser { SubjectId = "1", Username = "alice", Password = "password" }, new TestUser { SubjectId = "2", Username = "bob", Password = "password" }, new TestUser { SubjectId = "3", Username = "yak", Password = "yakpassword" } }; }
|
6.配置身份服务器
在Startup文件中配置身份服务器,加载资源和客户端,然后将测试用户注册到 IdentityServer中。代码如下:
public void ConfigureServices(IServiceCollection services) { var builder = services.AddIdentityServer() .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryApiScopes(Config.ApiScopes) .AddInMemoryClients(Config.GetClients()) .AddTestUsers(Config.GetUsers()); builder.AddDeveloperSigningCredential(); } |
AddTestUsers扩展方法在背后做了以下几件事:
(1)为资源所有者密码授权添加支持
(2)添加对用户相关服务的支持,这服务通常为登录 UI 所使用
(3)为基于测试用户的身份信息服务添加支持
7.添加客户端定义
可以通过修改AllowedGrantTypes属性简单地添加对已有客户端授权类型的支持。
通常要为资源所有者用例创建独立的客户端,添加以下代码到你配置中的客户端定义中
public static IEnumerable<Client> GetClients() { return new List<Client> { // resource owner password grant client new Client { ClientId = "yakclient", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("yaksecret".Sha256()) }, AllowedScopes = { "api1", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile }//需要额外添加 } }; } |
3.2 修改接口服务
1. 在接口控制器上添加认证特性。
[Authorize] [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase ............ |
2. 添加Microsoft.AspNetCore.Authentication.JwtBearer依赖
添加依赖后,Yak.Ocelot.Api项目文件下添加了下面代码。
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" /> </ItemGroup> |
2. 修改Startup文件,添加认证代码。
public void ConfigureServices(IServiceCollection services) { // IdentityServer // 注册认证相关组件和配置defaultScheme为Bearer services.AddAuthentication("Bearer") .AddJwtBearer("Bearer", options => { options.Authority = "http://localhost:8000"; // 在验证token时,不验证Audience options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false }; options.RequireHttpsMetadata = false; // 不适用Https }); services.AddAuthorization(options => { options.AddPolicy("api1Scope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "Yak.Ocelot.Api"); }); }); services.AddSingleton(Configuration.GetSection("Consul").Get<ConsulOption>()); services.AddControllers(); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, ConsulOption consulOption) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 注册 app.RegisterConsul(lifetime, consulOption); app.UseRouting();
app.UseAuthentication();//先鉴权,没有鉴权,授权是没有意义的 app.UseAuthorization();//后授权 app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } |
3.3 启动Consul
这里是Win10系统,下载相应的Consul后,在文件夹下创建启动BAT文件用于启动Consul,双击启动。
3.4 服务发现
启动“Yak.Ocelot.Api”项目,查看到服务已经注册到Consul中。
3.5 调试
1. 启动网关服务
运行网关项目“Yak.Ocelot.Gateway”。
2. 启动接口服务
运行网关项目“Yak.Ocelot.Api”,通过接口自己的端口http://localhost:6000/Weather访问WebAPI天气接口服务。没有授权,返回码401。
3. 取Token
访问IDS4服务获取Token,地址:http://localhost:8000/connect/token
参数:
grant_type:password
client_id:yakclient
client_secret:yaksecret
username:yak
password:yakpassword
4. 通过网关访问接口服务
通过网关地址http://localhost:5000/Weather
访问WebAPI天气接口服务,返回401未认证。
添加Token认证后访问
4 总结
这节例子介绍了接口服务结合IDS4提供了认证,网关仅仅提供了路由。后面介绍网关结合IDS4提供认证。
5 鸣谢
https://www.cnblogs.com/zhangnever/p/13198176.html
https://www.cnblogs.com/Zhang-Xiang/p/10437488.html
6 源码
https://github.com/yandaniugithub/NETCore
标签:app,认证,添加,Ocelot,new,IdentityServer4 来源: https://www.cnblogs.com/yakniu/p/16124008.html