提供授权服务,用户使用会员的用户名和密码获取 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. MySQL 5.7 DDL 与 GH-OST 对比分析

    作者:来自 vivo 互联网存储研发团队- Xia Qianyong 本文首先介绍MySQL 5.7 DDL以及GH-OST的原理,然后从效率.空间占用.锁阻塞.binlog日志产生量.主备延时等方面 ...

  2. 03-canvas线条属性

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  3. Cookie,Session Filter,Listener详解

    HTTP请求的无状态性 HTTP的无状态性是其一个重要的特征,指的是HTTP协议本身并不保留客户端与服务器交互的历史信息,换而言之,即每次的HTTP请求都是独立的,服务器在处理每一个请求时都不会记住前 ...

  4. springboot踩坑&问题记录

    常见错误 莫名其妙 classes/:na 前往查看.yml 的配置问题 2.驼峰命名 是因为又用了xml配置,又在yml配置文件中用了mybatis的configuration配置,两个冲突了,不是 ...

  5. java_类方法&对象方法

    int new; 类方法 不能写入和访问其中的对象属性 可以直接通过类调用 通过类调用类方法,没有具体的对象, 所以 不可以访问对象属性, 但是可以访问类属性 public static void d ...

  6. React挂载dom无效的问题

    话不多说,先上代码. 根据我的猜测,ReactDOM.render()这个函数,也就是挂载的意思是将内容进行替换,所以我的vdom1在调试的时候没有展示出来. 然后我创建了两个div块,分别挂载vdo ...

  7. NEWSTAR PWN WEEK1

    ret2text 一个简单的栈溢出 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变.这种问题是一种特定的缓冲区溢出漏洞,类似的还有 ...

  8. manim边学边做--角度标记

    manim中绘制一个角度其实就是绘制两条直线,本篇介绍的不是绘制角度,而是绘制角度标记. 对于锐角和钝角,角度标记是一个弧,弧的度数与角的度数一样: 对于直角,角度标记是一个垂直的拐角. manim中 ...

  9. Vue3 插槽技巧

    最近想着使用Vue3+ElementPlus封装一个后台管理常用的Table组件,设计之初考虑到高自定义性,所以便延伸出以下的代码 使用技术栈: Vue3.x ElementPlus Jsx Jsx ...

  10. sql 分组查询并新增序号

    在SQL中,你可以使用ROW_NUMBER()函数来为结果集中的每一行新增一个序号.这个序号是基于某个排序条件的分区排序结果. 以下是一个简单的例子,假设我们有一个名为students的表,它有两列: ...