查看原文
其他

ASP.NET Core 3.0 gRPC 身份认证和授权

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能


转自:晓晨Master
cnblogs.com/stulzq/p/11897628.html

一、前言


本文算是对于 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

 https://github.com/stulzq/BlogDemos/tree/master/AspNetCoreGrpcWithAuth


gRPC in Asp.Net Core :官方文档

https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-3.0&WT.mc_id=DT-MVP-5003133


.NET Core 官方教程

https://docs.microsoft.com/zh-cn/dotnet/core/?WT.mc_id=DT-MVP-5003133


推荐阅读

(点击标题可跳转阅读)

 ASP.NET Core 3.0 Docker Nginx

.NET Core 前后端分离快速开发框架

.NET Core 3.1 编写混合 C++ 程序 


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存