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

一.開頭聊騷

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

配置

1.首先啓動 IdentityServer4 地址爲:http://localhost:5000github

2.爲gRPC項目安裝Jwt組件:Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 3.0.0app

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中同樣。

image-20191120115327034

測試

運行客戶端調用服務端來進行測試,發現服務端返回了受權失敗,客戶端一樣得到了錯誤。這證實咱們的服務端配置是沒有問題的

image-20191120115908905

三.客戶端配置

配置

客戶端首先須要從 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。

測試

image-20191120142430427

能夠看到成功的進行了調用。

四.結束

本文所用代碼地址:Demo

gRPC in Asp.Net Core :官方文檔

.NET Core 官方教程

相關文章
相關標籤/搜索