1. 首页
  2. 文章列表
  3. 博主开源项目——基于ASP.NET MVC5的单点登录系统与权限集成:SSO.Passport.IdentityServer

0.项目起因

    之前由于公司老大说:现在公司线上的项目越来越多,希望把所有系统的登陆帐户进行统一授权和权限管理,最开始给了我一个之前未完成的权限管理系统,但同事说当初在项目架构和设计上出现了很多不足的地方,导致现在项目的重构比较困难,因为之前也接触过单点登录SSO和RBAC权限集成,所以打算另起炉灶,做一个集SSO和RABC规范权限系统于一体的授权中心,因此有了这个项目,由于是我一个人的独立开发与维护,所以开源了。

1. 项目架构介绍

懒得勤快的博客_全栈开发者_互联网分享精神

实线代表实际引用,虚线代表通过反射的方式引用;

应用层的真实引用只需要引用Common和Model以及IBLL即可,从而达到项目间的解耦,但由于生成和发布的原因,导致需要反射引用的类库不能生成到应用层目录下,所以应用层也全部引用了运行时需要的所有项目;

反射引用需要在应用层的web.config中配置DalNameSpaceDalPath以及BllPath,若未配置,则取程序相应的预设值;

如何将应用层的数据请求传到数据层的?

应用程序启动时将通过反射的方式加载业务逻辑层BLL的程序集,并创建相应的接口实例存到autofac容器中,当应用层发起数据请求时,将通过IBLL的接口实例进行处理,依靠BLL调用数据会话层DALFactory来反射创建数据访问层DAL对应的接口实例IDAL,IDAL依靠DAL进行真实的数据库操作,最后将数据返回到应用层。

2. 数据访问框架封装

数据库框架是基于EntityFramework6.1.3为基础进行数据访问层的封装,额外的实现了EntityFramework的一级缓存和二级缓存以及大批量操作优化,分别提供了基本操作、不跟踪操作、缓存操作、异步操作等,DAL层主要的是生成SQL语句和实体的上下文附加操作,BLL层均分别提供了统一保存方法以及增删改并保存的方法

模型层使用CodeFirst为主,带数据库自动迁移、数据库自动创建和初始数据,由于启用了二级缓存,数据上下文对象重写了SaveChanges方法;

解决方案中的ModelFirst的项目仅用于代码生成,不作为项目运行时必须项目引用;

模型层分别提供了与每个实体对应的传入和传出的DTO对象以及ViewModel对象映射关系,映射配置位于Common.RegisterAutomapper.Excute()

3. 权限控制介绍

泳道流程图

懒得勤快的博客_全栈开发者_互联网分享精神

如何使用:

客户端网站引用SSO.Core项目,并在web.config中配置<add key="PassportUrl" value="http://localhost:56075" />,然后在需要登录授权的控制器或方法上打上标签[Authority(Code = AuthCodeEnum.Login)]即可;

主要流程说明:

A站主要逻辑

用户首先访问A站,A站中会生成Token,并存入Cache中。Token是A访问P的钥匙,P在回调给A的时候需要携带这个Token。A请求P,P验证Token,P回调A,A检测Token是否是发送出去的Token,验证之后Token即失效,防止Token被再次使用。

Token的生成是通过取时间戳的不同字段进行MD5加密生成,当然这里可以再加个盐进行防伪,对应的方法是SSO.Core.Client.AuthernUtil.CreateToken(DateTime timestamp)

P回调A的时候进行,A中对Token进行校验,校验不成功则请求P站统一授权验证,即Authority标签。

P站主要逻辑

P站收到授权请求,触发Passport/PassportVertify控制器方法,首先通过Coookie来判断是否登陆,未登录则跳转至登陆页面进行登陆操作。

已登陆则调用SSO.Core.Server.PassportService.AuthernVertify(string token, DateTime timestamp)验证Token

未登录则跳转到登陆页面进行统一授权,在登陆页面加载时也判断Session和Cookie是否存在,若存在,则进行自动登录;

当其他客户端B网站也需要授权时,跳转到P后,若已经登陆,则自动为B网站分配用户密钥;

注销逻辑:

当客户端网站注销时,不会影响到其他客户端网站的登录状态,当P站被注销时,则所有客户端登录状态会丢失。

5. 授权方式介绍

授权方式分为SSO授权、hash时效性校验以及不进行校验,对应的Authority授权码分别为:

SSO:Authority(Code = AuthCodeEnum.Login)

Hash:Authority(Code = AuthCodeEnum.HashCheck)

Public:Authority(Code = AuthCodeEnum.Public)或无

特别的,hash时效性校验必需参数:

time:当前时间到1970-01-01 :00的秒数,

hashtime和加密盐拼接后的MD5次加密结果,加密盐需要config文件中AppSettings节点下键为encryptSalt,若未配置,则取“masuit”的DES默认加密结果;

该校验方式一般用于客户端的RestAPI访问方式以加密url进行防篡改校验。

项目地址:

https://github.com/ldqk/SSO.Passport.IdentityServer

下载为Word文档

版权声明:

本文仅用于学习、研究和交流目的,欢迎非商业性质转载。本文链接:https://masuit.com/54

l  博主在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。如需要详查请直接与键盘生产厂商法人代表联系。挖井挑水无水表,不会网购无快递。

l  文章内容部分来源于互联网,不代表本人的任何立场;涉及到的软件来源于互联网,仅供个人下载使用,版权归该软件开发者所有,请勿用于商业用途,下载后请于24小时内删除,请支持正版!因下载本站资源造成的损失,全部责任由使用者本人承担!如果你是原作者,认为本文内容对您的权益有所侵犯,请联系博主进行投诉,待博主进行严格地审查和背景调查后,情况属实的将在三天内将本文删除或修正。

l  博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。

l  博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!

l  博主只是一名普通的互联网从业者,不懂修电脑,不会卖电脑,不会帮你盗号,不会破解开机密码,找不回你丢失的手机等,如有这样的想法请绕道!

相关推荐:


评论区:

    还没有评论哦,赶紧来写评论吧

    分享按钮