BlogServiceHost.Create()

About Windows Communication Foundation & Co. - Il blog di Fabio Cozzolino

[WCF] Custom ServiceCredentials e SecureConversation

Un problema mi stava ultimamente attanagliando. Sempre più crescente. Ne rimandavo la risoluzione perchè apparentemente inspiegabile. Dopo aver implementato un CustomServiceCredentials (che magari sarà oggetto di un post dedicato) ed abilitato l'uso di WS-SecureConversation, il servizio aveva inspiegabilmente di funzionare, restituendo l'errore:

There was no channel that could accept the message with action 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT'.

Provando a ripristinare il ServiceCredentials di default tutto tornava a funzionare regolarmente. Eppure il mio CustomServiceCredentials non fa nulla di male se non creare un CustomServiceCredentialsSecurityTokenManager che a sua volta istanzia CustomTokenAuthenticator. Il problema era invece di semplice e rapida risoluzione. Ovviamente nell'override di ogni metodo ed in particolare CreateSecurityTokenAuthenticator del CustomServiceCredentialsSecurityTokenManager io richiamavo ogni volta l'implementazione del metodo base. Mia intenzione, però, era la semplice gestione di alcuni token particolari (es.: username). Ma il meccanismo di WS-SecureConversation e di tutte quelle modalità che prevedono una negoziazione (Spnego, Tlsnego, etc) prevedono l'implementazione di una particolare interfaccia, IIssuanceSecurityTokenAuthenticator, e la gestione diretta delle richieste con l'implementazione di un particolare CommunicationObject, oltre ad una serie di altri accorgimenti inutili da elencare.

Ovviamente non andavo a fare tutte queste cose nel mio "povero" CustomTokenAuthenticator e WCF reagiva male perchè non era in grado di trovare un opportuno endpoint "incarnato" nel relativo CommunicationObject per gestire la action.

E' invece giusto che l'implementazione rimanga in carico al framework perciò nel mio CustomServiceCredentialsSecurityTokenManager ho riportato la seguente modifica:

 

public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
SecurityTokenAuthenticator innerAuthenticator
= base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
if (innerAuthenticator is IIssuanceSecurityTokenAuthenticator)
return innerAuthenticator;
else
return new CustomTokenAuthenticator(innerAuthenticator);
}

Utilizzando il SecurityTokenAuthenticator  restituito dal metodo base CreateSecurityTokenAuthenticator per SecureConversation e il mio CustomTokenAutenticator, a sua volta estensione di SecurityTokenAuthenticator, per le altre implementazioni.

ciauz

Technorati Tags:
Posted: Dec 20 2007, 02:55 PM by Fabio.Cozzolino | with no comments
Filed under: