跳到主内容

腾讯云(SAML)

本指南将Casdoor配置为腾讯云(CAM)的SAML身份提供商。

从Casdoor获取SAML元数据

  1. 在Casdoor中添加X.509证书(RSA)
  2. 从应用程序(或元数据URL)中复制SAML元数据

添加证书 复制SAML元数据

在腾讯云中添加SAML IdP和角色

  1. 登录腾讯云并打开访问管理(CAM)。
  2. 创建一个新身份提供商并上传Casdoor SAML元数据。
  3. 创建一个新角色并选择该身份提供商。

登录访问管理 创建Saml idp Saml角色创建

在Casdoor中配置应用程序

  1. 在应用编辑页面上,选择证书,并将腾讯云域名添加到重定向 URL
  2. 设置ACS URL并按如下方式配置SAML 属性

选择证书并添加重定向URL 添加acs url并配置saml属性

名称名称格式
https://cloud.tencent.com/SAML/Attributes/Role未指定qcs::cam::uin/{'{'}AccountID{'}'}:roleName/{'{'}RoleName1{'}'};qcs::cam::uin/{'{'}AccountID{'}'}:roleName/{'{'}RoleName2{'}'},qcs::cam::uin/{'{'}AccountID{'}'}:saml-provider/{'{'}ProviderName{'}'}
https://cloud.tencent.com/SAML/Attributes/RoleSessionName未指定casdoor

:::信息 使用以下内容替换占位符:

  • {'{'}AccountID{'}'}: 腾讯云账号ID —账号信息
  • {'{'}RoleName{'}'}: 角色名称 —角色
  • {'{'}ProviderName{'}'}: SAML 身份提供商名称 —身份提供商

请参阅腾讯云 SAML IdP 文档。 :::

通过SAML登录

流程:用户 → 腾讯云(未认证)→ 重定向至Casdoor → 登录 → 腾讯云(已认证)。 初始重定向 URL 可根据 SAML 元数据和 IdP SSO URL 构建。 获取元数据、构建身份验证 URL 并打印的示例(Go):

func main() {
res, err := http.Get("your casdoor application saml metadata url")
if err != nil {
panic(err)
}

rawMetadata, err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err)
}

metadata := &types.EntityDescriptor{}
err = xml.Unmarshal(rawMetadata, metadata)
if err != nil {
panic(err)
}

certStore := dsig.MemoryX509CertificateStore{
Roots: []*x509.Certificate{},
}

for _, kd := range metadata.IDPSSODescriptor.KeyDescriptors {
for idx, xcert := range kd.KeyInfo.X509Data.X509Certificates {
if xcert.Data == "" {
panic(fmt.Errorf("metadata certificate(%d) must not be empty", idx))
}
certData, err := base64.StdEncoding.DecodeString(xcert.Data)
if err != nil {
panic(err)
}

idpCert, err := x509.ParseCertificate(certData)
if err != nil {
panic(err)
}

certStore.Roots = append(certStore.Roots, idpCert)
}
}

randomKeyStore := dsig.RandomKeyStoreForTest()

sp := &saml2.SAMLServiceProvider{
IdentityProviderSSOURL: metadata.IDPSSODescriptor.SingleSignOnServices[0].Location,
IdentityProviderIssuer: metadata.EntityID,
ServiceProviderIssuer: "https://cloud.tencent.com",
AssertionConsumerServiceURL: "https://cloud.tencent.com/login/saml",
SignAuthnRequests: true,
AudienceURI: "https://cloud.tencent.com",
IDPCertificateStore: &certStore,
SPKeyStore: randomKeyStore,
}

println("Visit this URL To Authenticate:")
authURL, err := sp.BuildAuthURL("")
if err != nil {
panic(err)
}

println(authURL)
}

运行代码后,打开打印的 URL 以测试登录。

最终结果