1. 程式人生 > >ASP.NET Core 3.0 gRPC 身份認證和授權

ASP.NET Core 3.0 gRPC 身份認證和授權

一.開頭聊騷

本文算是對於 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。

測試

可以看到成功的進行了呼叫。

四.結束

本文所用程式碼地址:Demo

gRPC in Asp.Net Core :官方文件

.NET Core 官方教