本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,之后在实际使用中,可能会发一些经验之文。本文主要讲 ASP.NET Core 自己的认证受权和gRPC接入,认证方式采用目前主流的 JWT 结合 IdentityServer4。html
咱们首先须要在服务端配置认证和受权。gRPC基于此文的Demo来开始: ASP.NET Core 3.0 使用gRPC ,IdentityServer 基于此文Demo: http://www.javashuo.com/article/p-ezhokjrk-dh.html 。git
1.首先启动 IdentityServer4 地址为:http://localhost:5000github
2.为gRPC项目安装Jwt组件:Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 3.0.0
app
3.为gRPC项目配置认证和受权服务学习
在 Startup 类的 ConfigureServices 方法中,配置以下代码测试
services.AddAuthorization(options => { options.AddPolicy(JwtBearerDefaults.AuthenticationScheme, policy => { policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); policy.RequireClaim("sub"); }); }); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "http://localhost:5000"; options.RequireHttpsMetadata = false; options.Audience = "grpc1"; });
4.启用认证受权中间件ui
在 Startup 类的 Configure 方法中,配置以下代码code
app.UseRouting(); app.UseAuthentication(); app.UseAuthorization();
请务必注意中间件顺序htm
5.为gRPC服务启用受权中间件
咱们在 LuCatService 的 SuckingCat 方法上,加上 [Authorize]
特性,就和在MVC中同样。
运行客户端调用服务端来进行测试,发现服务端返回了受权失败,客户端一样得到了错误。这证实咱们的服务端配置是没有问题的
客户端首先须要从 IdentityServer 申请 Token,而后在调用 gRPC 服务时传递过去,这和 HTTP Api 调用同样。
1.客户端项目安装组件 IdentityModel
得到基于 HttpClient 的和 IdentityServer 的交互的封装。
2.获取Token
// discover endpoints from metadata var client = new HttpClient(); var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000"); if (disco.IsError) { Console.WriteLine(disco.Error); return; } // request token var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = disco.TokenEndpoint, ClientId = "ro.client", ClientSecret = "secret", UserName = "alice", Password = "password", Scope = "grpc1" }); if (tokenResponse.IsError) { Console.WriteLine(tokenResponse.Error); return; } Console.WriteLine(tokenResponse.Json); Console.WriteLine("\n\n");
3.为 gRPC 客户端请求设置 Token
和 HTTP Api 调用同样,gRPC也是放在头部的
var headers = new Metadata {{"Authorization", $"Bearer {tokenResponse.Json["access_token"]}"}}; var catClient = new LuCat.LuCatClient(channel); var catReply = await catClient.SuckingCatAsync(new Empty(), headers);
主要就是在调用 SuckingCatAsync
方法时,传入了header。
能够看到成功的进行了调用。
本文所用代码地址:Demo
gRPC in Asp.Net Core :官方文档