设为首页 收藏本站
查看: 946|回复: 0

[经验分享] 基于SAML的单点登录介绍

[复制链接]

尚未签到

发表于 2017-2-19 10:12:24 | 显示全部楼层 |阅读模式
  一、背景知识:
  SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。
  SAML(Security Assertion Markup Language)是一个XML框架,也就是一组协议,可以用来传输安全声明。比如,两台远程机器之间要通讯,为了保证安全,我们可以采用加密等措施,也可以采用SAML来传输,传输的数据以XML形式,符合SAML规范,这样我们就可以不要求两台机器采用什么样的系统,只要求能理解SAML规范即可,显然比传统的方式更好。SAML 规范是一组Schema 定义。
  可以这么说,在Web Service 领域,schema就是规范,在Java领域,API就是规范。
SAML 作用
  SAML 主要包括三个方面:
  1.认证申明。表明用户是否已经认证,通常用于单点登录。
  2.属性申明。表明 某个Subject 的属性。
  3.授权申明。表明 某个资源的权限。
SAML框架
  SAML就是客户向服务器发送SAML 请求,然后服务器返回SAML响应。数据的传输以符合SAML规范的XML格式表示。
  SAML 可以建立在SOAP上传输,也可以建立在其他协议上传输。
  因为SAML的规范由几个部分构成:SAML Assertion,SAML Prototol,SAML binding等
  安全
由于SAML在两个拥有共享用户的站点间建立了信任关系,所以安全性是需考虑的一个非常重要的因素。SAML中的安全弱点可能危及用户在目标站点的个人信息。SAML依靠一批制定完善的安全标准,包括SSL和X.509,来保护SAML源站点和目标站点之间通信的安全。源站点和目标站点之间的所有通信都经过了加密。为确保参与SAML交互的双方站点都能验证对方的身份,还使用了证书。
  应用
  目前SAML已经在很多商业/开源产品得到应用推广,主要有:
  IBM Tivoli Access Manager
Weblogic
Oblix NetPoint
SunONE Identity Server
Baltimore, SelectAccess
Entegrity Solutions AssureAccess
Internet2 OpenSAML
Yale CAS 3
Netegrity SiteMinder
Sigaba Secure Messaging Solutions
RSA Security ClearTrust
VeriSign Trust Integration Toolkit
Entrust GetAccess 7
  二、基于 SAML的SSO
  下面简单介绍使用基于SAML的SSO登录到WebApp1的过程(下图源自SAML 的 Google Apps SSO,笔者偷懒,简单做了修改)
DSC0000.gif

  此图片说明了以下步骤。

  • 用户尝试访问WebApp1。
  • WebApp1 生成一个 SAML 身份验证请求。SAML 请求将进行编码并嵌入到SSO 服务的网址中。包含用户尝试访问的 WebApp1 应用程序的编码网址的 RelayState 参数也会嵌入到 SSO 网址中。该 RelayState 参数作为不透明标识符,将直接传回该标识符而不进行任何修改或检查。
  • WebApp1将重定向发送到用户的浏览器。重定向网址包含应向SSO 服务提交的编码 SAML 身份验证请求。
  • SSO(统一认证中心或叫Identity Provider)解码 SAML 请求,并提取 WebApp1的 ACS(声明客户服务)网址以及用户的目标网址(RelayState 参数)。然后,统一认证中心对用户进行身份验证。统一认证中心可能会要求提供有效登录凭据或检查有效会话 Cookie 以验证用户身份。
  • 统一认证中心生成一个 SAML 响应,其中包含经过验证的用户的用户名。按照 SAML 2.0 规范,此响应将使用统一认证中心的 DSA/RSA 公钥和私钥进行数字签名。
  • 统一认证中心对 SAML 响应和 RelayState 参数进行编码,并将该信息返回到用户的浏览器。统一认证中心提供了一种机制,以便浏览器可以将该信息转发到 WebApp1 ACS。
  • WebApp1使用统一认证中心的公钥验证 SAML 响应。如果成功验证该响应,ACS 则会将用户重定向到目标网址。
  • 用户将重定向到目标网址并登录到 WebApp1。
  三、开源资源:
  1,SAML SSO for ASP.NET
http://samlsso.codeplex.com/
  其中SAML组件使用的是ComponentSpace SAML v2.0 for .NET,此组件貌似是澳洲一家公司开发的,收费,但不贵。
  里边有VS05,08,10的例子(部分例子是C#,部分是vb.net),也有java调用.net SSO的例子。
  2,a set of WinForms and WebForms SAML demos with Full Source Code
  http://samlclients.codeplex.com/
  此开源项目采用的是UltimateSaml.dll SAML组件,但不开源。里边同时有C#、Vb.net的例子,Webform及winform的例子。
  四、网友的文章推荐:

  • 揭开SAML的神秘面纱(转)
    http://www.cnblogs.com/perfectdesign/archive/2008/04/10/saml_federation.html
  • Web 单点登录系统
    http://blog.csdn.net/shanyou/article/details/5372233
  • 基于SAML的单点登录.NET代理端实现方案
    http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html
  • SAML
  http://blog.csdn.net/chmsword/article/details/4269602
  五、本人实现的SSO(介绍建立一个demo简单的思路)

  • 采用开源项目http://samlsso.codeplex.com/
  • 建立一个认证中心(IDP),二个web应用(SP1),一个类库SSO.Client
  a,其中IDP包括2+3个网页
2个:一个Default.aspx,一个Login.aspx
3个:SSOService.aspx(单点登录服务),SingleLogoutService.aspx(单点登录退出服务),ArtifactResponder.aspx(HTTP-Artifact应答服务)
  b,2个Web的应用结构类似
  1+3个网页
1个:default.aspx主页,获取登录信息
3个:AssertionConsumerService.aspx(校验IDP返回的SAML服务)
SingleLogoutService.aspx(校验IDP返回的退出请求及响应)
ArtifactResponder.aspx(HTTP-Artifact应答服务)
  c,SSO.Client类库
  主要包括一个SSOEntry 及SSOConfig(配置类)【思想可以参考:基于SAML的单点登录.NET代理端实现方案 http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html
  
  其中SSOEntry部分代码如下:
  public class SSOEntry : System.Web.IHttpModule  , IRequiresSessionState, IConfigurationSectionHandler
   {
         #region IHttpModule 成员
  System.Web.HttpApplication Context;
  public void Dispose()
       {
           // throw new Exception("The method or operation is not implemented.");
       }
  public void Init(System.Web.HttpApplication context)
       {
           Context = context;
           context.AcquireRequestState += new EventHandler(context_BeginRequest);
  }
       public object Create(object parent, object configContext, XmlNode section)
       {
           NameValueSectionHandler handler = new NameValueSectionHandler();
           return handler.Create(parent, configContext, section);
       }
  void context_BeginRequest(object sender, EventArgs e)
       {
           HttpApplication application = (HttpApplication)sender;
  Uri url = application.Request.Url;
           //如果不是aspx网页,就不管他了,还可以再加上其它条件,根据正则过滤一些无需单点登录的页面
           if (!url.AbsolutePath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase) || url.AbsolutePath.IndexOf("/SAML")>-1)
               return;
  HttpResponse Response = Context.Response;
           //Response.AddHeader("P3P", "CP=CAO PSA OUR");//加上这个,防止在Iframe的时间Cookie丢失
  if ("" == Context.User.Identity.Name)
           {
               RequestLoginAtIdentityProvider(application);  // 这个方法可以参考开源项目,此处不介绍
           }
  }
  #endregion
  …… 其它代码省略
  }
  d,WebSite1,WebSite2调用SSO.Client
  只需修改Web应用的web.config配置文件即可,加入如下配置信息。这样在请求Web应用的aspx页面时,将首先通过SSO.Client.SSOEntry的context_BeginRequest方法判断用户是否已登录,若未登录或者已超时则生成SAML请求转发至统一认证中心(IDP)
  <!--模块或子系统配置段配置信息-->
<configSections>
   <section name="SSO" type="SSO.Client.SSOEntry,SSO.Client"/>
</configSections>
<!--单点登陆配置信息-->
  <SSO>
  <!--单点登陆登陆页面地址-->
   <add key="SSO.DefaultURL" value="http://127.0.0.1/website1"/>
   <!--单点登陆服务的页面地址-->
   <add key="SSO.SSOServiceURL" value="http://127.0.0.1/SSOIDP/SAML/SSOService.aspx"/>
   <add key="SSO.LogoutServiceURL" value="http://127.0.0.1/SSOIDP/SAML/SingleLogoutService.aspx"/>
   <!--
     Configuration for communicating with the IdP.
     Valid values for ServiceBinding(SP to IDP) are:
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect
         urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact
   -->
   <add key="SSO.SpToIdpBinding" value="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/>
   <!--
   Valid values for ServiceBinding(IDP to SP) are:
   urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
  urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact
  -->
   <add key="SSO.IdpToSPBinding" value="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"/>
   <!--<add key="SSO.ArtifactResolutionServiceURL" value="http://127.0.0.1/SSOIDP/SAML/ArtifactResolutionService.aspx"/>-->
</SSO>
  六、基于SAML的SSO的好处

  • 出现大大简化了SSO,提升了安全性
  • 跨域不再是问题,不需要域名也可访问
  • 不仅方便的实现Webform、Winform的单点登录,而且可以方便的实现java与.net应用的单点登录
  本人只是粗略研究了基于SAML的单点登录应用,认知有限,不对之处请各位前辈指点。同时借此博文分享我的学习心得,抛砖引玉。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-344121-1-1.html 上篇帖子: 谈Java学习 下篇帖子: 回归,程序员
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表