提供授权服务,用户使用会员的用户名和密码获取 token, 带着 token 访问受保护的接口,如浏览和发布新闻。

有 2 个公开的 api:

  1. token: 获取 token;
  2. GetCurrentMemberInfo: 获取当前 token 的会员信息;

有 1 个不公开的方法:

  1. GetMemberInfo:根据会员用户名和密码,获取会员信息,该方法供获取 token 的 api 调用;

1 声明接口,创建基于 .Net Core 6.0 的类库项目,命名为 Auth.IServices

1.1 添加 jimu 引用

Install-Package  Jimu

1.2 创建 dto 类

using System;
using System.Collections.Generic;
using System.Text; namespace Auth.IServices
{
public class MemberInfo
{
public string Id { get; set; }
public string Name { get; set; }
public string NickName { get; set; }
public string Role { get; set; } }
}

1.3 声明公开的微服务接口

using System;
using System.Collections.Generic;
using System.Text;
using Jimu; namespace Auth.IServices
{
public interface IAuthMemberService : IJimuService
{
MemberInfo GetMemberInfo(string username, string password);
}
}

上面的接口只继承 IJimuService, 不声明访问路由和接口属性,因为它不公开给外部调用的,但要用 autofac 注册到系统,在生成 token 时调用,所以需要继承 IJimuService。

using System;
using System.Threading.Tasks;
using Jimu; namespace Auth.IServices
{
[JimuServiceRoute("/api/v1/member")]
public interface IMemberService : IJimuService
{
[JimuService(EnableAuthorization = true, CreatedBy = "grissom", CreatedDate = "2018-07-17", Comment = "get current token member info")]
MemberInfo GetCurrentMemberInfo();
}
}

上面的接口声明了 EnableAuthorization = true,需要授权的用户才能访问(即请求时要带上 token),该方法是获取当前会员信息。

2 实现接口,创建基于 .Net Core 6.0 的类库项目,命名为 Auth.Services

2.1 添加对接口项目 Auth.IServices 的引用

2.2 实现接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Auth.IServices;
using Jimu; namespace Auth.Services
{
public class AuthMemberService : IAuthMemberService
{
static List<MemberInfo> _membersDb = new List<MemberInfo>();
readonly ILogger _logger;
public AuthMemberService(ILogger logger)
{
_logger = logger;
} static AuthMemberService()
{
// mock some member
_membersDb.Add(new MemberInfo { Id = Guid.NewGuid().ToString(), Name = "grissom", NickName = "Gil", Role = "admin" });
_membersDb.Add(new MemberInfo { Id = Guid.NewGuid().ToString(), Name = "foo", NickName = "Fo", Role = "guest" });
} public MemberInfo GetMemberInfo(string username, string password)
{
var member = _membersDb.FirstOrDefault(x => x.Name == username && "123" == password); _logger.Debug($"username: {username}, found {(member == null ? "no " : "")} member."); return member;
}
}
}

logger 是通过依赖注入的

using Jimu;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace Auth.IServices
{
public class MemberService : IMemberService
{
readonly ILogger _logger;
readonly JimuPayload _jimuPayload;
public MemberService(ILogger logger, JimuPayload jimuPayload)
{
_logger = logger;
_jimuPayload = jimuPayload;
} public MemberInfo GetCurrentMemberInfo()
{
_logger.Debug($"current token member username: {_jimuPayload.Items["username"]}"); return Newtonsoft.Json.JsonConvert.DeserializeObject<MemberInfo>(_jimuPayload.Items["member"].ToString());
} }
}

logger 和 jimuPayload 都是通过依赖注入的。JimuPayload 是 Jimu 框架解析 token 获取的一些生成 token 时,添加的信息(参考下面生成 token 的方法)。如果请求的 token 无效,则 JimuPayload 为 null。

3 微服务的宿主服务器,创建基于 .Net Core 2.0 的控制台应用, 命名为 Auth.Server

3.1 添加对项目: Auth.Services 的引用

3.2 添加 jimu.server 和 Jimu.Common.Discovery.ConsulIntegration 引用

Install-Package  Jimu.Server
Install-Package Jimu.Common.Discovery.ConsulIntegration

3.3 启动 jimu 服务和生成 token 的代码

using System;
using Autofac;
using Jimu;
using Jimu.Server;
using Jimu.Server.OAuth;
using Auth.IServices; namespace Auth.Server
{
class Program
{
static void Main(string[] args)
{
IServiceHost host = null; var builder = new ServiceHostServerBuilder(new ContainerBuilder())
.UseLog4netLogger()
.LoadServices("Auth.IServices", "Auth.Services")
.UseDotNettyForTransfer("127.0.0.1", 8000)
.UseConsulForDiscovery("127.0.0.1", 8500, "JimuService", $"127.0.0.1:8000")
.UseJoseJwtForOAuth<DotNettyAddress>(new JwtAuthorizationOptions
{
SecretKey = "123456", // 生成 token 的密钥
ExpireTimeSpan = new TimeSpan(3, 0, 0, 0), // token 有效时间 3 天
ValidateLifetime = true, // 是否启动验证 token 的有效时间
ServerIp = "127.0.0.1", // 生成 token 的宿主服务器地址
ServerPort = 8000, // 生成 token 的宿主服务器端口
TokenEndpointPath = "api/oauth/token?username=&password=", // 获取 token 的路由,注意后缀 ?username=&password= 是固定的
CheckCredential = new Action<JwtAuthorizationContext>(ctx =>
{
var memberService = host.Container.Resolve<IAuthMemberService>(); var member = memberService.GetMemberInfo(ctx.UserName, ctx.Password);
if (member == null)
{
ctx.Rejected("username or password is incorrect.", "");
}
else
{
// 上面提到的 JimuPayload 就是包含这些数据
ctx.AddClaim("roles", member.Role); // 添加角色到 token
ctx.AddClaim("member", Newtonsoft.Json.JsonConvert.SerializeObject(member)); // 把整个 member 序列化打包到 token }
}), // 生成 token 的配置项和验证逻辑
});
using (host = builder.Build())
{
host.Run();
while (true)
{
Console.ReadKey();
}
}
}
}
}

dotnet core微服务框架Jimu ~ 会员授权微服务的更多相关文章

  1. .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...

  2. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成

    本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事;    一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...

  3. 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

    0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...

  4. 学学dotnet core中的身份验证和授权-1-概念

    前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...

  5. .Net Core 分布式微服务框架介绍 - Jimu

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...

  6. Net Core 分布式微服务框架

    Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...

  7. spring cloud 入门,看一个微服务框架的「五脏六腑」

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...

  8. 从 Spring Cloud 看一个微服务框架的「五脏六腑」

    原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...

  9. 从 Spring Cloud 看一个微服务框架的「五脏六腑」(转)

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 本文将从 Spring Cloud 出发,分两小节讲述微服务框架的「五脏六腑」: ...

  10. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

随机推荐

  1. 三台服务器上离线安装redis哨兵集群,一主二从三哨兵

    三台服务器上离线安装redis哨兵集群,一主二从三哨兵 系统安装好gcc环境,(不然编译redis会报错).依旧不知道怎么离线安装gcc环境的可查看CentOS下离线安装gcc环境,图文详细 下载 点 ...

  2. NVIDIA vGPU vApps/vWS/vCS适配GPU版本介绍

    NVIDIA vGPU 12.0版本-vGPU版本名称变化 - 注: 2021年1月生效 最新名称 NVIDIA Virtual PC (vPC) -曾用名称 NVIDIA GRID Virtual ...

  3. apisix-dashboard上添加自定义插件

    参考:https://overstarry.vip/posts/apisix如何添加自定义插件/ 首先,我们需要向自定义的插件user-remote-auth添加到apisix中,对这块不清楚的同学, ...

  4. Camera | 1.Camera基础知识

    一口君最近在玩瑞芯微的板子,之前写了几篇基于瑞芯微的文章,大家可以学习一下. <瑞芯微rk356x板子快速上手> <Linux驱动|rtc-hym8563移植笔记> <L ...

  5. 资产管理平台去除zabbix字样

    1.主机可用性 修改/usr/share/zabbix/include/html.inc.php,文件没有改动过的话在602行,将zbx改成我们需要的即可 2.修改系统信息 修改/usr/share/ ...

  6. LaTeX 插入表格

    普通表格 \begin{table}[h] % h: here \begin{center} % 一个字母代表一列 \begin{tabular}{|c|cccc|} % c: center, l: ...

  7. 国产化适配——人大金仓V8R6(1)

    本文主要记录kingbase安装及存储过程修改相关内容,或有错漏,请指正. 原数据库:Mysql8.0.31 现数据库:KingbaseES V008R006C008M001B0030 on x86_ ...

  8. IEEE754浮点数表示形式

    IEEE754浮点数表示形式 IEEE754浮点数官方文档:https://ieeexplore.ieee.org/document/8766229 浮点数的上述表示形式,既没有规定阶码和尾数的位数, ...

  9. SQL Server – Transaction & Isolation 事务与隔离

    前言 上回在谈到 Concurrency 并发控制 时, 有提到过事务的概念. 这篇就补上它具体的实现. 以前写过相关的文章: sql server 学习笔记 (nested transaction ...

  10. 基于RHEL 9 搭建 KVM 虚拟化环境

    一.准备工作 1. 检查硬件虚拟化支持 KVM 要求处理器支持硬件虚拟化技术:Intel VT-x(虚拟化技术扩展)或 AMD-V(虚拟化技术扩展). 检查方法: 使用以下命令检查 CPU 是否支持虚 ...