本文算是對於 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 :官方文檔