在学习之前,首先要了解SAML的概念,SAML主要有三个身份:用户/浏览器,服务提供商,身份提供商
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对其验证后发现时可信任的,就允许你在这边登录,并且成功后重定向到你配置的链接 |
---|
在 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配置完成
注册好Microsoft Entra ID,点击应用注册,注册一个程序
添加图片注释,不超过 140 字(可选)
配置重定向URI,这里学习先用http://localhost:8080/saml/SSO,需要注意上文ADFS配置是必须https,如果局域网或者自己机子测试,推荐局域网用nginx 或者host 配置个局域网https
Azure AD的重定向URI
获取idp metadata,打开终结点(endpoint),saml登录终结点便是
终结点
一、最小依赖 SAML 2.0服务提供者支持在 spring-security-saml2-service-provider 中。它建立在OpenSAML库的基础上。
二、最小配置
在使用 Spring Boot 时,将一个应用程序配置为一个服务提供者包括两个基本步骤。
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.添加必要最小依赖
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应用程序中,要指定一个身份提供者的元数据,请创建类似于以下的配置。
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
其中:
就这样!已经完成了最小配置!当然,仍然可以配置个controller或者html来接受登录成功后的用户数据,详情可以看我后面分享的源码
程序启动之后 访问http://localhost:8080 应该就可以登录了,登录界面如下
添加图片注释,不超过 140 字(可选)
输入账号密码后,登录成功的界面如下:
添加图片注释,不超过 140 字(可选)
本次示例链接:https://github.com/Kahen/spring-security-saml2-azure-ad-example
参考链接:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。