34 messaggi dal 26 febbraio 2001
Ciao a tutti,

stò sviluppando un'applicazione asp.net MVC con framework 4.5.2,
utilizzo delle variabili di sessione per memorizzare alcuni dati,
sul mio PC in locale non ho problemi, la variabile viene scritta e letta senza nessun problema
ma quando pubblico su un hosting di register.it appena l'applicazione tenta di accedere alla sessione
mi si presenta una finestra di login, tipica di IIS, che mi chiede utente e password ,
cosa devo impostare in web.config o in IIS perchè non mi esca questa richiesta ?
10.245 messaggi dal 09 febbraio 2002
Contributi
Ciao,
cerchiamo di capire bene cosa si sta verificando. In questo momento penso che la lettura/scrittura sulla variabile di sessione non sia la causa del problema. Quindi prova a commentare il codice che legge/scrive la variabile e dovresti continuare a vedere la stessa finestra.


mi si presenta una finestra di login, tipica di IIS,

Uhm, non è propriamente una finestra di IIS. Presumo che tu intenda la finestra che il browser visualizza quando la pagina richiede la Basic Authentication. Qui trovi un esempio, questa pagina dimostrativa la richiede.
https://httpbin.org/basic-auth/user/passwd

Quindi ti chiedo: hai configurato la basic authentication (o altro meccanismo challenge/response) per la tua applicazione web?
Verifica se nel tuo web.config c'è il codice che trovi al paragrafo "Configuration sample"
https://www.iis.net/configreference/system.webserver/security/authentication/basicauthentication

ciao,
Moreno

Enjoy learning and just keep making
34 messaggi dal 26 febbraio 2001
Ciao,
allora tento di farti capire, la causa è proprio la richiesta di lettura di una variabile di sessione
che ho implementato in questo modo

public string getIDCentro()
{return Session.GetDataFromSession<string>("IDcentro") ?? string.Empty;}

dove GetDataFromSession è un'estensione della classe HttpSessionStateBase

public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) { return (T)session[key];

la finestra è quella che dici tu ma con in più la scritta "La tua connessione a questo sito non è privata"

se modifico il metodo in questo modo
public string getIDCentro()
{return "00005"}

non ho problemi


nel config ho:

<sessionState mode="InProc" timeout="60" useHostingIdentity="false"></sessionState>

<security>
<authentication>
<basicAuthentication enabled="true" />
</authentication>
</security>

<authentication mode="Forms">
<forms loginUrl="~/Utenti/Login" timeout="30" slidingExpiration="true" />
</authentication>

Ora se disabilito basicAuthentication , non mi si presenta più la richiesta di autenticazione ma la chiamata ajax al controller che scrive la variabile di sessione non va a buon fine (HTTP 401 Unauthorized)

$.ajax({
type:"PUT",
url: '@Url.Action("setCentro", "Base")',
data: {IDcentro:sender.value}
}).done(function () { refreshGrid() });


La cosa strana è che ho provato ad attivare un'hosting di prova su myasp.net e lì funziona tutto perfettamente, mentre su Register.it NO
Modificato da cainellin il 17 marzo 2017 19.20 -
Modificato da cainellin il 17 marzo 2017 19.23 -
10.245 messaggi dal 09 febbraio 2002
Contributi
Ciao,


se modifico il metodo in questo modo
public string getIDCentro()
{return "00005"}

non ho problemi

Lasciamo perdere questa cosa per il momento. Per me è semplicemente troppo strano che leggere una variabile di sessione scateni la basic authentication.

La basic authentication è una funzionalità trasversale che, in questo caso, è offerta da IIS che non ne sa nulla del fato che tu stia restituendo una stringa o il conteuto di una variabile di Sessione. Per il momento penso che tu sia stato tratto in inganno da uno dei test che hai fatto.


La cosa strana è che ho provato ad attivare un'hosting di prova su myasp.net e lì funziona tutto perfettamente, mentre su Register.it NO

Beh, questo si può spiegare facilmente se il webserver IIS è stato configurato in maniera differente dai due hosting provider.
La basic authentication non è una funzionalità predefinita in IIS, ma va abilitata o disabilitata dalla console.
Come leggi nella documentazione:
https://www.iis.net/configreference/system.webserver/security/authentication/basicauthentication

The default installation of IIS 7 and later does not include the Basic authentication role service. To use Basic authentication on Internet Information Services (IIS), you must install the role service.


Quindi io presumo che su myasp.net l'abbiano installato e su Register no. Come conseguenza, il tuo nodo security/authentication/basicAuthentication che hai nel web.config ha effetto solo su myasp.net. Se anche Register avesse installato il modulo di Basic Authentication osserveresti lo stesso identico comportamento.


Ora se disabilito basicAuthentication

Ok, questa è la strada giusta. Disabilita la basic authentication eliminando del tutto il nodo <security>.


la chiamata ajax al controller che scrive la variabile di sessione non va a buon fine (HTTP 401 Unauthorized)

E' normale che sia così, significa che non ti sei autenticato. Ora che hai disabilitato la basic authentication è in essere un'altro tipo di autenticazione: la Forms Authentication che hai configrato così dal tuo web.config.
<authentication mode="Forms">
<forms loginUrl="~/Utenti/Login" timeout="30" slidingExpiration="true" />
</authentication>


Configurata così, la Forms Authentication non ti lascerà accedere a nessuna pagina del sito a meno che tu non ti sia loggato dalla pagina /Utenti/Login. Hai implementato questa pagina? Come verifichi che le credenziali siano corrette? Usi un modo personalizzato oppure sfrutti ASP.NET Identity, Membership API o altro?

Quando ti sei autenticato correttamente, ASP.NET emetterà un cookie di autenticazione che il browser restituirà al server in tutte le sue successive richieste. Grazie a questo cookie, l'utente risulterà autenticato e la tua richiesta ajax andrà a buon fine.

ciao,
Moreno
Modificato da BrightSoul il 19 marzo 2017 09.51 -

Enjoy learning and just keep making
34 messaggi dal 26 febbraio 2001
Ciao Moreno e grazie per l'aiuto che mi stai dando.

Purtroppo non riesco ancora a risolvere il problema, vediamo se con altre indicazioni
puoi capirci qualcosa.


La basic authentication non è una funzionalità predefinita in IIS, ma va abilitata o disabilitata dalla console.


Register da la possibilità di configurare alcuni parametri di IIS tramite IIS Remote Manager e ho provato
a modificare sia il tipo di autenticazione sia il tipo di stato sessione, ma niente.


Configurata così, la Forms Authentication non ti lascerà accedere a nessuna pagina del sito a meno che tu non ti sia loggato dalla pagina /Utenti/Login. Hai implementato questa pagina? Come verifichi che le credenziali siano corrette? Usi un modo personalizzato oppure sfrutti ASP.NET Identity, Membership API o altro?

Quando ti sei autenticato correttamente, ASP.NET emetterà un cookie di autenticazione che il browser restituirà al server in tutte le sue successive richieste. Grazie a questo cookie, l'utente risulterà autenticato e la tua richiesta ajax andrà a buon fine.


Si la pagina di Login è implementata e il controller è configurato per l'acceso anonimo,
Le credenziali vengono verificate tramite un metodo personalizzato e se la verifica è positiva
creo il cookie di autenticazione.

[AllowAnonymous]
        [HttpPost]
        public ActionResult Login(UtenteLoginModel utente, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (IsValid(utente.username, utente.password))
                {
                    FormsAuthentication.SetAuthCookie(utente.username, false);
                    return RedirectToLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError("", "Dati non corretti.");
                }
            }

            return View(utente);
        }



Poi ho aggiunto globalmente l'attributo [Authorize] nel filter config del Global.asax.cs

 public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new AuthorizeAttribute());
            }
        }



In questo modo se tento di accedere ad una pagina interna, prima di aver effettuato il login, mi presenta correttamente la MIA pagina di login e una volta inserito utente e password ho libero accesso a tutte le altre pagine.
Con basicAuthentication diabilitato la chiamata ajax mi da sempre l'errore 401.

Ti dirò di più Moreno, anche myASP.net ha la possibilità di gestire alcuni parametri di IIS da remoto,
ho verificato le impostazioni dei due IIS e sono praticamente identiche !

Perchè non funziona ??!!!! :-(
Modificato da cainellin il 20 marzo 2017 16.30 -
34 messaggi dal 26 febbraio 2001
RISOLTO !!!

Allora i problemi erano 2,

1 quello che hai correttamente indicato tu, e cioè che la basicAuthentication deve essere disabilitata
altrimenti si presenta la pagina di login , ma non era per l'accesso alla sessione ma bensì per la chiamata ajax.

2 che avevo impostato il verbo della chiamata ajax su PUT e anche sul controller avevo impostato [HttpPUT] ma
probabilmente il server di register NON accetta chiamate in PUT mentre quello di myASP.net SI !
Ora ho modificato con POST e tutto funziona !!!
Grazie mille per l'aiuto.
Per curiosità sai spiegarmi come fare a impostare l'accettazione del PUT ?
devo agire su IIS o posso farlo anche nel web.config ? e poi è consigliato l'uso del PUT o meglio utilizzare POST?

Poi avrei un'altro problemino ma forse meglio fare un'altro post, visto che l'argomento è differente
10.245 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Per curiosità sai spiegarmi come fare a impostare l'accettazione del PUT ?
devo agire su IIS o posso farlo anche nel web.config

Purtroppo non è una cosa che puoi risolvere tu. Penso che le richieste diverse da GET e POST vengano bloccate dal tuo hosting provider a livello di firewall, ma chiedigli conferma.



e poi è consigliato l'uso del PUT o meglio utilizzare POST?

Sì, una API REST dovrebbe potersi avvalere dei verbi GET, POST, PUT e DELETE. Però ci sono casi come quello che hai incontrato in cui non è possibile e quindi non resta che usare solamente GET per le letture e POST per le scritture.

ciao,
Moreno

Enjoy learning and just keep making
34 messaggi dal 26 febbraio 2001

Purtroppo non è una cosa che puoi risolvere tu. Penso che le richieste diverse da GET e POST vengano bloccate dal tuo hosting provider a livello di firewall, ma chiedigli conferma.

Sì, una API REST dovrebbe potersi avvalere dei verbi GET, POST, PUT e DELETE. Però ci sono casi come quello che hai incontrato in cui non è possibile e quindi non resta che usare solamente GET per le letture e POST per le scritture.


Ok allora chiederò a loro.
Grazie ancora
Modificato da cainellin il 21 marzo 2017 14.28 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.