Active Directory GUID zu String konvertieren

TheRepatriate

Lt. Junior Grade
Registriert
Nov. 2008
Beiträge
258
Hallo zusammen,

zurzeit versuche ich in meiner Java-Applikation das "objectGUID" Attribut von User-Objekten aus dem Active Directory auszulesen, um diese eindeutig zuordnen zu können. Die GUID ist im AD im Binär-Format abgelegt und besteht aus 16 Zeichen.
Hier wird ganz gut beschrieben, wie man die ObjectGUID von einem byte-Array in ein leserlichen String bringt, der beispielsweise so bei mir aussehen soll: "ac642e6e-6ab5-425a-bcc9-9f5067d46e3f". Problem dabei ist, dass ich nicht direkt ein byte-Array bekomme. Der Zugriff meiner App erfolgt nicht direkt auf das AD sondern über einen Access-Manager (OpenAM). Ich bekomme die GUID daher gekapselt in einem Json-Objekt zusammen mit anderen User-Attributen als String.

Ich habe bereits versucht den eingehenden String in ein byte-Array zu konvertieren:
PHP:
byte[] guid = bytes.getBytes(Charset.defaultCharset());
Wenn ich dieses byte-Array jedoch in die String-Repräsentation überführe (s.o.) sind nicht alle Zeichen der GUID richtig.
Im verlinkten Artikel wird ausdrücklich darauf hingewiesen, dass eine konvertierung in ein String und dann in bytes, zu falschen Ergebnissen führt:
IMPORTANT NOTE
For line 27, PLEASE DO NOTE CODE THE BELOW:
byte[] guid = sr.getAttributes().get(“objectGUID”).get().toString().getBytes();
Ich habe aber leider keine andere Möglichkeit, da ich nur ein String bekomme. Habt ihr eine Idee, wie ich vielleicht doch den eingehenden String nutzen, und in eine gültige GUID konvertieren kann?
Liegt es vielleicht an der Kodierung des Strings im JSON-Object?

Vielen Dank!
 
Wäre hilfreich zu sehen wie die Konvertierung die GUIDs versaut. Eine GUID besteht aus Hex Zahlen, das ist pures ASCII.
 
hey,

also genau kann ich dir nicht sagen wo die Konvertierung schief geht. Ich kann mal ein Beispiel geben:

Ich empfange den folgenden String im JSON-Object:
"objectGUID" -> ";%y#uD_J�\�"��c�"

Diesen konvertiere ich dann mit der Funktion (siehe unten) und erhalte:
"UserGuid" -> "2379253b-4475-4a5f-3f5c-3f223f3f633f"

erwartet hätte ich (richtig ist):
"UserGuid" -> "2379253b-4475-4a5f-ad5c-942284b863cc"

In diesem Fall ist die Übereinstimmung sogar teilweise recht hoch. Bei anderen Beispielen habe ich plötzlich nur noch ein byte-Array der Länge 15 was logischerweise zu OutOfBounds-Exceptions führt, oder aber kaum Übereinstimmung

Methode:
PHP:
private String convertGuidFromBinary(Object guidByteArray){
        String bytes = (String) guidByteArray;
        byte[] guid = bytes.getBytes(Charset.defaultCharset());

        StringBuilder displayStr = new StringBuilder();

        displayStr.append(prefixZeros((int) guid[3] & 0xFF));
        displayStr.append(prefixZeros((int) guid[2] & 0xFF));
        displayStr.append(prefixZeros((int) guid[1] & 0xFF));
        displayStr.append(prefixZeros((int) guid[0] & 0xFF));
        displayStr.append("-");
        displayStr.append(prefixZeros((int) guid[5] & 0xFF));
        displayStr.append(prefixZeros((int) guid[4] & 0xFF));
        displayStr.append("-");
        displayStr.append(prefixZeros((int) guid[7] & 0xFF));
        displayStr.append(prefixZeros((int) guid[6] & 0xFF));
        displayStr.append("-");
        displayStr.append(prefixZeros((int) guid[8] & 0xFF));
        displayStr.append(prefixZeros((int) guid[9] & 0xFF));
        displayStr.append("-");
        displayStr.append(prefixZeros((int) guid[10] & 0xFF));
        displayStr.append(prefixZeros((int) guid[11] & 0xFF));
        displayStr.append(prefixZeros((int) guid[12] & 0xFF));
        displayStr.append(prefixZeros((int) guid[13] & 0xFF));
        displayStr.append(prefixZeros((int) guid[14] & 0xFF));
        displayStr.append(prefixZeros((int) guid[15] & 0xFF));

        return displayStr.toString();
    }

    private String prefixZeros(int value) {
        if (value <= 0xF) {
            StringBuilder sb = new StringBuilder("0");
            sb.append(Integer.toHexString(value));

            return sb.toString();

        } else {
            return Integer.toHexString(value);
        }
    }

Edit:
Es liegt iwie an den "?" :) Denke das ist schwierig, da der ankommende String schon falsch ist und er sich so nicht wirklich weiterverarbeiten lässt. Am Access-Manager kann ich auch nichts machen. Falls sonst noch jemand ne Idee hat, immer her damit.
 
Zuletzt bearbeitet:
OpenAM ab Version 11.0.1 kann binäre Attribute in Base64 kodieren:
The default SAML 2.0 IDP attribute mapper implementation now provides a way to Base64 encode binary attributes (OPENAM-2767).

In order to have the default IDP attribute mapper Base64 encode binary attributes when adding them to the SAML attributes, use the ;binary postfix for the attribute name, as in the following example:

objectGUID=objectGUID;binary

This maps the local binary attribute objectGUID to a SAML attribute called objectGUID that is Base64 encoded.

The default IDP attribute mapper also supports NameFormat URI format as shown in the following example:

urn:oasis:names:tc:SAML:2.0:attrname-format:uri|objectGUID=objectGUID;binary
 
hey, das habe ich auch schon gesehen. Ich nutze aber kein SAML sondern den authorization- und tokeninfo-Endpoint von OpenAM. OpenAM ist in meinem Szenario ein Oauth2Provider mit einem konfigurierten OAuth2 Client. Ich gucke gleich nochmal ob ich da auch so ein Mapping konfigurieren kann. Ich habe versucht das Mapping direkt an den DataStores zu setzen, dass hat aber leider nicht geholfen.
Danke für deine Antwort!
 
Zurück
Oben