zoukankan      html  css  js  c++  java
  • 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("
    
    ");
    

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

  • 相关阅读:
    Thinkphp3.2 PHPMailer 发送邮件
    13 代理模式
    12 状态模式
    11 组合模式
    10 迭代器模式
    9 模板方法模式
    8 外观模式
    MySQL Network--Localhost与127.0.0.1的差异
    MySQL Memory--内存分配相关参数
    mysqldump命令之single-transaction
  • 原文地址:https://www.cnblogs.com/stulzq/p/11897628.html
Copyright © 2011-2022 走看看