dotnet core微服务框架Jimu ~ 会员授权微服务
提供授权服务,用户使用会员的用户名和密码获取 token, 带着 token 访问受保护的接口,如浏览和发布新闻。
有 2 个公开的 api:
- token: 获取 token;
- GetCurrentMemberInfo: 获取当前 token 的会员信息;
有 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 ~ 会员授权微服务的更多相关文章
- .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...
- NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成
本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事; 一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- 学学dotnet core中的身份验证和授权-1-概念
前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...
- .Net Core 分布式微服务框架介绍 - Jimu
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...
- Net Core 分布式微服务框架
Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...
- spring cloud 入门,看一个微服务框架的「五脏六腑」
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
- 从 Spring Cloud 看一个微服务框架的「五脏六腑」
原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...
- 从 Spring Cloud 看一个微服务框架的「五脏六腑」(转)
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 本文将从 Spring Cloud 出发,分两小节讲述微服务框架的「五脏六腑」: ...
- kratos微服务框架学习笔记一(kratos-demo)
目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...
随机推荐
- OSI 七层网络模型和 TCP/IP 四层网络模型
OSI 七层网络模型 网络的七层架构从下到上主要分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层 物理层主要定义物理设备标准,它的主要作用是传输比特流,具体做法是在发送端将 1.0 码 ...
- .NET MAUI 里,为什么 FlexLayout 这么难用?
管中窥豹,可见一斑 Layout: FlexLayout:
- docker离线环境下部署时间同步服务
服务端部署 在线环境 docker run --name=ntp-server \ --restart=always \ --detach \ --publish=123:123/udp \ --re ...
- win10无法访问共享文件夹win2008R2 错误代码0X80004005
错误代码0X80004005 无法访问共享计算机的解决方法 开始->运行(快捷键"win+R"),输入"regedit"后回车,打开注册表编辑器. 依次打 ...
- ES7.5.2索引生命周期管理(附操作示例)
一.前言 es可以用来存储日志,一般日志存储只是短期保存,超过一定时间日志要是能自动删除最好,这样保证索引文档不会过多,查询时效性也能得到保证.本文参考的官网地址是:https://www.elast ...
- DDD是软件工程的第一性原理?
本文书接上回<DDD建模后写代码的正确姿势>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术实现交流: 视 ...
- 使用 Portainer CE 管理 Docker
此文档参考官方文档 Install Portainer CE with Docker on Linux 编写. 创建容器 docker volume create portainer_data 启动 ...
- sicp每日一题[1.41]
Exercise 1.41 Define a procedure double that takes a procedure of one argument as argument and retur ...
- 鸿蒙(Harmony) NEXT - AlphabetIndexer实现联系人字母索引
鸿蒙(Harmony) NEXT 9月份就要正式上架了,并且不会再兼容安卓平台,于是我也赶紧给App开发鸿蒙版本,接下来会写一系列的Harmony开发教程. 今天使用AlphabetIndexer实现 ...
- QT6跨平台开发
QT6跨平台开发 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技术 ...