我们公司使用Oracle权限系统SAML单点登录。我用Spring SecuritySAML库实现了Spring Security,它工作得很好,直到我最近发现了一个问题。Oracle Access System使用OBSSOCookie作为标识符,但是当saml响应返回时,我无法检索这个cookie。看看这段代码:
@RequestMapping(value = "/callback")
public void callback(HttpServletRequest request, HttpServletResponse response)
throws IOException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
SAMLCredential credential = (SAMLCredential) authentication.getCredentials();
try {
XMLHelper.nodeToString(SAMLUtil.marshallMessage(credential.getAuthenticationAssertion()));
} catch (MessageEncodingException e) {
e.printStackTrace();
}
String nameID = credential.getNameID().getValue();
List<Attribute> attributes = credential.getAttributes();
JSONObject jso = new JSONObject();
String uid;
String employeeType="";
String company_name="";
String FirstName;
String roles_entitled="";
String LastName;
String primary_role="";
jso.put("nameID", nameID);
jso.put("uid", uid);
jso.put("company_name", company_name);
jso.put("roles_entitled", roles_entitled);
jso.put("primary_role", primary_role);
jso.put("employeeType", employeeType);
jso.put("FirstName", FirstName);
jso.put("LastName", LastName);
String frontend_url = sideCarService.getFrontendNodeUrl();
String token = KeyGenerator.createUserToken(jso, 3600 * 24 * 30);
String encoded = new String(Base64.encodeBase64(jso.toString().getBytes()));
response.sendRedirect(frontend_url + "#t/" + token + "/atts/" + encoded);
}
查看这段代码,我可以从saml响应中检索所有信息,然后生成一个令牌,返回给前端cookie以供使用。
但是我真的很想得到OBSSOCookie,这样我就可以和其他微服务一起使用,从使用相同saml登录解决方案的其他应用程序中检索数据。
我尝试使用request. getHeaders(),但响应为空。根本没有OBSSOCookie。
任何想法如何获得OBSSOCookie从Springsaml库?
谢啦
假设在验证从IDP发送的SAML响应期间,SpringSAML可以使用cookie,您可以使用以下方法。
扩展类WebSSOProfile消费者Impl
并实现方法process AdditionalData
,该方法应返回OBSSOCookie
的值。您可以通过作为参数提供的SAMLMessageContext
访问HTTP请求及其HTTP标头/cookie。
然后,您返回的值将在SAMLCredential
中的addtionalData
字段下可用-该字段针对这些类型的用例进行缩进。