从 Go 中的 SAML 响应中获取用户名

Obtaining the user's name from a SAML response in Go

我正在尝试构建一个基于 Go 的网络服务器(运行 在 Azure 中),它允许使用 SAML 进行单点登录。应用程序的部分标准是有两层访问权限:首先应该确定用户是否有权访问网页本身,其次用户应该只能访问他有权查看的数据。

我查看了 godoc 列出的库,但我似乎找不到实现第二个标准的方法。我们想使用与 SAML 响应关联的 username/ID 作为数据库查询的一部分。我似乎无法找到我在哪里可以找到这些信息。目前看来我应该做类似

的事情
http.Handle("/apicall", samlSP.RequireAccount(http.HandlerFunc(foo)))

func foo(w http.ResponseWriter, r *http.Request) {
    user := // ?
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        log.Println(err)
    }
    var filter FilterParameters
    err = json.Unmarshal(body, &filter)
    if err != nil {
        log.Println(err)
    }
    apiStruct := API(filter, user)
    json.NewEncoder(w).Encode(apiStruct)
}

但是,我不确定如何让变量 'user' 填充到正确的范围内,以及我可以从哪里获得这些信息。我一直在寻找使用 github.com/crewjam/saml,但我可以灵活地切换到不同的解决方案。 godoc 在 'options' 结构中提到了一个指向 'saml.EntityDescriptor' 结构的指针,它似乎包含一个用户名字段,但我不确定这是否可行,以及如何在我的职能范围 "foo".

SAML 中的 "username" 可以来自任何形式的 IdP。它包含在您事先知道的属性中,或者您要求 IdP 维护者为您发布。看看 SAML Response here

响应中有一个 AttributeStatement 包含多个 Attribute 断言。 Attribute 断言之一是 uid,它被解释为 "username"。在这种情况下 "username" 是 "test".

EntityDescriptor 是 SAML2 元数据规范的一部分,不用于保存属性。它用于描述 SP 和 IdP 等实体,以便它们可以相互信任。

要决定用户应该访问应用程序的哪些部分,您可以使用 eduPersonEntitlement Attribute。这通常包含 URI 或 URN,例如 https://your.app.com/entitlment/admin