zoukankan      html  css  js  c++  java
  • IDS4 傻瓜式实践指南

    前言:

    这是一篇实践指南,不会过多的解释原理(因为我也说不清楚,想了解的同学请移步老张的博客,里面有非常详细的介绍),本篇文章讲解如何简单的使用IDS4来实现单点登录,以及遇到的一些坑
    实现功能:

    1.持久化数据到数据库
    2.自定义认证
    3.创建用户
    4.创建客户端列表
    5.创建资源列表
    6.服务端部署

    准备工作:

    1.Linux服务器(建议Centos 7+)

    2.Mysql(5.7+)

    3..net core SDK 3.1

    4.基于内存模型,能简单使用IDS4

    欢乐时光(吹牛逼),就要开始了........

    体验地址:https://admin.wmowm.com/

    开源地址:https://github.com/wmowm/gourd/

     项目结构如图所示,MVC项目,授权服务,资源服务

     在持久化数据库过程中,我遇到了很多问题,这里就不过多说明了,这也是第一道坎,我这里的迁移文件已经整理好了,准备一个空的mysql数据库,取消InitializeDatabase(app)的注释,运行项目即可

     Identity有自己的一套验证规则(太过于复杂,没那么多精力去折腾),我也在这个上吃了大亏,将它替换成我们熟悉的模式就可以了,怎么简单怎么来

     public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
            {
                try
                {
                    var userName = context.UserName;
                    var password = context.Password;
    
                    //验证用户,这么可以到数据库里面验证用户名和密码是否正确
                    var claimList = await ValidateUserAsync(userName, password);
    
                    // 验证账号
                    context.Result = new GrantValidationResult
                    (
                        subject: userName,
                        authenticationMethod: "custom",
                        claims: claimList.ToArray()
                     );
                }
                catch (Exception ex)
                {
                    //验证异常结果
                    context.Result = new GrantValidationResult()
                    {
                        IsError = true,
                        Error = ex.Message
                    };
                }
            }
            /// <summary>
            /// 验证用户
            /// </summary>
            /// <param name="loginName"></param>
            /// <param name="password"></param>
            /// <returns></returns>
            private async Task<List<Claim>> ValidateUserAsync(string loginName, string password)
            {
                //TODO 这里可以随意验证了
                var user = await _context.Users.FirstAsync(m => m.UserName == loginName && m.PasswordHash == password);
                if (user == null)
                    throw new Exception("登录失败,用户名和密码不正确");
    
                return new List<Claim>()
            {
                new Claim(ClaimTypes.Name, $"{loginName}"),
            };
            }

    创建用户,在初始化的时候,我们已经默认添加了一个用户进去了,由于使用自定义的验证规则,这里就可以随便弄了,只要把数据插入到指定的表就可以了

    #region 读取初始化数据
                string userId = Guid.NewGuid().ToString();
                string roleId = Guid.NewGuid().ToString();
                List<SysUser> usereInfo = new List<SysUser>()
                {
                    new SysUser()
                    {
                        Id = userId,
                        Account = "tibos",
                        Name = "tibos",
                        Password = "123456"  //这里建议存MD5密文
                    }
                };
    
                List<SysRole> SysRole = new List<SysRole>()
                {
                    new SysRole()
                    {
                        Id = roleId,
                        Memo = "管理员",
                        Name = "admin"
                    }
                };
    
                List<SysUserRole> SysUserRole = new List<SysUserRole>()
                {
                    new SysUserRole()
                    {
                        Id = Guid.NewGuid().ToString(),
                        RoleId = roleId,
                        UserId = userId
                    }
                };
    
                #endregion

    我也用LayUI写了一个简单的CRUD,方便大家添加用户

     添加客户端,这里面的水就有点深了,涉及到的表有点多,作为一个懒人,我肯定是不会每个表都去弄的,参考初始化导入内存模型里的客户端,我弄了两个最常用的客户端,webapi,mvc 这个对应IDS4里的AllowedGrantTypes类型,我们常用的客户端分为

    1.传统的Web项目,如mvc 

    2.前端项目, 如vue

    3.桌面程序, 如winform,postman

    这些我项目里都有实践

    它的添加是一个json文件,可以参考内存模型自己随意改

     添加资源比较简单,每个资源拥有多个密钥

     它们三者的关系,因为我把用户单独提出来了,这里只说客户端与资源, 一个客户端的访问范围可以指定多个资源

    做完了这些,你以为你已经掌握IDS4了,其实还差的远,本地一切正常,部署到服务器上的时候,又是一堆问题

    1.https问题,建议在程序里做强行跳转,而不是在nginx里跳,nginx http重定向到https的时候,ids4检查是不通过的,但是在iis上却是正常的

    2.跨域问题,建议也在程序里设置允许跨域,如果nginx跟程序都设置了允许跨域,则会出现两个请求头的异常

    3.前端程序,第一次登录成功,回调的地址没有携带id_token,我这里是再回调页面再重新登录一次,第二次checksession会带上id_token,这样就可以拿令牌换access_token了,在使用access_token访问受保护的资源

    4.受保护资源最好也配置成https,当web站点是https时,js请求http的api资源会报错,这个是浏览器限制

    AllowedGrantTypes

  • 相关阅读:
    Nginx--sub_filter模块
    Scala学习5 objext
    Scala学习4 Class
    Scala学习3 Map
    Scala学习2 Array、ArrayBuffer
    Scala学习1 基本数据类型,条件,循环
    flink1.9新特性:维表Join解读
    Blink源码编译
    Flink Maven项目兼容多版本Kafka
    Ant build.xml程序简单说明
  • 原文地址:https://www.cnblogs.com/tibos/p/12803744.html
Copyright © 2011-2022 走看看