Keycloak 处理 SAML 登录时,用以下几个来源尝试提取用户名:
Subject > NameID
(SAML 默认用户名来源)uid
、username
、email
等) —— 如果配置了 Attribute Statement Mapper_
占位(就是你看到的情况)使用浏览器开发者工具(F12)或工具如 SAML-tracer 插件查看 SAML Response 内容,确认有没有类似以下字段:
<saml:Subject>
<saml:NameID Format="...">your-usernamesaml:NameID>
saml:Subject>
NameID
是空的或格式不对,Keycloak 就取不到用户名。在 Keycloak Admin Console:
NameID Policy Format
设置是否与你的 IdP 兼容(如 Persistent
、Email
、Unspecified
等)Principal Type
是否为 Subject NameID
或 Attribute
Attribute
,还要设定 Principal Attribute
(例如设为 uid
或 email
,要和 IdP 发送的一致)在 Keycloak 的 SAML IdP 配置中:
新建一个 AttributeStatement Mapper
Attribute to User Property
username
(或你的 IdP 中实际用的名字,比如 uid
、email
)username
确保你的 IdP 在 Assertion 中有发送该属性,例如:
<saml:AttributeStatement>
<saml:Attribute Name="username">
<saml:AttributeValue>john.doesaml:AttributeValue>
saml:Attribute>
saml:AttributeStatement>
项 | 检查点 | 建议 |
---|---|---|
1 | SAML Response 是否含有
|
若无,则配置 IdP 添加 |
2 | Principal Type 是否为 Subject NameID |
若用 Attribute,需改为 Attribute 并设定 Principal Attribute |
3 | 是否配置了正确的 Attribute Mapper | 检查 mapper 是否和 Assertion 字段对应 |
4 | Mapper 中的 User Property 是否为 username |
否则不会设置 Keycloak 用户名字段 |