我正在尝试处理 Salesforce 中的用户配置。我们决定应该结合使用 Salesforce JIT(即时)和 Azure 预配。为了正确配置用户,我需要向 Azure 发送身份验证请求,然后 Azure 返回包含有关该用户的各种信息的有效负载。现在它正在返回角色,但只返回 1 个角色。
一个用户可以属于多个组,每个组在应用程序中具有不同的角色。我想知道,有没有办法让 Azure 在用户经过身份验证后返回用户在该应用程序中拥有的所有角色?
我尝试查找文档,但我正在努力寻找可以为我指明正确方向的东西。如果您有可以提供帮助的文档,请发送给我们。
我解决了这个问题。长话短说,这就是 Salesforce 在 JIT Handler 类的
handleJit
方法中处理断言字符串的方式。您需要创建一个方法来解码断言并允许多值字段:
private static Map<String, List<String>> parseSAMLResponse(String encodedSamlResponse) {
String decodedResponse = EncodingUtil.base64Decode(encodedSamlResponse).toString();
Dom.Document doc = new Dom.Document();
doc.load(decodedResponse);
Map<String, List<String>> attributes = new Map<String, List<String>>();
Dom.XMLNode assertionNode = doc.getRootElement().getChildElement('Assertion', 'urn:oasis:names:tc:SAML:2.0:assertion');
if (assertionNode != null) {
Dom.XMLNode attributeStatementNode = assertionNode.getChildElement('AttributeStatement', 'urn:oasis:names:tc:SAML:2.0:assertion');
if (attributeStatementNode != null) {
List<Dom.XMLNode> attributeNodes = attributeStatementNode.getChildElements();
for (Dom.XMLNode attributeNode : attributeNodes) {
String attributeName = attributeNode.getAttribute('Name', null);
List<Dom.XMLNode> valueNodes = attributeNode.getChildElements();
List<String> values = new List<String>();
for (Dom.XMLNode valueNode : valueNodes) {
if (valueNode.getName() == 'AttributeValue') {
values.add(valueNode.getText());
}
}
if (!values.isEmpty()) {
attributes.put(attributeName, values);
}
}
}
}
return attributes;
}
然后确保调用此方法并调整其他方法以获取地图