精华内容
下载资源
问答
  • 单点登录 统一用户管理

    千次阅读 2019-06-07 21:25:00
    单点登录(Single Sign- On,简称 SSO)是指用户成功登录某个业务系统之后,就可以以一定的权限直接访问其他受信任的业务...目前主要有三种较为成熟的单点登录解决方案:基于 Passport 协议的单点登录方案、基于 ...

    单点登录(Single Sign- On,简称 SSO)是指用户成功登录某个业务系统之后,就可以以一定的权限直接访问其他受信任的业务系统,无需再输入用户名和密码等认证信息,大大方便了用户使用各类业务系统。
    SSO的实现技术点包括所有业务系统共享一个身份认证系统和所有应用系统能够识别和提取 ticket 信息。目前主要有三种较为成熟的单点登录解决方案:基于 Passport 协议的单点登录方案、基于 SAML 协议的单点登录方案、基于 CAS协议的单点登录方案。
    微软 Passport 是由微软公司运行的一种 Web 服务,该服务会使用户登录到网站以及执行电子商务交易的过程变得更加简便。微软的 Passport 服务是.Net战略的一部分,通过一次登录就可以使用户获得访问很多网站的权限。

    SAML(Security Assertion Markup Language)是安全
    断言标记语言。SAML 是一个 XML 框架,由一组协议

    用来传输安全声明。SAML获得了广泛的行业认可,并被诸多主流厂商所支持。SAML 2.0 规范说明书主要包含以下四方面内容,
    (1)SAML Assertions 断言:定义交互的数据格式(XML)。
    (2)SAMLProtocols协议:定义交互的消息格式 (XML、processingrules)。
    (3)SAMLBindings 绑定:定义如何与常见的通信协议绑定(HTTP、SOAP)。
    (4)SAML Profile 使用框架:给出对SAML 断言及协议如何使用的建议 (Protocols、Bind-ings)。需要注意的是,SAML并没有提供完整的单点登
    录解决方案,它只是提供了描述安全信息的标准框架和交换安全信息的协议

    CAS 是 Central Authentication Server 的缩写,中央认证服务,一种独立开放指令协议。CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种
    可靠的单点登录方法,CAS 在 2004 年 12 月正式成为JA- SIG的一个项目。CAS具有以下特点:
    (1)开源的企业级单点登录解决方案
    (2)CASServer 是需要独立部署的 Web 应用。
    (3)CAS Client 支持非常多的客户端
    (这里指单点登录系统中的各个 Web 应用),包括 Perl,Java, .Net, uPortal, Apache, Ruby, PHP 等

    转载于:https://www.cnblogs.com/zyt-bg/p/10989230.html

    展开全文
  • 单点登录统一认证

    千次阅读 2017-12-26 13:51:58
    结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网

    随着数字化的不断普及,大型公式或者单位的各个部门逐渐的上了与本身业务相关的各种各样的系统(在这些系统中,以Web系统居多),几乎每个系统都需要识别操作者的身份,并根据其不同的身份,分配一定的权限,做一些操作上的限制。结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网络化发展到一定阶段时,对用户资料的整合起来,进行统一的管理变得十分必要。

    本文的目的在探讨一个简单有效的方案,将有一定联系,拥有统一用户群的系统进行关联,统一用户的登录资料,并提供统一的登录认证入口。统一认证系统与不同应用子系统之间建立一定的信任关系,通过一定的渠道交换认证信息,在保证用户信息安全的基础上,实现认证关系的共享机制。使用户一个地方一次登录之后,便可以在相应的应用系统群中遨游,而不用没到一个系统就进行登录,甚至使用不同的账号和密码进行登录。

    网站与用户之间的认证关系,我们一般通过Session来建立,而Session(一般)在不同网站中是不能共享的。本方案的难点在于统一认证系统和应用子系统之间认证信息的共享。用户在统一认证系统中登录之后,与统一登录系统建立了认证关系,如果用户转向应用子系统,此时如何与子系统建立认证关系,如何将统一认证系统的认证关系迁移复制到子系统,这将是我们要解决的问题。


    ASP.NET的Session保存机制(会话状态模式)有三种......


    ASP.NET 支持三种会话状态模式: 

    InProc:In-Proc 模式将值存储在 ASP.NET 辅助进程的内存中。因此,该模式提供了对这些值的最快访问。但是,当 ASP.NET 辅助进程被回收时,状态数据便会丢失。 

    StateServer:与上一模式不同,StateServer 模式使用独立的 Microsoft Windows 服务来存储会话变量。因为该服务独立于 Microsoft Internet Information Server (IIS),所以它可以在另一独立的服务器上运行。您可以将此模式用于负载平衡解决方案,因为多个 Web 服务器可共享会话变量。尽管在重新启动 IIS 时会话变量不会丢失,但在跨越进程边界时,性能会受到影响。 

    SqlServer:如果会话信息的持久性对于您很重要,那么您可以使用 SqlServer 模式,以便利用 Microsoft SQL Server 来确保达到最高级别的可靠性。SqlServer 模式类似于进程外模式,只是前者的会话数据维护在 SQL Server 中。SqlServer 模式还让您能够利用位于 IIS 进程外的一个状态存储区,该状态存储区既可位于本地计算机上,也可位于远程服务器上。

    网站的默认Session状态模式应该是InProc,限制了本系统网站使用。StateServer和SqlServer都作为扩展,将会话信息存储在IIS进程之外,实现了不同Web服务器之间的共享。当然,这两种模式都需要做相应的配置和消耗一定的性能,我们暂且不说这一点。仔细研究发现,这两种扩展模式主要面向的是网站的分流和负载均衡,共享Session的网站之间的结合是非常非常密切的,并且ASP.NET将所有的实现都进行了封装,我们无法获取和记录每一次共享的细节。这并不适合我们最开始的需求。

    假设:A系统通过Session保存了一个User实例,那么如果B系统需要使用这个Session,则必需拥有A系统中User的细节。如果A、B两个系统是完全不同,甚至其中不同细节User类,更甚至A、B系统中都不只一处功能使用到Session,Session的命名又总碰巧一致。呵呵,那一切将变得不可思议。当然,如果我A、B为统一个系统的两个不同的应用层,那StateServer和SqlServer这两种方式将能够很好的满足需求。至于要满足我们上面的需求,只能是另外想办法了。

    寻找解决办法,我们比较关系用户体验,那么先从用户的使用流程开始.......

    根据我们的需求,用户的体验一般有两种:

    一、对于使用多个子系统的用户,将有可能直接登录统一认证系统,并通过统一系统的子系统连接列表,跳转到多个子系统;二、对于一些使用单个子系统,或者自为单具体事情进入我们平台,或者是登录超时了,这是他应该向直接进入特定子系统,那么我们需要将登录验证在他进入子系统之前插入。两种不同方式的三个系统之间的交互过程如下图所示:


    图 1. 一般步骤,同时登录多个子系统


    图 2. 直接进入子系统,子系统之间跳转

    我将按照第一种交互方式进行解释:

    1、用户先与统一登录系统进行交互,使用唯一的帐号密码进行登录,此时不涉及任何子系统;

    2、用户登录成功后,统一登录系统将信任的应用子系统列表呈现给用户;

    3、用户根据需要,选择子系统连接访问子系统,用户与子系统的交互开始;

    4、由于用户与子系统此时还没有建立认证关系,所以子系统将用户重定向到统一登录系统;

    5、统一登录系统验证用户的登录信息,发现用户已经登录,便将登录信息插入到数据库,再将验证信息发给用户,即返回一个等待页面;

    6、用户将等待页面中的验证信息提交(自动)到子系统,子系统获取认证信息;

    7、子系统通过一定的办法和等待页面中的验证信息进行验证,并与用户建立了信任关系;

    与ASP.NET封装的实现方案项目,这交互过程看起来十分烦碎,我们还需要自己实现大量的功能。但我们的交互实现过程都是可控的,各个系统之间传递的信息内容,什么时候传递,我能都可以限制和约定,并且能够将每一次系统之间的交互记录都进行登记,这才是我们需要的。至于烦碎,其实对用户来说,增加的步骤就是出现自动提交的等待登录页面,如果两个系统都能正常运行,网络也没有出现堵塞,用户等待的时间将及其短暂,甚至没能看到页面。并且我们能够对等待页面做一定的美化,使用户就算看到等待页面,也不会感到厌烦。

    说了这么多,统一认证系统的应用子系统Session的共享还没有开始,这是本方案最大的难点......

    下面就简述统一认证系统的应用子系统Session的共享的实现,我和一位同事根据大伙的讨论结果,分两种方式进行实现,详细情况如下:

    第一种方式:通过MD5加密随机字符串,使用了Web服务实现了子系统和统一认证系统之间的交互验证。验证信息包含两部分用户在统一登录系统的Session ID和数据库中的随机ID。当子系统将用户重定向到统一登录系统的时候,验证的交互过程开始,详细步骤如下:

    1、统一登录系统获取用户的Session ID和登录名

    2、统一登录系统将Session ID和登录名插入到数据库,产生一个随机的数据库ID

    3、将Session ID和数据库ID结合起来,进行MD5加密

    4、使用MD5密文和数据库ID构建一个登录等待页面,返回给用户

    5、用户将登录等待页面中的信息自动提交给子系统

    6、子系统通过Web服务将MD5密文和数据库ID提交回统一登录系统

    7、统一登录系统查询数据库,并进行验证

    8、统一登录系统返回用户登录名,并删除数据库中的登录记录。

    9、子系统与用户建立认证关系


    图 3. MD5随机加密,Web服务实现验证

    第二种方式:通过对认证信息(登录令牌)进行非对称加密,一次交互实现验证。验证信息为一个包含了产生时间的Token类。验证的交互过程同样是在重定向到统一登录系统的时候开始,详细步骤如下:

    1、构建一个包含生成时间的Token类,将Token类序列化

    2、使用SHA-1,对序列化Token编码进行散列,产生验证码H

    3、将序列化Token编码和验证码H结合,使用公钥加密

    4、使用密文构建一个登录等待页面,返回给用户

    5、用户将登录等待页面中的信息自动提交给子系统

    6、子系统使用私钥进行解密

    7、子系统分离出散列验证码H和序列化Token编码,并进行SHA-1验证

    8、检查Token中的生成时间,判断是否超时

    9、子系统与用户建立认证关系


    图 4. 非对称加密,一次交互实现验证两种方式各有优缺点,大家很明显就能看出,我就不做总结。我们最终选择的方案是第一种,并且在验证过程中增加了一个Session识别子系统,防止非法的阻塞和冒充。即在应用子系统将用户重定向到统一认证系统系统时,子系统与用户建立Session,并在用户转交认证信息时,验证是否原本用户。防止有非法者获取了和用户转交的认证信息,并在用户之前提交给子系统,骗取认证。

    展开全文
  • JEECG 集成KiSSO单点登录实现统一身份认证 JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录? 第三方系统如何对接呢? 今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构建大家需要的...

    JEECG 集成KiSSO单点登录实现统一身份认证

    JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录?

    第三方系统如何对接呢?

    今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构建大家需要的业务

     一、KISSO单点登录介绍

              kisso 采用的是加密会话 cookie 机制实现单点登录 SSO 服务,具备“无状态”、“分散验证” 等特性。
             1、session 存放在服务器端,cookie 存放在客户端,存在 2 种状态:“ 第一种:持久 cookie 具有时效性,以文件的形式存放在客户机硬盘中, 时间一到生命周期结束自动被删除。第二种:临时 cookie 又叫会话 cookie 放在浏览器 内存中,浏览器关闭生命周期结束自动失效 ”。
              2、单纯不做任何改变而言 session 更安全,如果 cookie 采取各种安全保护措施,此时的 cookie 一样安全。
              3、cookie 轻松实现分布式服务部署,单点登录跨域访问等问题,换成 session 需要处理 session 复制及各种问题实现困难。

     二、JEECG集成KiSSO实现统一身份认证服务

              JEECG系统作为服务端,实现统一身份认证服务,为其他第三方系统提供统一登录入口,共享用户资源,实现同一个用户名和密码登录多个系统。

              那JEECG如何实现的服务呢?下面切入正题。

              1、服务端集成KISSO

                  (1) JEECG 工程 Maven依赖相关的jar

    <!-- kisso begin -->
    <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>kisso</artifactId>
          <version>3.6.11</version>
    </dependency>
    <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.15</version>
    </dependency>
    <!-- kisso end -->

            (2)服务端项目配置文件。kisso启动配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,JEECG使用的是springMVC框架,我这里选择使用spring方式初始化方式。

               下面两种初始化方式如下:

                第一种:spring方式初始化方式

     <bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
                <property name="ssoPropPath" value="sso.properties" />
                <!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
                <property name="runMode" value="test_mode" />
    </bean>

                第二种:Servlet方式初始化

    <context-param>
             <param-name>kissoConfigLocation</param-name>
             <!-- SSO 属性文件地址根据实际项目配置 -->
             <param-value>classpath:sso.properties</param-value>
    </context-param>
    <listener>
             <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
    </listener>

                     这两种方式,都会加载一个属性配置文件sso.properties该文件放到classpath下

    sso.properties 配置文件内容:

    #单点登录信息加密密钥
    sso.secretkey=Kisso4springMvc80mAS
    #cookie名称
    sso.cookie.name=uid
    #cookie单点服务器登录域名(本地测试需要host配置域名test.com,不能使用ip)
    sso.cookie.domain=.test.com

            至此,服务端集成完成,sso.properties 需要注意的是:sso.secretkey单点登录信息加密密钥,此秘钥在登录完成后会把用户的信息通过此秘钥进行加密,保存到cookie中,为了安全不要泄露此密钥;sso.cookie.domain是单点登录域名配置,配置一级域名。JEECG服务端系统和第三方对接的客户端系统需要在同一个域名下,跨域的问题暂不考虑。

            本地调试时服务的访问一定要使用域名,系统host配置域名test.com即可。

         2、JEECG统一身份认证服务代码实现原理

           JEECG系统集成配置完成,那么怎么实现的统一登录服务呢?

           JEECG系统原有的登录时不能给第三方系统提供统一登录服务,为了不印象原有的系统业务,我们需要另外实现一个登录入口代码如下:(http://sso.test.com:8080/jeecg/toLogin.do

    /**
     * 单点登录
     * @author zhoujf
     * 
     */
    @Controller
    @RequestMapping("/")
    public class SSOController extends BaseController{
        private Logger log = Logger.getLogger(SSOController.class);
        
        
        @RequestMapping(value = "toLogin")
        public String toLogin(HttpServletRequest request) {
            String returnURL = request.getParameter("ReturnURL");
            log.info("SSO 资源路径returnURL:"+returnURL);
            request.setAttribute("ReturnURL", returnURL);
            return "login/login";
        }
        
        
    }


    第三方客户端集成KISSO后如果严重没有登录,则会跳转到这个地址进行登录,在跳转这个地址时会带一个参数ReturnURL,该参数是第三方系统当时访问的请求地址,JEECG服务端登录后会再回跳到这个地址。以上代码段在进入登录页面后把回跳地址带入登录页面,以便登录后回跳该地址

    那么服务端,登录回跳怎么实现的呢?下面在登录逻辑中增加如下代码即可实现:

    //-----------------------单点登录-------------------------------------------------
                /*
                 * 单点登录 - 登录需要跳转登录前页面,自己处理 ReturnURL 使用 
                 * HttpUtil.decodeURL(xx) 解码后重定向
                 */
                String returnURL = (String)request.getSession().getAttribute("ReturnURL");
                log.info("login 资源路径returnURL:"+returnURL);
                if(StringUtils.isNotEmpty(returnURL)){
                    SSOToken st = new SSOToken(request);
                    st.setId(UUID.randomUUID().getMostSignificantBits());
                    st.setUid(user.getUserName());
                    st.setType(1);
                    //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, maxAge);
                    // 可以动态设置 Cookie maxAge 超时时间 ,优先于配置文件的设置,无该参数 - 默认读取配置文件数据 。
                    //  maxAge 定义:-1 浏览器关闭时自动删除 0 立即删除 120 表示Cookie有效期2分钟(以秒为单位)
                    //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, 60);
                    SSOHelper.setSSOCookie(request, response, st, true);
                    returnURL = HttpUtil.decodeURL(returnURL);
                    log.info("login 资源路径returnURL:"+returnURL);
                    request.getSession().removeAttribute("ReturnURL");
                    try {
                        response.sendRedirect(returnURL);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
                //------------------------单点登录------------------------------------------------


    以上服务端统一登录服务就完成了!!!!

     

     三、第三方系统对接JEECG统一认证服务

         1、第三方系统KISSO集成

           (1) 客户端 工程 Maven依赖相关的jar

    <!-- kisso begin -->
    <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>kisso</artifactId>
          <version>3.6.11</version>
    </dependency>
    <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.15</version>
    </dependency>
    <!-- kisso end -->

    (2)第三方项目配置文件。kisso初始化以及登录验证拦截器配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,我这里第三方系统使用的也是springMVC框架,选择使用spring方式初始化方式。

               下面两种初始化方式如下:

                第一种:spring方式初始化方式

     <bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
                <property name="ssoPropPath" value="sso.properties" />
                <!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
                <property name="runMode" value="test_mode" />
    </bean>
    
    <mvc:interceptors>
    <!-- SSO 登录验证拦截器 path 对所有的请求拦截使用/**,对某个模块下的请求拦截使用:/myPath/* -->
    <mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="com.baomidou.kisso.web.interceptor.SSOSpringInterceptor" />
    </mvc:interceptor>
    <!-- SSO 系统权限拦截器 TODO 需要自己实现拦截器来控制权限处理(菜单权限,功能权限控制) -->
    
    </mvc:interceptors>

                第二种:Servlet方式初始化

    <context-param>
             <param-name>kissoConfigLocation</param-name>
             <!-- SSO 属性文件地址根据实际项目配置 -->
             <param-value>classpath:sso.properties</param-value>
    </context-param>
    <listener>
             <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
    </listener>
    
    <!-- SSOFilter use . -->
    <filter>
           <filter-name>SSOFilter</filter-name>
           <filter-class>com.baomidou.kisso.web.filter.SSOFilter</filter-class>
           <init-param>
           <param-name>over.url</param-name>
           <!-- 不拦截的请求配置在这里 -->
           <param-value>/index.jsp</param-value>
           </init-param>
    </filter>
    <filter-mapping>
           <filter-name>SSOFilter</filter-name>
           <url-pattern>/*</url-pattern>
    </filter-mapping>
    --------------------- 
    作者:flyto1206 
    来源:CSDN 
    原文:https://blog.csdn.net/flyto1206/article/details/84388709 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     这两种方式,都会加载一个属性配置文件sso.properties该文件放到classpath下

    sso.properties 配置文件内容:

    #单点登录信息加密密钥
    sso.secretkey=Kisso4springMvc80mAS
    #cookie名称
    sso.cookie.name=uid
    #cookie单点服务器登录域名(本地测试需要host配置域名test.com,不能使用ip)
    sso.cookie.domain=.test.com
    #服务端登录地址
    sso.login.url=http://sso.test.com:8080/jeecg/toLogin.do

    sso.properties 需要注意的是:sso.secretkey单点登录信息加密密钥,和服务端配置保持一致;
    sso.cookie.domain是单点登录域名配置,配置一级域名。和服务端配置保持一致;跨域的问题暂不考虑。
    sso.login.url   是服务端实现的统一登录服务入口地址
    本地调试时服务的访问一定要使用域名,系统host配置域名test.com即可。

     

    以上 第三方系统对接统一认证服务完成!!

       2、测试验证方法

    1、启动JEECG服务端项目

    2、启动第三方系统

    3、找一个第三方系统的请求测试

    例如:http://sso.test.com/jeecg-p3-web/system/back.do?index

    请求后,未登录的情况下,跳转到JEECG统一认证系统进行登录,地址如下:

    http://sso.test.com:8080/jeecg/toLogin.do?ReturnURL=http%253A%252F%252Fsso.test.com%252Fjeecg-p3-web%252Fsystem%252Fback.do%253Findex

    登录之后,回跳到地址 http://sso.test.com/jeecg-p3-web/system/back.do?index

     

    展开全文
  • IdentityServer4实现单点登录统一认证

    千次阅读 2019-03-15 10:38:05
    什么是单点登录统一认证:假如某公司旗下有10个网站(比如各种管理网站:人事系统啊,财务系统啊,业绩系统啊等),我是该公司一管理员或者用户,按照... 为了解决这个问题,所以出现了单点登录统一认证:即 该改管...

     什么是单点登录统一认证:假如某公司旗下有10个网站(比如各种管理网站:人事系统啊,财务系统啊,业绩系统啊等),我是该公司一管理员或者用户,按照传统网站模式是这样:我打开A网站 输入账号密码 然后进入到A网站办点事,办完之后,我有需要到B网站去办点事,这个时候又需要输入账号密码,假如你还要到C网站办点事,又再需要输入账号密码。。。。。

      为了解决这个问题,所以出现了单点登录统一认证:即 该改管理员 登录了其中一个网站得到了ids4的授权之后,他再登入该公司旗下其他网站的时候不需要在输入账号密码,能够直接进入后台办事! 这就是单点登录统一认证!

    本文章目的:

    使用IdentityServer4做一个单点登录统一认证的例子。我会用最简洁的代码和最能让新手懂的方式,来完成这个例子,不会像官方例子一样让新手看起来很吃力,因为我自己就体验过那种感觉^_^

    1.用户访问一个MVC网站 A,A网站发现用户没有登录授权,然后跳转到ids4服务去登录

    2.如果用户在ids4的登录页面上输入了正确的账号密码(从数据库某个用户表验证),则跳转回A网站,然后A网站就可以显示相关的内容

     

    前言:

      博主为了研究ids4,把官方文档断断续续看了几遍,还有网上的很多大神文章都看了下,一句话,看的很累!一直没有找到这么纯粹又实用的例子,经过千难万苦的研究,终于有点成果,现在我决心把这些东西试着以最简单的方式写出来给大家参考,即使你是菜鸟跟着我的步骤来 你也能做出来!大神就忽略哈,如有指教或者建议,请留言!

    有兴趣爱好一起学习交流netcore相关技术的加群:275080612

    开发环境:

    vs2017 、net Core 2.1、sqlserver2012

    一。搭建IdentityServer4服务端

    打开VS2017,新建 netcore项目:    名字叫:IdentityS4, 然后选择webMVC这个,如下图:

     

    引进安装依赖项:IdentityServer4

     

    设置该项目的地址为:http://localhost:5000

     

    新建一个配置文件类:Config.cs  代码如下:

    复制代码

    public class Config
        {
            // scopes define the resources in your system
            public static IEnumerable<IdentityResource> GetIdentityResources()
            {
                return new List<IdentityResource>
                {
                    new IdentityResources.OpenId(),
                    new IdentityResources.Profile(),
                };
            }
    
            // clients want to access resources (aka scopes)
            public static IEnumerable<Client> GetClients()
            {
                return new List<Client>
                {
                    // OpenID Connect隐式流客户端(MVC)
                    new Client
                    {
                        ClientId = "mvc",
                        ClientName = "MVC Client",
                        AllowedGrantTypes = GrantTypes.Implicit,//隐式方式
                        RequireConsent=false,//如果不需要显示否同意授权 页面 这里就设置为false
                        RedirectUris = { "http://localhost:5002/signin-oidc" },//登录成功后返回的客户端地址
                        PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },//注销登录后返回的客户端地址
    
                        AllowedScopes =//下面这两个必须要加吧 不太明白啥意思
                        {
                            IdentityServerConstants.StandardScopes.OpenId,
                            IdentityServerConstants.StandardScopes.Profile
                        }
                    }
                };
            }
        }

    复制代码

     

    在Startup.cs的ConfigureServices方法中注入Ids4服务,如下面红色部分代码:

    复制代码

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
                services.AddIdentityServer()//Ids4服务
                    .AddDeveloperSigningCredential()
                    .AddInMemoryIdentityResources(Config.GetIdentityResources())
                    .AddInMemoryClients(Config.GetClients());//把配置文件的Client配置资源放到内存
    
            }

    复制代码

     

    在Startup.cs的Configure方法中添加ids4服务中间件(注意要放在UseMvc之前就可以):

    app.UseIdentityServer();

     

    现在ids4本身的基本的配置弄好了,下面我们要开始弄跟数据库相关的东西了,大家想想,既然要登录,那肯定需要连接数据库并且读取出其中的用户信息去验证,比如账号、密码。好的,那我们就按照下面一步一步来做

    添加DbContext类 名字叫:EFContext.cs ,代码如下(其中红色部分是我们待会需要添加的实体类,也就是对应数据库里面的用户表Admin):

    复制代码

    public class EFContext : DbContext
        {
            public EFContext(DbContextOptions<EFContext> options) : base(options)
            {
    
            }
    
            #region 实体集
    
            public DbSet<Admin> Admin { get; set; }//注意 这里这个Admin不能写成Admins否则会报错找不到Admins 因为我们现在数据库和表是现成的 这里就相当于实体对应的数据库是Admin
    
            #endregion
        }

    复制代码

     

    添加一个Admin.cs的实体类,对应数据库里面的用户表Admin (然后把这个实体类添加到上一步的EFContext中,也就是上一步代码的红色部分)

    复制代码

    public class Admin
        {
            public int Id { get; set; }
            public DateTime CreateDate { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public string Remark { get; set; }
        }

    复制代码

     

    在Startup.cs的ConfigureServices方法中注入 EFContext,如下面红色部分代码:

    复制代码

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<EFContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("conn")));//注入DbContext
    
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
                services.AddIdentityServer()//Ids4服务
                    .AddDeveloperSigningCredential()
                    .AddInMemoryIdentityResources(Config.GetIdentityResources())
                    .AddInMemoryClients(Config.GetClients());//把配置文件的Client配置资源放到内存
    
            }

    复制代码

     

    接下来,我们就要写Admin这个实体类跟数据库打交道的代码了,比如增删改查啊,在net中一般交DAL层,在netCore中 一般交services层,要注意的是 netcore的框架是IOC的框架,依赖注入的,所以这个services层需要接口的形式!

    新建一个接口:IAdminService.cs 代码如下:

    public interface IAdminService
        {
            Task<Admin> GetByStr(string username, string pwd);//根据用户名和密码查找用户
        }

    新建实现该接口的类AdminService.cs

    复制代码

    public class AdminService:IAdminService
        {
            public EFContext db;
            public AdminService(EFContext _efContext)
            {
                db = _efContext;
            }
            /// <summary>
            /// 验证用户,成功则返回用户信息,否则返回null
            /// </summary>
            /// <param name="username"></param>
            /// <param name="pwd"></param>
            /// <returns></returns>
            public async Task<Admin> GetByStr(string username, string pwd)
            {
                Admin m=await db.Admin.Where(a => a.UserName == username && a.Password == pwd).SingleOrDefaultAsync();
                if (m!=null)
                {
                    return m;
                }
                else
                {
                    return null;
                }
            }
        }    

    复制代码

     

    在Startup.cs的ConfigureServices方法中注入 service层,如下面红色部分代码:

    复制代码

    public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<EFContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("conn")));//注入DbContext
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    
                services.AddIdentityServer()//Ids4服务
                    .AddDeveloperSigningCredential()
                    .AddInMemoryIdentityResources(Config.GetIdentityResources())
                    .AddInMemoryClients(Config.GetClients());//把配置文件的Client配置资源放到内存
    
                services.AddTransient<IAdminService,AdminService>();//service注入
            }

    复制代码

     

    在配置文件appsettings.json中添加数据库连接字符串如下红色部分代码:

    复制代码

    {
      "ConnectionStrings": { "conn": "server=.;database=blogcore;uid=sa;pwd=123" }, 
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*"
    }

    复制代码

     

    至此,应该是可以正确的连接数据库的,大家可以去Home控制器中查询点数据测试下显示到首页,保证能连接数据库成功的查询出数据就可以。

    接下来 我们来做登录页面

    新增一个控制器AccountController,代码如下:

    复制代码

    public class AccountController : Controller
        {
            private IAdminService _adminService;//自己写的操作数据库Admin表的service
            private readonly IIdentityServerInteractionService _interaction;
            private readonly IClientStore _clientStore;
            private readonly IAuthenticationSchemeProvider _schemeProvider;
            private readonly IEventService _events;
            public AccountController(IIdentityServerInteractionService interaction,
                IClientStore clientStore,
                IAuthenticationSchemeProvider schemeProvider,
                IEventService events,
                IAdminService adminService)
            {
                _interaction = interaction;
                _clientStore = clientStore;
                _schemeProvider = schemeProvider;
                _events = events;
                _adminService = adminService;
            }
    
            /// <summary>
            /// 登录页面
            /// </summary>
            [HttpGet]
            public async Task<IActionResult> Login(string returnUrl=null)
            {
                ViewData["returnUrl"] = returnUrl;
                return View();
            }
    
            /// <summary>
            /// 登录post回发处理
            /// </summary>
            [HttpPost]
            public async Task<IActionResult> Login(string userName, string password,string returnUrl=null)
            {
                ViewData["returnUrl"] = returnUrl;
                Admin user = await _adminService.GetByStr(userName, password);
                if (user!=null)
                {
                    AuthenticationProperties props= new AuthenticationProperties
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(1))
                    };
                    await HttpContext.SignInAsync(user.Id.ToString(), user.UserName, props);
                    if (returnUrl!=null)
                    {
                        return Redirect(returnUrl);
                    }
    
                    return View();
                }
                else
                {
                    return View();
                }
            }
        }

    复制代码

     

    添加登录view视图,代码如下:

    复制代码

    @{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Login</title>
    </head>
    <body>
    
        <div align="center">
            <h1>统一认证登录中心</h1>
            <form action="/Account/Login" method="post">
                用户名:<input type="text" name="userName" /><br />
                密 码:<input type="password" name="password" /><input type="hidden" name="returnUrl" value="@ViewData["returnUrl"]" /> <br />
                <input type="submit" value="登录" />
            </form>
        </div>
    </body>
    </html>

    复制代码

     

    至此,IdentityServer4服务端的工作完成,接下来我们要开始建客户端了,也就是需要保护的MVC网站

     

    二。搭建客户端

    新建一个名为 MvcClient 的 

     

    把地址设置为:http://localhost:5002

     

    在Startup.cs的ConfigureServices方法中添加如下红色部分代码(主要用来配置认证中心ids4的及自己作为客户端的认证信息):

    复制代码

    public void ConfigureServices(IServiceCollection services)
            {
                JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    
                services.AddAuthentication(options =>
                    {
                        options.DefaultScheme = "Cookies";
                        options.DefaultChallengeScheme = "oidc";
                    })
                    .AddCookie("Cookies")
                    .AddOpenIdConnect("oidc", options =>
                    {
                        options.SignInScheme = "Cookies";
    
                        options.Authority = "http://localhost:5000";
                        options.RequireHttpsMetadata = false;
    
                        options.ClientId = "mvc";
                        options.SaveTokens = true;
                    });
    
    
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            }

    复制代码

    在 Configure方法中添加这行代码(需要在UseMvc之前就可以):

    app.UseAuthentication();

     

    到此,客户端跟统一认证的信息就配置完了。接下来我们把Home控制器上面加上需要验证的标志:[Authorize]

     

    我们把默认的Index视图页面html代码去掉,改成如下(主要用来显示下授权后拿到的用户信息):

    复制代码

    @{
        ViewData["Title"] = "Home Page";
    }
    
    <div align="center"><h1>这里是受保护的客户端首页</h1></div>
    <h3>User claims</h3>
    
    <dl>
        @foreach (var claim in User.Claims)
        {
            <dt>@claim.Type</dt>
            <dd>@claim.Value</dd>
    
        }
    </dl>

    复制代码

     

     

    到此,客户端的工作也做完了,下面我们要开始启动项目了

     

    设置项目为多项目启动:解决方案上右键-属性

     

    现在我们启动项目:服务器项目和 客户端都运行了,但是客户端会直接跳转到服务端登录页面

    服务端

     

    客户端(5002)跳转过来的登录页面:

     

     

    然后输入正确账号密码 点击登录认证通过之后就跳转回 客户端网站去了

     

    至此 ,例子结束!

    从这个例子中,咱们可以再加几个客户端网站,然后统一到这个ids4认证,这样就达到了单点登录统一认证的效果了!

    源码下载:https://pan.baidu.com/s/1HRiAF7LMinCh03AZNArfcQ

    展开全文
  • 第三方开源登录组件,用于快速接入第三方登录接口
  • 基于CAS的单点登录统一身份认证系统的设计与实现,对统一身份认证及单点登录技术理论进行综合研究,针对用户在使用中记忆多套用户名密码、重复登录等问题,设计出适应性更高、平台藕合性更低、易于旧系统集成的...
  • 绝对完全跨域统一单点登录登出

    万次阅读 热门讨论 2018-05-06 16:38:17
    如:淘宝与天猫,登出也如此,一个系统登出,其他系统的登录也随之失效,这就是统一单点登录登出。 这里配置三个web系统,一个用户中心系统为栗子 配置hosts实现跨域: 127.0.0.1 ssofront.ljtest.xxxx.com #...
  • 单点登录统一身份认证的研究与实现 知网中下载的文献,仅供学习使用。
  • sso单点登录,cas统一认证

    千次阅读 2013-04-26 17:50:25
    Sso(单点登录); CAS(Central Authentication Service,即中央认证服务) Sso是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 统一的认证系统;ticket(统一的认证标志); ...
  • 统一用户认证和单点登录和授权的原理与流程

    千次阅读 多人点赞 2019-02-02 13:58:09
    彻底搞懂统一用户认证和用户单点登录1. 前言2. 原理1. 统一用户认证介绍2. 单点登录原理介绍3. OAuth 2.0的统一用户认证1. OAuth 2.0协议和流程简介2. 授权码模式3. 简化模式4. 密码模式5. 客户端模式6. 授权码模式...
  • 单点登录确实有其存在的道理,无论对用户还是对开发人员或者网站管理人员。能够拥有统一的用户管理入口都是极其重要的。 目标是兼容web端与手机端。 web端使用java,session机制来控制登录状态。 手机端使用token来...
  • 提供一种统一身份认证的解决方案,结合互联网单点登录的思路。用户在其中注册一个单点登录账号,然后针对每个应用系统绑定一个该应用系统中原有的账号,并维护这些注册和绑定信息。绑定的过程需要单点登录管理应用...
  • 单点登录SSO,统一认证oAuth名词解释

    千次阅读 2016-08-24 18:25:33
    CAS( Central Authentication Service ):耶鲁大学开发的单点登录产品 SSO (Single Sign On):单点登录 oAuth(Open Authorization):OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往...
  • 单点登录统一认证解决方案

    万次阅读 2016-04-02 12:42:07
    结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网
  • 统一用户认证和单点登录解决方案

    万次阅读 2016-10-15 14:57:51
     本文以某新闻单位多媒体数据库系统为例,提出建立企业用户认证中心,实现基于安全策略的统一用户管理、认证和单点登录,解决用户在同时使用多个应用系统时所遇到的重复登录问题。 随着信息技术和网络技术的迅猛...
  • 单点登录方案

    2018-09-06 07:25:28
    单点登录统一认证方案,特点是使用了SAML、集中式资源授权、UsbKey等
  • 单点登录统一用户认证UCenter 的配置

    千次阅读 2011-11-17 17:29:19
    Dede+Discuz!+Xweibo+ecshop+wordpress+Ucenter Home+zuitu...单点登录统一用户认证UCenter 的配置 全文带图详情介绍 一.系统介绍  门户 BBS 微博 用户管理中心  Dede Discuz! Xweibo UCenter 版本: V5.7 X2
  • 单点登录

    千次阅读 2019-04-11 19:33:57
    我们的单点登录系统,主要包含了登录验证、token校验、注销、注册几大功能,单点登录系统提供了统一的登录和注册页面,提供了统一的登录token校验接口。 单点登录的主要原理就是在登录成功以后,生成一个令牌,这个...
  • 单点登录(Single Sign On)。是指是在多个应用系统中,用户只需要登录一 次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其 他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务...
  • 具备单点登录功能,并且能为第三方应用提供主流的登录认证。 具备用户的基本信息、角色、资源权限等集中管理和控制。 提供统一的集中办公Portal门户网站,在里面无缝链接其他系统的页面和功能。 关键...
  • 单点登录与单点注销

    千次阅读 2018-02-05 15:22:59
    前言:  单点登录的原理,请参见:... Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。  
  • 统一身份管理与单点登录系统技术白皮书
  • 1.基于SSM框架的Maven搭建 2.搭建业务流程实现如下 (1)创建用户User public class User { ... //登录状态(登陆,未登录) private String status; //用户名 private String username; //密码 private Strin...
  • springboot+redis+shiro单点登录统一异常处理,统一日志,缓存
  • SSO单点登录

    千次阅读 2021-02-05 14:31:45
    单点登录的英文名叫做:Single Sign On(简称SSO)。 SSO是一种统一认证和授权机制,作用在多个应用系统,或者是分布式系统中,用户只需一次登录,就可以访问所有相互信任的其它应用系统,实现自动登录。 比如网页...
  • 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。 SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。你可以阅读了解如何快速在你的应用...
  • 单点登录统一认证

    万次阅读 2011-11-21 10:23:53
    结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,895
精华内容 32,358
关键字:

单点登录统一登录