一. 开头聊骚
本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了, 以后在实际使用中, 可能会发一些经验之文. 本文主要讲 ASP.NET Core 本身的认证授权和 gRPC 接入, 认证方式采用目前主流的 JWT 结合 IdentityServer4.
二. 服务端配置
我们首先需要在服务端配置认证和授权. gRPC 基于此文的 Demo 来开始: ASP.NET Core 3.0 使用 gRPC ,IdentityServer 基于此文 Demo: https://www.cnblogs.com/stulzq/p/7509648.html .
配置
1. 首先启动 IdentityServer4 地址为: http://localhost:5000/
2. 为 gRPC 项目安装 Jwt 组件: Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 3.0.0
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. 启用认证授权中间件
在 Startup 类的 Configure 方法中, 配置如下代码
- App.UseRouting();
- App.UseAuthentication();
- App.UseAuthorization();
请务必注意中间件顺序
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.
测试
可以看到成功的进行了调用.
四. 结束
本文所用代码地址:
gRPC in ASP.NET Core : 官方文档
.NET Core 官方教程
来源: https://www.cnblogs.com/stulzq/p/11897628.html