Introductie
Met de kennis van het VOOT-protocol in het achterhoofd heeft SURFnet een simpele webdienst geïmplementeerd om toegang te krijgen tot Microsoft Active Directory (AD) als Group Provider. SURFnet gebruikt hiervoor het LDAP-protocol. Voor de ontwikkeling van dit protocol is Microsoft Visual Studio 2010 gebruikt. Het project is gebaseerd op het 'WCF REST Services Project Template'.
Om verbinding te maken met de LDAP-server heb je de component LDAP library for C#.NET nodig. De AD-server wordt opgezet met de standaardconfiguratie, die de mappen 'Builtin' en 'Users' bevat.
Op dit moment ondersteunt deze tutorial alleen bepaalde delen van het VOOT-protocol.
Methoden
De onderstaande methoden worden op dit moment ondersteund:
- toon mijn eigen groepen - HTTP GET naar '/groups/@me'
toon alle deelnemers van een van mijn eigen groepen - HTTP GET naar '/people/@me/[groep-id]'
toon een bepaald persoon - HTTP GET naar '/people/[gebruiker-id]'
De code voor deze methoden is als volgt:
public class VootService { private readonly IVootReader reader; public VootService() { reader = new LdapVootReader(new ConfigurationHelper()); } [WebGet(UriTemplate = "groups/@me")] public string IsMemberOf() { return reader.IsMemberOf(currentUser); } [WebGet(UriTemplate = "people/{userId}")] public string GetMember(string userId) { return reader.GetMember(userId); } [WebGet(UriTemplate = "people/@me/{groupId}")] public string GetGroupMembers(string groupId) { return reader.GetGroupMembers(groupId); } }
Alle resultaten worden geretourneerd in JSON-formaat.
Toon mijn eigen groepen
De 'VootReader'-klasse bevat de methode 'isMemberOf(userId)'. Deze retourneert alle groepen waar de gebruiker lid van is. De LDAP-bron wordt doorzocht vanuit 'CN=Users, DN=demo, ..., DN=nl' met het filter 'samAccountName='[gebruiker-id]'.
Het attribuut 'memberOf' retourneert een 'array' met alle groepen waar de gebruiker lid van is. Dat kan er bijvoorbeeld zo uitzien:
{ "CN=TestGroup,CN=Users,DC=demo,DC=..,DC=..,DC=surfnet,DC=nl", "CN=DemoGroup,CN=Users,DC=demo,DC=..,DC=..,DC=surfnet,DC=nl", "CN=Administrators,CN=Builtin,DC=demo,DC=..,DC=..,DC=surfnet,DC=nl" }
Alle elementen uit de 'array' worden verwerkt door het verkrijgen van de enige 'LDAP-'entry' die gelijk is aan de eerste 'common name' (CN).
Toon alle leden van 1 van mijn groepen
De methode 'GetGroupMembers' retourneert alle leden van de opgegeven groep. De LDAP-zoektermen zijn gelijk aan de vorige methode, omdat in dit geval de groepen onderdeel zijn van de 'Users'-map. Maak gebruik van 'groupId' als deel van het filter.
Opnieuw wordt het resultaat geretourneerd als een 'array', maar ditmaal als waarde van het 'member'-attribuut.
Toon een bepaald persoon
De methode 'GetMember' retourneert de gegevens van de desbetreffende gebruiker. Het belangrijkste onderdeel van de methode is:
// Get the entry. LdapEntry entry = GetEntry(id, configHelper.PeopleDn); // Process the result. if (entry != null) { LdapAttribute attr = entry.getAttribute("displayName"); if (attr != null) { result = new Person { DisplayName = attr.StringValue, Id = id }; } }
Authenticatie
Voor het authenticeren van het eindpunt van de gebruiker gebruiken we '3-legged OAuth versie 1.0a'. Om Single Sign On mogelijk te maken tussen de Service Provider, SURFconext en het externegroepen-eindpunt, moet je de OAuth Provider (deze is verantwoordelijk voor het aanmaken en uitdelen van toegangs-'tokens' na een succesvolle authenticatie) koppelen met SURFconext.
Hiervoor zijn verschillende.NET-componenten beschikbaar. SURFconext maakt gebruik van het component DotNetOpenAuth. Een voorbeeld hiervan is een 'OpenAuthServiceProvider'. Dit voorbeeld hebben we als basis gebruikt voor de OAuth/implementatie. Het bevat een ASP.NET handler door de 3-legged OAuth handshake. Vervolgens wordt er een VOOT-webservice aan toegevoegd. Met een aparte webapplicatie kun je de functionaliteit van de implementatie testen.
Todo
- Voeg extra VOOT-parameters toe: count, filterBy, filterOp, filterValue, sortOrder, startIndex.
- Voeg de code toe aan de GitHub directory