Domanda

Ho un'applicazione web asp.net in cui utilizzo diversi servizi we per soddisfare diverse richieste Ajax.Il problema è come determinare se la chiamata corrispondente arriva dalla pagina che ho servito.Utilizzo l'autenticazione basata su moduli nelle mie pagine.Esiste un modo in cui posso autorizzare l'utente che chiama il weservice tramite la stessa autenticazione basata su moduli.

È stato utile?

Soluzione

Ottima domanda, senza dubbio!

Questo mi ricorda un vecchia domanda a cui ho già risposto.Il tuo scenario è diverso, ma il problema di fondo rimane lo stesso:se chiami un servizio web da un modulo web, come fare condividere dati di autenticazione con il modulo?

Non esiste una soluzione semplice e completa a questo.Puoi pensare di implementare WS-Security nel servizio Web e avere il file Modulo Web autenticarsi rispetto al Servizio Web dopo aver verificato che l'utente sia autorizzato.

Il servizio Web non condividerà le informazioni sull'accesso dell'utente a meno che non vengano passate esplicitamente come metodo di parametro (ad es. void PerformAction(string userId, ...)), ma ricordate che in questo caso la prospettiva cambia radicalmente.

Questa è l'idea migliore che mi viene in mente, tuttavia, tieni presente che o riprogetta profondamente il tuo servizio web o non sei in grado di consentire ai client generati dagli utenti (ad es.applicazioni desktop compilate rispetto al tuo WSDL) per utilizzare il tuo servizio.

[Aggiungi] ora che hai spiegato il tuo scenario in modo un po' più dettagliato, ecco che arriva la parte entusiasmante dell'ingegneria del software :)

Come ho detto nel mio commento, hai più opzioni, ad esempio:

  1. Memorizzare nome utente/password nel markup della pagina (nelle variabili Javascript) e fare in modo che JQuery li invii come parametro per il servizio web.WS autenticherà quindi la richiesta in base a tali dati.Sconsigliato perché se qualcuno può accedere alla cache dell'utente la password viene sfruttata (ci sono mezzi più semplici per rubare la password di qualcuno su un computer condiviso/pubblico, non ne parlerò), e anche perché se prevedi di passare dal semplice HTTP a HTTPS a autenticazione sicura quindi tu dovere proteggere anche il servizio web
  2. Fare in modo che l'applicazione Web generi un'autenticazione gettone questo è valido per il servizio web.L'idea suona così:innanzitutto, avere un oggetto condiviso tra webapp e servizio web (come un oggetto all'interno Application collection) oppure, se webapp e web service si trovano su server diversi, utilizzare un DBMS;quindi, per l'autenticazione riuscita di ciascuna webapp, generare un token univoco (l'ID di sessione può andare bene) e memorizzarlo in una variabile JS che verrà passata al servizio web;infine, quando viene invocato il servizio web, verifica rispetto all'oggetto condiviso che il token sia valido (es.l'utente è autenticato e ancora connesso, con l'autorizzazione per accedere a quel servizio web, quindi sia l'autenticazione che autorizzazione), altrimenti rifiutare

Se altri ragazzi hanno idee, non esitate ad aiutare ;)

Altri suggerimenti

Dal momento che si sta facendo l'autenticazione Forum si può fare qualcosa di simile nel tuo WebMethod

If Not HttpContext.Current.User.Identity.IsAuthenticated Then
    Return Nothing
End If

E 'potrebbe essere migliore per generare un'eccezione se si sta facendo un GET, però, in questo modo il risultato vuoto non viene memorizzato nella cache sul lato client.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top