7

Ho un controllo che ho scritto che ha un componente javascript e un componente del servizio web. Il problema che sto avendo è che il javascript è impostato a che fare:Come posso interrompere l'autenticazione/sessione dei moduli ASP dal rinnovo nella chiamata al servizio web ajax setInterval?

setInterval(this._checkAlertsHandler, this._messageCheckInterval * 1000); 

Ciò richiede una funzione che effettua una chiamata webservice in questo modo:

Alert.SiteAlertService.GetAlerts(this._receivedAlertsHandler, this._errorReceivedAlertsHandler); 

Quindi questo sta usando il servizio di web javascript di proxy metodi per accedere al servizio web. Il problema è che la nostra applicazione ha l'autenticazione delle forme e un valore di timeout, quindi se l'utente è inattivo troppo a lungo, le registrerà.

La mia chiamata al servizio web invia apparentemente il cookie che include la sessione e la chiave di autenticazione dei moduli per il servizio Web. Il webservice asp.net rinnova automaticamente la sessione E l'autenticazione dei moduli. Ogni volta che il javascript raggiunge il servizio web, in pratica mantiene vivo l'utente. Non voglio questo comportamento, questo dovrebbe solo aggirarlo, in modo che anche se questo js sta colpendo il servizio web per verificare la presenza di nuovi messaggi, se l'utente non ha fatto un postback sulla nostra applicazione (ed è effettivamente inattivo) li registro ancora. (

Quello che mi piacerebbe accadesse è che questa chiamata di intervallo al servizio web non rinnova alcuna autenticazione (il rinnovo della sessione posso aggirare usando una variabile a livello di applicazione con chiave/valore del dizionario per la sessione di utenti id, in modo da non devo utilizzare tutte le variabili livello di sessione).

Come faccio a fare questo/cambiare il mio servizio web/o di controllo per funzionare come il modo in cui lo voglio?

risposta

0

si poteva escludere il tuo webservice dall'autenticazione dei moduli:

<location path="yourwebservice.asmx"> 
    <system.web> 
     <authorization> 
      <allow users="?"/> 
     <authorization> 
    </system.web> 
</location> 

Ma probabilmente bisogno delle informazioni relative all'utente, quindi è possibile configurare il webservice per utilizzare l'autenticazione forme, ma disattivare SlidingExpiration:

<location path="yourwebservice.asmx"> 
    <system.web> 
     <authentication mode="Forms"> 
      <forms slidingExpiration="false"></forms> 
     </authentication> 
    </system.web> 
</location> 

Assicurarsi di verificare che cosa succede se il cookie forme è scaduto. Forse dovrai ridefinire anche loginurl.

+1

Ho provato questo, aggiunto nel mio web.config nella base della mia applicazione. Sembra che quando il mio javascript colpisce il webservice, è ancora rinnovandola ... - Ho il timeout impostato a 1 minuto sul sito, e una volta che si arriva al filo, normalmente, senza questa l'esecuzione di JavaScript verrà aggiornata e rimettiti alla pagina di accesso. Ma con l'esecuzione del javascript e colpire il servizio web, rinfresca, e conserva ancora si loggato. Il servizio web che colpisce inoltre usa EnableSession = true sulle WebMethods e ha anche IRequireSessionSate sulla classe object.Could la sessione di essere il colpevole qui? – lslow00

+0

Ho appena provato ad agganciarlo a un servizio web che era piuttosto semplice, non ha riferimenti alle sessioni, ecc. Solo una semplice funzione che restituisce il mondo Ciao. Lo slidingExpiration non sembra essere disattivato quando colpisce il servizio, perché non disconnetterà mai l'utente. – lslow00

+0

Io ho usato realmente una risposta a questo, come è del tutto distruggendo le nostre applicazioni meccanismo di logout di inattività – lslow00

0

È possibile inserire il proprio file asmx Webservice nel proprio progetto separato project/solution/application?

In questo modo è necessario utilizzare un ID di sessione diverso per l'applicazione principale.

5

Sto lavorando su diversi approcci a questo pure. Un modo che sto facendo è aggiungendo questo al servizio endpoint Ajax:

// Hide the cookie so this call doesn't extend the user's ticket 
HttpContext ctx = HttpContext.Current; 
ctx.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 

questo modo si può negare un rinnovamento biglietteria Auth, Sine il cookie aggiornato non potrà mai riuscire a tornare al client.

Se si dispone di più endpoint Ajax che si desidera escludere, è possibile implementare un modulo per identificare tali endpoint e includere il codice per rimuovere il cookie dalla risposta.

+0

Incredibilmente semplice! – Gaz

+0

Ho avuto esattamente lo stesso problema e questo l'ha risolto. Dovrebbe essere la risposta accettata. – Stuart

1

@RyanW ha fornito la risposta che cercavo, ecco la mia implementazione per MVC utilizzando un attributo solo per mantenere le cose ASCIUTTE.

using System.Web.Mvc; 
using System.Web.Security; 

namespace Your.Web.Attributes 
{ 
    public class RemoveAuthCookieAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      filterContext.HttpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      base.OnActionExecuted(filterContext); 
     } 
    } 
} 

Implementazione:

[RemoveAuthCookie] 
public ActionResult PollMe() 
{ 
    return View(); 
} 
Problemi correlati