Domanda

Va bene, quindi abbiamo un servizio web ASMX eredità che è attualmente in esecuzione in .NET 3.5 e stiamo utilizzando Visual Studio 2008.

Il problema è che abbiamo bisogno di aggiungere l'autenticazione e vorremmo approfittare del modello WS-Security senza rompere qualsiasi client interne esistenti che non hanno bisogno di autenticarsi al momento.

Abbiamo pensato di aggiungere intestazioni personalizzate, ma non è molto WS-Security-ish. l'aggiornamento anche per WCF, mentre un obiettivo a lungo termine, non è praticabile nel breve termine.

C'è un modo per accedere al UsernameToken (a condizione che è passato dal cliente) indirettamente nell'intestazione di sapone di un servizio web ASMX VS2008?

È stato utile?

Soluzione

Si potrebbe provare a Web Services Enhancements (WSE) 3.0 . Questo aggiunge il supporto per un vecchia versione di WS-Security (versione 2004 credo - WCF supporta le versioni 2005 e 2007). Si trova sulla cima di ASMX senza disturbarla, e che ancora lavorano in .NET 3.5 / WS2008.

Ora, per i lati negativi:

  • VS2008 non supporta l'aggiunta o l'aggiornamento di riferimenti web WSE-enabled nel codice client. Esso sarà lieto di creare la normale classe di ASMX proxy, ma non la classe proxy WSE in più che è necessario per l'autenticazione. Qualsiasi codice WSE delega esistente si dispone di non compilare OK, ma verrà cancellato se si tenta di aggiornare il riferimento Web nell'IDE. Se si possiede una copia di VS2005, si potrebbe utilizzare per mantenere o almeno creare il riferimento web sul lato client.
  • Per quanto ne so, l'attuazione WSE di WS-Security non è forward-compatibile al 100% con le implementazioni WCF. Sarà necessario fare qualche test di compatibilità del proprio con WCF per essere sicuri.

Esempio

Come specificare le credenziali sul client:

void SetUsernameCredential(WebServicesClientProtocol service, string userName, string password) {
    UsernameToken token = new UsernameToken(userName, password, PasswordOption.SendHashed);
    service.SetClientCredential(token);
}

L'autenticazione delle credenziali sul server:

public class MyUsernameTokenManager : UsernameTokenManager {
    protected override string AuthenticateToken(UsernameToken token) {
        // Authenticate here.
        // If succeess, return an authenticated IPrincipal and the user's password as shown.
        // If failure, throw an exception of your choosing.
        token.Principal = principal;
        return password;
    }
}

credenziali di lettura sul server:

IPrincipal principal = RequestSoapContext.Current.IdentityToken.Principal;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top