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中一样。

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 官方教程

作者:晓晨Master(李志强)

出处:https://www.cnblogs.com/stulzq/p/11897628.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   晓晨Master  阅读(6350)  评论(9编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示