zoukankan      html  css  js  c++  java
  • [转]单点登录在项目中的实现

    这是从Gezidan Studio (鸽子蛋博客)博客里转的文章。

    最近在做一个登录功能,纠结了好几天,一直在找一个能优雅的实现单点登录的功能。博客园有看到某人写了又臭又长的八股文式的文章,没看到有价值的东西。

    其实单点登录最终要解决的是多个不同域名间共享cookie的问题。但是要在不同域名间共享cookie是一件很困难的事情,要在某个域名下面种cookie就必须访问该

    域名。网上有很多方法,看到的有动态创建iframe实现,在iframe里面访问某个域名的页面种下cookie,该方法需要写一些js代码,写起来有点累,所以我最终

    选择了用页面跳转来实现,想不到效果比我预期的好很多,浏览器几乎看不出来有跳转的痕迹。

    详细介绍下流程:

    1. 项目有3个不同的域名,login.susucms.com, suhow.com, sigcms.com。其中login.susucms.com/login.aspx是登录页面。实现的功能是通过login.susucms.com/login.aspx登录后能够实现在访问其他域名也可以保持登录状态。

    2. 在suhow.com和sigcms.com下分别添加一个sso.aspx的页面。

    3. 当用户在login.susucms.com/login.aspx页面点击登录,服务器端通过验证后生成一个token,接着服务器端Response.Redirect到suhow.com/sso.aspx,suhow.com/sso.aspx立即验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后Response.Redirect到sigcms.com/sso.aspx,sigcms.com/sso.aspx也验证这个token是否合法,如果合法则Reponse一个包含登录信息的cookie,然后销毁token,Response.Redirect到登录后的后台。

    整个流程最核心的其实就是跳转。没有其他的了。经过测试,服务器端响应非常快,几乎感觉不到任何跳转,所以再多跳转几个域名,我想是没有什么大问题的。

    简单代码:

    1. login.susucms.com/login.aspx

    01 if (IsLogin)
    02 {
    03     var login = new CrossDomainLogin
    04     {
    05         Key = Guid.NewGuid().ToString(),
    06         CreateTime = DateTime.Now
    07     };
    08     DataContext.CrossDomainLogins.InsertOnSubmit(login);
    09     DataContext.SubmitChanges();
    10  
    11     WriteAuthenticationCookie();
    12     Response.Redirect("http://suhow.com/sso.aspx?key=" + login.Key);
    13 }

    2. suhow.com/sso.aspx

    01 var key = Request.QueryString["key"];
    02 var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
    03 if (login != null)
    04 {
    05     // key will be expired in 3 minutes
    06    if (DateTime.Now > login.CreateTime.AddMinutes(3))
    07    {
    08         RemoveKey(login);   // delete key from database
    09         Response.Redirect("http://login.susucms.com/login.aspx");
    10     }
    11     else
    12     {
    13         WriteAuthenticationCookie();
    14         Response.Redirect("http://sigcms.com/sso.aspx?key=" + login.Key);
    15     }
    16 }
    17 else
    18 {
    19     // ....
    20 }

    3. sigcms.com/sso.aspx

    01 var key = Request.QueryString["key"];
    02 var login = DataContext.CrossDomainLogins.FirstOrDefault(i => i.Key == key);
    03 if (login != null)
    04 {
    05     // key will be expired in 3 minutes
    06     if (DateTime.Now > login.CreateTime.AddMinutes(3))
    07     {
    08         RemoveKey(login);   // delete key from database
    09         Response.Redirect("http://login.susucms.com/login.aspx");
    10     }
    11     else
    12     {
    13         WriteAuthenticationCookie();
    14         RemoveKey(login);   // delete key from database
    15      Response.Redirect("http://login.susucms.com/admin/default.aspx");
    16     }
    17 }
    18 else
    19 {
    20     // ....
    21 }

      

  • 相关阅读:
    用自己的语言描述一下程序连接数据库的过程?
    什么是AJAX?
    怎样计算页面执行的时间?
    缓存的几种不同的实现方法?
    <%@Page%>中的Codebehind AytoEventWireup.inherits有何作用?
    上网搜关于缓存的内容,谈谈你对缓存的理解看法。并回答在网站开发中使用缓存有哪些好处?
    在access中如何创建数据库?你认为数据库在网站开发中所扮演的角色是什么?使用数据库和使用文件,两者的优缺点是是什么?
    什么是Cookie对象,Session对象,application对象?
    docker 部署gin項目
    golang windows endless 运行报错 undefined: syscall.SIGUSR1
  • 原文地址:https://www.cnblogs.com/yhql/p/2220041.html
Copyright © 2011-2022 走看看