Authentication på tværs af WCF services
HalløjJeg har en række WCF services der hostes i Windows Services på tværs af flere maskiner under samme AD domæne.
Jeg benytter følgende hjælpemetode til at lave mine channels:
public static T CreateChannel<T>(Binding binding, string endpointAddress)
{
// Create an endpoint for the specified binding & address
ServiceEndpoint endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(T)), binding, new EndpointAddress(endpointAddress));
// Create a channel factory of type T
ChannelFactory<T> factory = new ChannelFactory<T>(endpoint);
// Return the created channel
return factory.CreateChannel();
}
Dette fungerer fint, brugeren bliver ligeledes authenticated og authorized på service enden via:
try
{
PrincipalPermissionHelper.DemandAnyRole("Role1");
}
catch
{
throw new SecurityException("ACCESS DENIED for user " + Thread.CurrentPrincipal.Identity.Name + " at ServiceA.");
}
Dette fungerer også fint. BrugerA kalder ServiceA og overfor ServiceA bliver BrugerA tilladt adgang baseret på ovenstående. Selve ServiceA kører under en speciel service konto med mindst mulige privilegier. BrugerA identiteten bruges således udelukkende til at authorize brugen af ServiceA. ServiceA kalder senere hen ServiceB (og ServiceB kalder ServiceC). Både ServiceB og ServiceC kører under deres egne lavt privilegerede konti. Når ServiceA kalder ServiceB bliver ovenstående kodestumper benyttet til at oprette kanalen og godkende brugeren. Problemet er at det er ServiceA's servicekonto der bliver den kaldende identitet overfor ServiceB - her ville jeg gerne have den oprindelige brugers identitet da det er den som skal have godkendelse. BrugerA's identitet skal stadig ikke impersonates eller bruges til andet end at identificere hvert kald i stakken på tværs af services.
Hvordan opnår jeg dette? Jeg har forsøgt diverse forsøg med at impersonate BrugerA under selve kaldet videre til ServiceB osv, men det har jeg ikke fået til at fungere.