如何理解基于的OIDC实现单点登录的原理

今天就跟大家聊聊有关如何理解基于的OIDC实现单点登录的原理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了平度免费建站欢迎大家使用!

不知大家有没有体会,好像看了很多id4(IdentityServer4,下同)的文章,对:

    我们看看发生了啥:

    站点App1

    1. 用户首次访问web App1,App1发现用户未登录,携带目前访问地址302到CAS Server登录页。

    2. CAS Server登录页检查登录Session不存在,返回一个登录页面。

    3. 填写账号,点击登录。

    4. CAS Server验证账号信息成功,创建一个Ticket Granting Ticket(TGT),这个TGT就是当前登录用户的session key。同时,创建一个service ticket并携带service ticket key,st key 作为参数跳转回App1。

    5. App1用get发送st key 去CAS Server验证,验证通过后返回登录用户信息。

    6. App1使用返回的登录用户信息构建当前系统的登录状态,并用一个JSESSIONID标记(JSESSIONID是Apache的默认名),并携带这个JSESSIONID重新访问App1。

    7. App1验证JSESSIONID,登录成功,展示登录成功页面。

    8. 第二次访问,验证JSESSIONID,直接访问。

    站点App2

    1. 用户首次访问web App2,App2发现用户未登录,携带目前访问地址302到CAS Server登录页。

    2. CAS Server登录页携带有App1生成的TGT,那么直接做TCT的验证,验证成功不需要登录,创建一个App2的st key,302回App2。

    3. 后续和以上的5,6,7,8 补逻辑相同,不赘述。

    CAS的流程大概于此,实际的实现可能会复杂一点,可能会遇到各式各样的问题。但有理论支撑,总体实现起来还是简单,可靠有保证的。

    下面说说基于Id4的OIDC是怎么做单点登录的。

    SSO—基于Id4的OIDC实现简析

    先准备环境

    把官方samples下下来:https://github.com/IdentityServer/IdentityServer4/tree/master/samples

    我删掉了其他项目,剩下这两个,一目了然:

    如何理解基于的OIDC实现单点登录的原理

    配置IdentityServer,Configs添加这么一个客户端:

    // sso implicit client
    new Client
    {
       ClientId = "ssoimplicit",  //这个client id 跟 MfcImplicit 里面的配置要一致
       ClientName = "sso implicit clinet",
       AllowedGrantTypes = GrantTypes.Implicit,
       RedirectUris = { "http://sso.client.net/signin-oidc">    PostLogoutRedirectUris = { "http://sso.client.net/signout-callback-oidc" },
       AllowedScopes = new List
       {
           IdentityServerConstants.StandardScopes.OpenId,
           IdentityServerConstants.StandardScopes.Profile,
           IdentityServerConstants.StandardScopes.Email
       }
    }

    ok,我们用下抓包工具观察下登录流程。

    1、受保护客户端页面的访问

    sso.client.net是客户端,而登录页在sso.client.net服务端

    我们先打开需要登录才可以访问的:http://sso.client.net/Home/Secure

    如何理解基于的OIDC实现单点登录的原理

    这里302到了授权端点 http://odic.server.net/connect/authorize

    2、授权端点对客户端请求的验证

    这就是步骤1中, 302挑战的授权端点携带的参数。

    如何理解基于的OIDC实现单点登录的原理

    点击登录,跳转到是否授权页面,这个页面不一定展示,可通过配置Client的RequireConsent=false,跳过这个页面。

    如何理解基于的OIDC实现单点登录的原理

    可以清楚的看到去到了:

    http://odic.server.net/connect/authorize/callback

    callback,哦,这是一个登录回调,它干了啥呢,我们仔细看响应:

    如何理解基于的OIDC实现单点登录的原理

    我们看到id_token带有登录用户的信息:

    iss:token发放的服务器地址

    aud:clientid

    sid:会话信息

    kid:当前token的标识符

    name:用户名

    此外还有比如id_token的发放时间,过期时间,nonce,用户非机密信息等等。还有蓝色部分需要使用客户端公钥验证的签名等等。

    这个时候客户端已经拿到登录用户的信息了,这时客户端直接使用登录用户信息,构建当前应用sso.client.net的登录状态即可。

    比如下面的这个 Set名为Implicit的Cookie:

    如何理解基于的OIDC实现单点登录的原理

    单点登出

    单点登出我就不细说了,使用:

    //指定登录方案的方式登出
    await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);

    //或者直接
    await HttpContext.SignOutAsync();

    暴力点删除cookie也可以,不过那只能算是半退出状态吧。

    总结

    通过对以上一个使用Id4构建的OIDC实现的登录流程来看,OIDC的SSO它完全无光域名的,id4登录成功后,客户端通过使用id_token来构建自身的登录状态,一个client如此,N个皆然。

    大家好像感觉这个SSO的实现方式跟前面的CAS流程很像诶,我们再看一遍前面CAS的图,好像是发现了啥不得了的东西。

    没错:openid也是基于CAS流程的一个实现(我根据理解猜的 没有证据)。

    再多说两句

    id4确实是好东西,暂时用不上也要多了解、学习,最好写个博客做个笔记加深下理解。

    在理解的基础上不要去背各种Flow有啥区别什么的,知道什么场景下用那种流程就行,也没几个。

    看完上述内容,你们对如何理解基于的OIDC实现单点登录的原理有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


    标题名称:如何理解基于的OIDC实现单点登录的原理
    文章转载:http://ybzwz.com/article/jpgpsg.html