谈论任何人都能理解的单点登录的实现(用源代码)
单点登录的基本概念
单点登录的英文全称是单点登录。SSO意味着在多个应用系统中,用户只需登录一次即可访问所有可信的应用系统。它包括一种机制,可以将这个主登录映射到其他应用程序,以便同一用户登录。它是企业业务集成的流行解决方案之一。(此段摘自百度百科)
今天,本文将介绍单点登录的一个实现。代码超级简单,只是用来验证我的想法是否可行。请完善细节!
二级域名单点登录
什么是二级域名?例如:
对于site1.domain.com site2.domain.com二级域名的单点登录,我们可以通过分享cookies非常方便的实现。简单来说,在设置表单账单时,我们可以将cookies的域名设置为顶级域名,例如:
httpookie cookie=new httpookie(FormsAuthCookieName,encryptticket);饼干。过期=记得我?过期日期时间:MinValue饼干。HttpOnly=true饼干。路径='/';饼干。Domain=' domain.com语境。响应. cookie . set(cookie);该方法不涉及跨域。当cookie的域属性设置为顶级域名时,所有二级域名都可以访问认证cookie。在服务器端,只要对cookie进行验证,就可以实现认证。
但是,当跨越域时,例如:
Site1.comsite2.com此时无法共享cookie,因此上述解决方案将会失败。那么,我们应该怎么做才能实现跨域单点登录呢?请继续往下看。
跨域单点登录
关于跨域SSO的设计思路,我画了一个简单的流程图:
首先,我将跨域单点登录分为两部分:单点登录服务器和单点登录客户端,可以有多个单点登录客户端。
单点登录服务器
单点登录服务器主要负责用户的登录和注销,为单点登录客户端分配访问权限并验证访问权限。
登录和注销使用表单身份验证方法,这在许多地方都有详细介绍。
单点登录服务器分配令牌
在为单点登录客户端分配令牌部分,当单点登录客户端请求单点登录可信页面时,检查单点登录服务器是否登录,如果没有登录,跳转到单点登录服务器登录页面,如果登录了,执行分配令牌的代码,分配后将令牌标识作为参数添加到returnUrl,跳转到returnUrl。具体分配代码如下:
如果(域。安全性。智能认证。登录用户!=null){ //生成令牌并持久化Token domain . SSO . entity . ssotoken=new entity . SSO Token();令牌。用户=新实体。SSO user();令牌。用户。用户名=域。安全性。令牌。LoginID=会话。SessionID领域。SSO . entity . ssotoken . ssotokenlist . add(令牌);//通过拼接返回的url,标记字符串拆分器=returnurl.contains('?') ?'' : '?';return URl=return URl spliter ' token=' token。身份证;回应。重定向(return URl);}令牌分配完成后,页面将带有令牌标识的参数跳转到单点登录客户端页面,并将令牌值添加到单点登录客户端的Cookie中。在每个后续请求中,单点登录客户端通过调用单点登录服务器的服务来验证令牌的有效性。
单点登录服务器身份验证令牌
我通过网络服务验证了令牌。
首先,在单点登录服务器上定义一个网络服务:
[网络方法]公共实体。SSOToken ValidateToken(字符串令牌标识){ if(!KeepToken(TokeID))返回空值;var令牌=域。SSO . entity . ssotoken . ssotokenlist . find(m=m . ID==token ID);返回令牌;}[WebMethod]公共bool KeepToken(字符串tokenID){ var token=Domain。SSO . entity . ssotoken . ssotokenlist . find(m=m . ID==token ID);if (token==null)返回falseif (token。IsTimeOut())返回false令牌。AuthTime=DateTime。现在;返回真;}ValidateToken用于验证TokenID的有效性,KeepToken用于防止Token过期。
单点登录客户端通过调用验证来验证令牌,并获取当前登录用户信息。接下来,看看单点登录客户端的实现。
单点登录客户端
SSO-Client作为可信系统存在,没有认证系统,只能通过SSO-Server完成用户认证工作。
当用户请求单点登录客户端的受保护资源时,单点登录客户端将首先拥有令牌标识,如果有令牌标识,它将调用单点登录服务器的网络服务来验证该令牌标识是否合法。
身份验证成功后,将返回一个SSOToken实例,其中包含登录的用户信息。具体代码如下:
if(!字符串。IsNullOrEmpty(令牌标识)){ AuthTokenService。AuthTokenServiceSoapClient客户端=新的AuthTokenService。authtokenservicesoap client();var token=客户端。验证令牌(令牌标识);if (token!=null) {this.lblMessage.Text='登录成功,登录用户:' token . user . username ' a href=' http://sso-server.com/logout.aspx? Returnurl=' server . urlencode(' http://SSO-client.com ')' exit/a ';} else { Response。重定向(' http://sso-server.com/sso.aspx?返回Url='服务器。UrlEncode(' http://SSO-client.com/default . aspx ');}}else{ Response。重定向(' http://sso-server.com/sso.aspx?返回Url='服务器。UrlEncode(' http://SSO-client.com/default . aspx ');}源代码
文中介绍了我的具体想法和一些实现。如果你还有兴趣,可以下载我的代码Demo。单点登录(single sign-on的缩写)
源代码的部署:
1.在IIS中创建两个站点,分别绑定到单点登录服务器和单点登录客户端,绑定到它们的域名分别是sso-server.com和sso-client.com
2.在hosts文件中添加两行映射,并将sso-server.com和sso-client.com映射到127.0.0.1,以便可以访问它们
3.参观sso-client.com。这时页面会跳转到sso-server.com的登录页面,随便输入用户名和密码,然后点击登录
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:谈论任何人都能理解的单点登录的实现(用源代码)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

















