基于SAML的单点登录介绍

article/2025/9/14 10:23:29

一、背景知识:

      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,笔者偷懒,简单做了修改)

saml_workflow_vertical2

 

此图片说明了以下步骤。

  1. 用户尝试访问WebApp1。
  2. WebApp1 生成一个 SAML 身份验证请求。SAML 请求将进行编码并嵌入到SSO 服务的网址中。包含用户尝试访问的 WebApp1 应用程序的编码网址的 RelayState 参数也会嵌入到 SSO 网址中。该 RelayState 参数作为不透明标识符,将直接传回该标识符而不进行任何修改或检查。
  3. WebApp1将重定向发送到用户的浏览器。重定向网址包含应向SSO 服务提交的编码 SAML 身份验证请求。
  4. SSO(统一认证中心或叫Identity Provider)解码 SAML 请求,并提取 WebApp1的 ACS(声明客户服务)网址以及用户的目标网址(RelayState 参数)。然后,统一认证中心对用户进行身份验证。统一认证中心可能会要求提供有效登录凭据或检查有效会话 Cookie 以验证用户身份。
  5. 统一认证中心生成一个 SAML 响应,其中包含经过验证的用户的用户名。按照 SAML 2.0 规范,此响应将使用统一认证中心的 DSA/RSA 公钥和私钥进行数字签名。
  6. 统一认证中心对 SAML 响应和 RelayState 参数进行编码,并将该信息返回到用户的浏览器。统一认证中心提供了一种机制,以便浏览器可以将该信息转发到 WebApp1 ACS。
  7. WebApp1使用统一认证中心的公钥验证 SAML 响应。如果成功验证该响应,ACS 则会将用户重定向到目标网址。
  8. 用户将重定向到目标网址并登录到 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的例子。

四、网友的文章推荐:

  1. 揭开SAML的神秘面纱(转)
    http://www.cnblogs.com/perfectdesign/archive/2008/04/10/saml_federation.html
  2. Web 单点登录系统
    http://blog.csdn.net/shanyou/article/details/5372233
  3. 基于SAML的单点登录.NET代理端实现方案
    http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html
  4. SAML

      http://blog.csdn.net/chmsword/article/details/4269602

 

五、本人实现的SSO(介绍建立一个demo简单的思路)

  1. 采用开源项目http://samlsso.codeplex.com/
  2. 建立一个认证中心(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的好处

  1. 出现大大简化了SSO,提升了安全性
  2. 跨域不再是问题,不需要域名也可访问
  3. 不仅方便的实现Webform、Winform的单点登录,而且可以方便的实现java与.net应用的单点登录

 

   本人只是粗略研究了基于SAML的单点登录应用,认知有限,不对之处请各位前辈指点。同时借此博文分享我的学习心得,抛砖引玉。

转载于:https://www.cnblogs.com/zsuxiong/archive/2011/11/19/2255497.html


http://chatgpt.dhexx.cn/article/3xXRJ4VU.shtml

相关文章

走进SAML——基础篇

SAML的全称是Security Assertion Markup Language。提到SAML&#xff0c;我们主要想到的是其在各种单点登录场景中大行其道。单点登录我们通常叫做SSO&#xff0c;那么SAML到底是如何实现SSO的呢&#xff1f;在这个系列的文章中&#xff0c;我将为大家阐释清楚。不过&#xff0…

深入浅出SAML协议

SAML概述 SAML&#xff08;Security Assertion Markup Language 安全断言标记语言&#xff09;是一个基于XML的开源标准数据格式&#xff0c;为在安全域间交换身份认证和授权数据&#xff0c;尤其是在IDP&#xff08;Identity Provider身份提供方&#xff09;和SP&#xff08;…

SAML2.0 笔记(一)

文章目录 一、前言二、初识概念1、SP & IDP 的概念2、认识元数据2.1 IDP MetaData2.1.1 SingleLogoutService2.1.2 SingleSignOnService 2.2 SP MetaData2.2.1 SingleLogoutService2.2.2 AssertionConsumerService 2.3 通用节点2.3.1 EntityId2.3.2 KeyDescriptor2.3.3 Nam…

【学习笔记】白盒及黑盒测试方法简介

目录 测试用例什么是测试用例测试用例的要素 白盒测试白盒测试的基本介绍白盒测试用例设计方法一、 逻辑覆盖法1.语句覆盖2. 判定覆盖3.条件覆盖4.判定-条件覆盖5.条件组合覆盖6.路径覆盖 二、基本路径测试法总结 黑盒测试分类功能测试性能测试 测试设计方法1.等价类法2.边界值…

白盒测试方法的简单理解(通俗易懂)

白盒测试主要使用逻辑覆盖测试方法&#xff0c;包括语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、路径覆盖等。 假设逻辑判断流程图如下图所示&#xff0c;我们简单来说说每种白盒测试方法是如何来进行的。 一、语句覆盖 语句覆盖的定义是&#xff1a;程序中…

详解软件测试中白盒测试基本概念及四种白盒测试方法以及六种逻辑覆盖法(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)

在这篇文章中&#xff0c;我们将讲解白盒测试的基本概念&#xff0c;以及四大常用的白盒测试方法。 一、白盒测试基本概念 1、白盒测试的定义 白盒测试又称为结构测试或逻辑驱动测试&#xff0c;它是把测试对象看成一个透明的盒子&#xff0c;它允许测试人员利用程序内部的逻…

【软件测试】软件测试方法之黑盒测试方法和白盒测试

白盒测试方法 一、概念 白盒测试也称结构测试或逻辑驱动测试&#xff0c;是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例&#xff0c;主要用于软件或程序验证。它可以形象得用下图表示&#xff1a; 二、白盒测试方法应该遵循的原则 保证一个模…

白盒测试及用例详解

目录 第一部分&#xff1a;概念理解 第二部分&#xff1a;上例题 第三部分&#xff1a;例题解答 附&#xff1a;纸质版解答过程 参考链接 第一部分&#xff1a;概念理解 在白盒测试中&#xff0c;逻辑覆盖测试是使用较多的方法。按照其对测试的有效程度&#xff0c;又将其…

白盒测试内容

白盒测试方法根据模块内部结构&#xff0c;基于程序内部逻辑结构&#xff0c;针对程序语句、路径、变量状态等来进行测试。 单元测试主要采用白盒测试方法&#xff0c;辅以黑盒测试方法。白盒测试方法应用于代码评审、单元程序之中&#xff0c;而黑盒测试方法则应用于模块、组件…

白盒测试

一、逻辑覆盖 逻辑覆盖法是最常用的白盒测试方法&#xff0c;它包括以下5种方法&#xff1a; ● 语句覆盖 ● 判定覆盖 ● 条件覆盖 ● 判定-条件覆盖 ● 条件组合覆盖 1.语句覆盖 语句覆盖(Statement Coverage)又称行覆盖、段覆盖、基本块覆盖&#xff0c;它是最常见的覆盖方式…

软件测试——白盒测试

目录 1.什么是白盒测试 1.1 白盒测试优缺点 2.白盒测试方法 2.1 静态 2.2 动态 2.2.1 语句覆盖 2.2.2 判断覆盖 2.2.3 条件覆盖 2.2.4 判定条件覆盖 2.2.5 条件组合覆盖 2.2.6 路径覆盖 2.2.7 基本路径测试法(最常使用) 1.什么是白盒测试 白盒测试也称结构测试&…

白盒测试中的几种覆盖方法

​ ​白盒测试用例设计的一个很重要的评估标准就是对代码的覆盖度。一说到覆盖&#xff0c;大家都感觉非常熟悉&#xff0c;但是常见的覆盖都有哪些&#xff1f;各自有什么优缺点&#xff1f;在白盒测试的用例设计中我们应该如何自如地运用呢&#xff1f;今天小编就为大家总…

「软件测试4」一文详解四大典型的白盒测试方法

软件测试——详解白盒测试基本概念&#xff0c;四种白盒测试方法 这是我参与更文挑战的第3天&#xff0c;活动详情查看&#xff1a;更文挑战 在上一篇文章中&#xff0c;我们讲到了黑盒测试。黑盒测试相较于白盒测试来说比较简单&#xff0c;不需要了解程序内部的代码&#x…

白盒测试方法 + 实战

定义 白盒测试又称结构测试,透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法&#xff0c;白盒指的是程序的内部结构和运作机制是可见的。    目的   通过检查软件内部的逻辑结构&#xff0c;对软件中的逻辑路径进行覆盖测试&#xff1b;在程序…

白盒测试的方法笔记

白盒测试的方法笔记 一、概述&#xff1a;二、方法2.1 语句覆盖&#xff1a;2.2 判定覆盖2.3 条件覆盖2.4 判定条件覆盖2.5 条件组合覆盖2.6 路径覆盖2.7、逻辑覆盖总结 一、概述&#xff1a; 白盒测试也称结构测试或逻辑驱动测试&#xff0c;是针对被测单元内部是如何进行工作…

白盒测试的概念、目的是什么?及主要方法有哪些?

目录 1 白盒测试的概念 2 白盒测试的主要目的 3 测试覆盖标准 4 白盒测试的主要方法 4.1 逻辑驱动测试 4.1.1 语句覆盖 4.1.2 判定覆盖&#xff08;分支覆盖&#xff09; 4.1.3 条件覆盖 4.1.4 判定/条件覆盖 4.1.5 条件组合覆盖 4.1.6 黑盒法补充测试用例 4.2 路径…

白盒测试方法

一、概述&#xff1a; 白盒测试也称结构测试或逻辑驱动测试&#xff0c;是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例&#xff0c;主要用于软件或程序验证。 白盒测试法检查程序内部逻辑结构&#xff0c;对所有逻辑路径进行测试&#xff0c;是…

软件测试笔记(四):白盒测试

1 白盒测试 白盒测试是对软件的过程性细节做细致的检查&#xff0c;把测试对象看作是一个打开的盒子&#xff0c;允许测试人员利用程序内部的逻辑结构以及有关信息&#xff0c;设计或选择测试用例&#xff0c;对程序所有逻辑路径进行测试。通过在不同点检查程序状态&#xff0…

白盒测试方法|白盒测试的六种方法比较分析

白盒测试的六种方法比较分析 一、摘要 白盒测试是测试人员常用的一种测试方法&#xff0c;越来越受到测试工程师的重视。白盒测试并不是简单的按照代码测试用例而走&#xff0c;需要根据不同的测试需求&#xff0c;结合不同的测试对象&#xff0c;使用适合的方法进行测试。本文…

白盒测试的各种方法

文章目录 一、逻辑测试法设计测试用例1.1语句覆盖1.2判定覆盖1.3条件覆盖1.4判断、条件覆盖&#xff08;CDC&#xff09;1.5条件组合覆盖&#xff08;MCC&#xff09; 二、基本路径测试法2.1定义&#xff1a;2.2程序控制流图 白盒测试又叫架构测试 语句覆盖<条件覆盖<判定…