24.08.2012 00:05:00
In einführenden WIF-Beispielen wird das Anfordern der Sicherheits-Tokens bewerkstelligt, indem das Binding, welches zum Zugriff auf den Service verwendet wird, mit entsprechenden Informationen über den STS versehen wurde. Dies hat den Vorteil, dass man im Programmcode möglichst wenig von der damit einhergehenden Komplexität bemerkt. Der Service-Proxy fordert einfach anhand der hinterlegten Informationen einen Token an und verwendet dieses beim Zugriff auf den Service. Allerdings wird nicht für jeden neuen Proxy ein neues Token benötigt, denn mitunter kann ein bereits bestehendes Token weiterverwendet werden. Dies würde sich auch positiv auf die Leistung des Systems auswirken, da dadurch unnötige Anfragen beim STS verhindert werden. Für solche Szenarien sind ein paar Zeilen Code von Nöten. Das nachfolgende Listing beinhaltet zur Demonstration die Methode RequestToken. Sie erstellt ein Binding für die Kommunikation mit dem STS. Dazu wird an den Konstruktor der Name der Binding-Konfiguration, welche Visual Studio beim Referenzieren des STS hinzugefügt hat, übergeben. Dieser Name gleicht im betrachteten Beispiel der URL des STS. RequestToken erzeugt auch eine Adresse, welche auf den STS zeigt und konfiguriert anschließend eine Instanz von WSTrustChannelFactory mit dieser Adresse und dem Binding. Die Eigenschaft TrustVersion wird auf die vom STS unterstützte Version von WS-Trust gesetzt. Anschließend erzeugt RequestToken über die ChannelFactory einen Proxy vom Typ WSTrustChannel. Ein RequestSecurityToken, welches die Anfrage für das gewünschte Token repräsentiert, wird erzeugt und parametrisiert. Die Eigenschaft AppliesTo repräsentiert den Geltungsbereich (Scope) für den das Token benötigt wird. Im betrachteten Fall handelt es sich dabei um den FlugService. An ActAs könnte ein bestehendes Token übergeben werden. Damit würde angezeigt werden, dass dieses Tokens im Rahmen eines Delegations-Szenarios gegen ein neues Token getauscht werden soll. Die Methode Issue fordert beim STS ein Token an. Dieses wird zurückgeliefert.
private static SecurityToken RequestToken()
{
WS2007HttpBinding binding;
EndpointAddress addr;
WSTrustChannelFactory trustChannelFactory = null;
WSTrustChannel channel = null;
RequestSecurityToken rst;
RequestSecurityTokenResponse rstr;
SecurityToken token;
binding = new WS2007HttpBinding("http://localhost:13127/wsTrustSTS/");
// ^^^-- config-name!!
addr = new EndpointAddress("http://localhost:13127/wsTrustSTS/");
// ^^^-- Adresse
trustChannelFactory = new WSTrustChannelFactory(binding, addr);
trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;
try
{
channel = (WSTrustChannel)trustChannelFactory.CreateChannel();
rst = new RequestSecurityToken(RequestTypes.Issue);
// ActAs wird in diesem Beispiel nicht benötigt
// rst.ActAs = new SecurityTokenElement(existingToken);
rst.AppliesTo = new
EndpointReference("http://localhost:1928/FlugService.svc");
rstr = null;
token = channel.Issue(rst, out rstr);
return token;
}
catch
{
if (channel != null) channel.Abort();
throw;
}
finally
{
if (channel != null) channel.Close();
if (trustChannelFactory != null) trustChannelFactory.Close();
}
}
Das auf diese Art angeforderte Token kann in weiterer Folge zum Konfigurieren eines Proxys herangezogen werden. Das nachfolgende Listing demonstriert dies, indem es mit einer ChannelFactory unter Verwendung von CreateChannelWithIssuedToken einen Laufzeitproxy erzeugt. An CreateChannelWithIssuedToken übergibt sie dabei das zu verwendenden Token.
var token = RequestToken();
using (var cf = new ChannelFactory<IFlugService>
("WS2007FederationHttpBinding_IService1"))
{
var proxy = cf.CreateChannelWithIssuedToken(token);
var data = proxy.GetFlightInfo(4711);
Console.WriteLine(data);
((IDisposable)proxy).Dispose();
}
|