Saml是什么
首先,saml是一种xml格式的语言,一种安全断言(标记)语言。在很多sso的场合中, 都支持saml登陆。 这就是saml最多的一个应用场景。 作用相当于大家熟知的OpenID,和Oauth等等。saml主要提供认证功能。
SAML简化了用户、身份提供商和服务提供商的联合身份验证和授权过程。 SAML提供了一种解决方案,允许您的身份提供商和服务提供商彼此分开存在,从而实现集中用户管理并提供对SaaS的访问。
SAML实现了一种在身份提供商和服务提供商之间传递用户身份验证和授权的安全方法。 当用户登录到启用SAML的应用程序时,服务提供商会从相应的身份提供商请求授权。 身份提供商验证用户的凭据,然后将用户的授权返回给服务提供商,用户现在可以使用该应用程序。
Saml2.0
这是saml2.0的一个极其简单的应用场景. 如果你不嫌烦的话,我来解释一下这个图:
图上共有三个角色,
SP: 服务提供者。
Idp: 认证用户并生成断言。
client: 用户。
首先, 你(client)是idp的注册用户, 它有你的用户名和密码,它可以认证你就是你。 其次, SP和Idp两者会被各自的域管理员设置为相互信任对方。并且双方都持有对方的公钥。这是配置好的。第三,有一天,你需要访问sp提供的某个服务,但是sp并不认识你,也没有你的用户名和密码因此不能认证你。 于是就发生了上图所示的8个步骤:
- 你去访问sp的某个受保护资源
- sp发现你是新来的,没有认证信息。当然不能给你这个页面内容了。 他就会生成一个 saml的认证请求数据包(当然是saml格式的)。把这个请求放在一个html的form的一个隐藏的域中,把这个html form返回给你。 这个form后面有一句javascript自动提交这个form。 二而form的action地址就是 提前配置好的 idp上的一个地址。
- 上面的form会被javascript自动提交到idp的某个地址。
- idp也需要认证你, 于是返回给你一个认证的页面, 可能使用用户名密码认证,也可以使用ntlm认证等等一切可以认证你的方式。 因为idp保存有你的用户名和密码。
- 同上一步,也是认证你的一个过程。
- idp在认证你之后。觉得你合法, 于是就为你生成一些断言, 证明你是谁,你有什么权限等等。 并用自己的私钥签名。 然后包装成一个response格式,放在form里返回给你。
- 于是就到了第7步, 这个form被javascript自动提交到sp了。
- sp读到form提交上来的 断言。 并通过idp的公钥验证了断言的签名。 于是信任了断言。 知道你是idp的合法用户了。 所以就最终给你返回了你最初请求的页面了。