首页 > 其他分享 >dotnet core微服务框架Jimu ~ 会员授权微服务

dotnet core微服务框架Jimu ~ 会员授权微服务

时间:2024-10-30 20:43:45浏览次数:3  
标签:core Jimu System Auth member token dotnet using

提供授权服务,用户使用会员的用户名和密码获取 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();
                }
            }
        }
    }
}

 

标签:core,Jimu,System,Auth,member,token,dotnet,using
From: https://www.cnblogs.com/flamesky/p/18516573

相关文章

  • 管中窥豹----从String Intern中观察.NET Core到.NET 8 托管堆的变迁
    简介https://www.cnblogs.com/lmy5215006/p/18494483在研究.NETString底层结构时,我所观察到的情况与《.NETCore底层入门》,《.NET内存管理宝典》书中描述不符。故多研究了一下。发现.NET托管堆的结构也是越来越多,越来越高性能。 //示例代码internalclassProgram{......
  • dotnet core微服务框架Jimu介绍
    jimu是一个基于.Net6.0简单易用的微服务框架,参考了很多开源库以及想法,使用了大量的开源库(如DotNetty,consul.net,Flurl.Http,Json.net,Log4net,Quartz.net...),支持分布式、高并发和负载均衡,实现了服务治理(如服务注册、发现、健康检测...)和RPC调用。jimu(积木),正......
  • 在netcore中使用Influxdb2
    Program.csusingInfluxDB.Client.Api.Domain;usingInfluxDB.Client.Writes;usingInfluxdb2.Demo.model.db;usingInfluxdb2.Demo.model.dto;namespaceInfluxdb2.Demo{internalclassProgram{staticstringurl="http://127.0.0.1:8086......
  • 在 ASP.NET Core 中使用 EF Core 进行开启事务工作单元(Unit of Work) 仓储层,服务层模式
    在ASP.NETCore中使用EntityFrameworkCore实现一个带有事务的工作单元(UnitofWork)模式的仓储层和服务层,可以确保在执行多个数据库操作时具有原子性。这样,即使某个操作出现错误,所有操作也可以回滚。以下是如何实现这个模式的详细步骤:定义实体类我们首先定义一个简单的实......
  • C#03-.NET Core学习笔记
    @目录1.关于.NET1.什么是.NET?2.什么是.NETFrameWork?3.什么是.NETCore?4.NETCore的优点2.异步编程1.C#中async、await关键字2.编写异步方法3.异步方法并不等于多线程4.为什么有的异步方法没标async5.不要用sleep6.CancellationToken7.WhenAll8.异步编程中其他问题1.接口中的异......
  • ASP.Net Core 8 Web API整合Swagger UI并进行模块分组吃屎般瞬间记录
    一、开发环境开发工具:VisualStudio2022工程模板:ASP.NetCore8WebAPI工程(官方标准的).Net环境:.NetCore8.0NuGet依赖:Swashbuckle.AspNetCore6.9.0(UI用的默认的UI界面,可以自由选择其他的UI界面)二、基本概述参考了网上很多大佬的帖子,实现基本就两种:1、用自定义At......
  • orchard core 2 的user模块,添加phonenumber手机号的liquid支持
    老外习惯用email,我们要求的是要手机号。所以除了采用二次验证(2FA),发现工作流要给用户发送通知短信无法获取对应的手机号。所以对源码进行扩展增加了liquid获取手机号。1、下载源码可以clone也可以下载2、找到对应modules的user模块直接在starup.cs找到LiquidStartup添加显......
  • 在 HarmonyOS Next 中使用 Core File Kit 管理应用文件
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的文件管理技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在应用开发中,文件的创建、读......
  • [rCore学习笔记 031] SV39多级页表的硬件机制
    看到这个题目就知道上一节提到的RISC-V手册的10.6节又有用武之地了.这里只需注意,RV32的分页方案Sv32支持4GiB的虚址空间,RV64支持多种分页方案,但我们只介绍最受欢迎的一种,Sv39。:RISC-V的分页方案以SvX的模式命名,其中X是以位为单位的虚拟地址的长度。虚拟地址和物理地址......
  • 适用于 Visual Studio 的 SDK 下载 .NetCore,NET Standard,Framework各个版本
     微软官方下载地址:https://dotnet.microsoft.com/zh-cn/download/visual-studio-sdks?cid=getdotnetsdk 以下适用于VisualStudio的.NET的各种SDK。有关更多选项,请访问下载页面。.NET/.NETCore.NET是一个免费的、跨平台的、开源开发人员平台,用于构建许多不同类型的应......