前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何将Spring Security 集成 SAML2 ADFS 实现SSO单点登录?

如何将Spring Security 集成 SAML2 ADFS 实现SSO单点登录?

原创
作者头像
Kahen
发布2023-12-04 11:36:57
9892
发布2023-12-04 11:36:57
举报

SAML 登录概念

在学习之前,首先要了解SAML的概念,SAML主要有三个身份:用户/浏览器,服务提供商,身份提供商

  • “身份提供者”和“断言方”是同义词,在ADFS,OKta通常叫做IDP,而在Spring这些经常被缩写为AP。简而言之用户需要重定向到IDP去登录,以绕过服务提供商,避免让服务提供商获取用户敏感信息。
  • “服务提供者”和“信赖方”也是同义词,在ADFS,OKta通常叫做SP,而在Spring通常叫做RP。

IDP(Identity Provider)身份提供者 解释:IDP负责验证用户的身份,并生成包含有关用户身份信息的安全断言(assertion)。在SAML中,IDP通常是由一个组织或服务提供商提供的,用于验证用户身份。 AP(Attribute Provider)属性提供者,基本等同IDP 解释:AP是一个提供用户属性信息的实体。在SAML中,这些属性信息可能包括用户的姓名、电子邮件地址、角色等。AP通常与IDP分开,以便属性信息可以由专门的实体进行管理。 SP(Service Provider)服务提供者 解释:SP是依赖SAML断言来对用户进行授权的实体。SP可能是一个Web应用程序、服务或资源,它依赖IDP生成的断言来确定用户是否有权访问受保护的资源。 RP(Relying Party)依赖方 SP 同义词 解释:RP是指依赖SAML断言来接受或拒绝用户访问请求的实体。RP可以是SP的同义词,表示它依赖IDP生成的断言来进行用户授权。

我们先来看看SAML 2.0依赖方认证在Spring Security中是如何工作的。首先,我们看到,像OAuth 2.0 登录一样,Spring Security 将用户带到第三方进行认证。它通过一系列的重定向来做到这一点。

ADFS 登录流程

以上是根据Spring官方文档来描述,请参考:SAML 2.0 Login Overview


用大白话讲,就是你要去看一个张学友演唱会(SP),你是内部人员你直接去了,保安(Spring Security)不让你进!保安说你没有授权证明(authorities),并且告诉了你去哪里写证明,并且给你了一封介绍信(AuthRequest),你带着介绍信去了验证方(IDP),提供了你的id和密码,验证方看到你的介绍信,验证格式发现印章是真的,id密码也是真的,就给你写了一封证明,让你带着进场,拿着这个证明,演唱会(SP)里面的服务你怎么想溜达就怎么溜达.

实战配置

首先配置的目的,就是为了配置SP(你的spring app)和IDP(ADFS/AzureAD/Okta)配置信任,因此SP需要配置一个sp metadata.xml 提供给IDP导入信任,然后IDP需要暴露一个IDP metadata.xml提供给SP引入,SP在访问时带着自己的sp metadata,IDP对其验证后发现时可信任的,就允许你在这边登录,并且成功后重定向到你配置的链接

IDP方配置

一、ADFS

  1. 获取联合元数据 XML

在 AD FS 管理应用程序内,找到联合元数据 xml 文件。单击 AD FS > 服务 > 端点,然后在“元数据”部分中找到 URL 路径即可找到此信息。该路径通常为/FederationMetadata/2007-06/FederationMetadata.xml ,如下所示:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

要下载元数据文件,通常可以通过在服务器上的浏览器中加载 URL 来找到该文件。例如: https://<您的主机名>/FederationMetadata/2007-06/FederationMetadata.xml 下载此文件并保存到计算机。

可选的,你可以直接copy这个url,在后续Spring app 直接导入

添加图片注释,不超过 140 字(可选)

2.创建信赖信任方

创建你的服务作为依赖信任方(以Spring 配置为例)

添加图片注释,不超过 140 字(可选)

导入你的程元数据

通过完成信赖方信任向导,导入之前从Spring导出的sp metadata元数据,如以下步骤所示:

添加图片注释,不超过 140 字(可选)

在公网可以用的话选用第一项,更新很方便,否则选用第二项自行导入,因为要求必须是https链接,或者设置局域网https

添加图片注释,不超过 140 字(可选)

输入显示名称

添加图片注释,不超过 140 字(可选)

选择访问控制策略

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

到这一步点完成就可以了

但是还缺一步,ADFS需要你配置发放的字段,至少需要配置一个NameID属性,否则你会发现登录完报错,可自行尝试。接下来是配置属性

创建索赔发放政策规则

要在 AD FS 和 App 之间映射属性,您需要创建一个声明发布策略,其中将LDAP 属性作为声明发送,并将 LDAP 属性映射到 SpringApp 属性。

添加图片注释,不超过 140 字(可选)

添加规则

选择规则类型

声明规则名称-映射

重要提示:确保 至少有个属性(“NameID“)配置为使用如上所示的准确拼写

到此ADFS配置完成

二、Azure AD(现在是Microsoft Entra ID)

注册好Microsoft Entra ID,点击应用注册,注册一个程序

添加图片注释,不超过 140 字(可选)

配置重定向URI,这里学习先用http://localhost:8080/saml/SSO,需要注意上文ADFS配置是必须https,如果局域网或者自己机子测试,推荐局域网用nginx 或者host 配置个局域网https

Azure AD的重定向URI

获取idp metadata,打开终结点(endpoint),saml登录终结点便是

终结点

SP 配置

一、最小依赖 SAML 2.0服务提供者支持在 spring-security-saml2-service-provider 中。它建立在OpenSAML库的基础上。

二、最小配置

在使用 Spring Boot 时,将一个应用程序配置为一个服务提供者包括两个基本步骤。

  1. 添加所需的依赖。
  2. 指定必要的断言方元数据。 a.添加依赖时,由于没maven最新的镜像仓库并没有opensaml-core:4.x.x版本,而shibboleth.net有,因此引入依赖需要指定一下镜像仓库。
代码语言:javascript
复制
repositories {
 mavenCentral()
 maven { url "https://repo.spring.io/milestone" }
 maven { url "https://repo.spring.io/snapshot" }
 maven { url "https://build.shibboleth.net/nexus/content/repositories/releases/" }
}

b.添加必要最小依赖

代码语言:javascript
复制
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.security:spring-security-saml2-service-provider'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

    testImplementation 'net.sourceforge.htmlunit:htmlunit:2.70.0'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

c.指定身份提供者(Identity Provider)元数据

在Spring Boot应用程序中,要指定一个身份提供者的元数据,请创建类似于以下的配置。

代码语言:javascript
复制
spring:
  security:
    filter:
      dispatcher-types: async, error, request, forward
    saml2:
      relyingparty:
        registration:
          metadata:
            entity-id: "{baseUrl}/saml2/service-provider-metadata/one"
            singlelogout:
              binding: POST
              url: "{baseUrl}/saml/logout"
              responseUrl: "{baseUrl}/saml/SingleLogout"
            acs:
              location: "{baseUrl}/saml/SSO"
            assertingparty:
              metadata-uri: https://login.microsoftonline.com/603e9946-79fd-42bc-bae2-2abda19cb695/saml2

其中:

  • entity-id 是身份提供者发出的SAML响应中的 Issuer 属性所包含的值,在adfs就是你的唯一id,相当于依赖方的 <EntityDescriptor EntityID="..."/> 中找到的值。该值可能包含多个占位符。它们是baseUrl 、 registrationId 、 baseScheme 、 baseHost和basePort
  • singlelogout.url 是SingleLogoutService 位置相当于依赖方的 <SPSSODescriptor> 中的 <SingleLogoutService Location="..."/> 中找到的值。。
  • acs.location是AssertionConsumerService 位置。相当于依赖方的 <SPSSODescriptor> 中的 <AssertionConsumerService Location="..."/> 中找到的值该值可能包含多个占位符。它们是baseUrl 、 registrationId 、 baseScheme 、 baseHost和basePort 。
  • assertingparty.metadata-uri 是断言方元数据文件的基于类路径或文件的位置或 HTTP 端点

就这样!已经完成了最小配置!当然,仍然可以配置个controller或者html来接受登录成功后的用户数据,详情可以看我后面分享的源码

程序启动之后 访问http://localhost:8080 应该就可以登录了,登录界面如下

添加图片注释,不超过 140 字(可选)

输入账号密码后,登录成功的界面如下:

添加图片注释,不超过 140 字(可选)

本次示例链接:https://github.com/Kahen/spring-security-saml2-azure-ad-example

参考链接:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SAML 登录概念
  • 实战配置
  • IDP方配置
    • 一、ADFS
      • 二、Azure AD(现在是Microsoft Entra ID)
      • SP 配置
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档