619 messaggi dal 13 novembre 2008
Contributi
ciao,
mi sono incastrato su questo problema:
una webapp, multitenant, tenant collegati a domini custom;

richiesta ajax da tenant-dominio 'uno.com' al principale dell'app 'principale.com' (dove l'utente si è loggato in precedenza);

scopo: verificare se l'utente è loggato su 'principale.com'

js:
          $.ajax({
                url: "principale.com/Home/CheckAuth",
                dataType: "json",
                xhrFields: {
                    withCredentials: true
                },
                crossDomain: true,
                contentType: "application/json; charset=utf-8",
                cache: false,
                type: 'GET'
            })
                .done(function (result) {...

server:
        [HttpGet]
        [EnableCors("myPolicy")]
        public async Task<ViewModel> CheckAuth()
        {
            bool isAuth = HttpContext.User.Identity.IsAuthenticated;
.....


ho settato CORS correttamente con una policy per le origini che include tutti i domini in gioco, infatti ricevo status code 200, ma isAuth è sempre false....

Grazie!!
Modificato da teo prome il 30 agosto 2018 15.43 -
10.907 messaggi dal 09 febbraio 2002
Contributi
Ciao,
hai verificato dagli strumenti di sviluppo del browser se il cookie di autenticazione viene incluso nella richiesta? Ovviamente il cookie deve essere stato emesso per il dominio principale.com.

Enjoy learning and just keep making
619 messaggi dal 13 novembre 2008
Contributi
Il cookie è emesso correttamente al login su principale.com, l'utente viene direzionato alla sua pagina uno.com (in realtá é tenant.principale.com girato sul dominio custom tramite route) che essendo un dominio custom non ha il cookie e qui viene inviata la richiesta ajax a principale per avere alcuni dati del tenant; essendo l'utente loggato su principale mi aspettavo di poter fare un semplice controllo e restituire quei dati... Nella richiesta il cookie non c'è
10.907 messaggi dal 09 febbraio 2002
Contributi

Nella richiesta il cookie non c'è

Ok, questo spiega perché IsAuthenticated è sempre false.

Puoi far vedere il codice con cui è stato abilitato CORS lato Web API?
Controlla le due cose che sono state menzionate qua:
https://stackoverflow.com/questions/19644015/cors-request-failure-with-jquery-using-withcredentials-and-client-certificates
  • Access-Control-Allow-Credentials deve essere stato abilitato;
  • Access-Control-Allow-Origin non deve essere stato impostato sulla wildcard (*), ma devono essere stati elencati esplicitamente i domini abilitati.


ciao,
Moreno

Enjoy learning and just keep making
619 messaggi dal 13 novembre 2008
Contributi
          
services.AddCors(corsoptions =>

            {

                corsoptions.AddPolicy("myPolicy", builder =>

                {
                    builder.AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithOrigins("http://principale.com", "http://uno.com");
                });

            }).AddTransient<ICorsPolicyProvider, CorsPolicyAccessor>();

//n.b CorsPolicyAccessor verifica eventuali altri domini (al momento in test non ci sono) e li inserisce se passano alcuni controlli; verificato a debug

...

         app.UseCors("myPolicy"); 

            app.UseMvc(routes =>
            {

...



header richiesta:

Accept
application/json, text/javascript, */*; q=0.01
Accept-Encoding
gzip, deflate
Accept-Language
it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Connection
keep-alive
Content-Type
application/json; charset=utf-8
DNT
1
Host
principale.com
Origin
http://uno.com
Referer
http://uno.com
User-Agent
Mozilla/5.0 (Windows NT 10.0; &#8230;) Gecko/20100101 Firefox/61.0

header risposta:

Access-Control-Allow-Credentials
true
Access-Control-Allow-Origin
http://uno.com
Content-Type
application/json; charset=utf-8
Date
Fri, 31 Aug 2018 07:35:29 GMT
Server
Kestrel
Transfer-Encoding
chunked
Vary
Origin
X-Powered-By
ASP.NET
X-SourceFiles
=?UTF-8?B?QzpcVXNlcnNcY3JpXERl&#8230;EhvbWVcVXNlcklzQXV0aE1lbnU=?=

ciao
10.907 messaggi dal 09 febbraio 2002
Contributi
Ok, cerco di mettere insieme i pezzi...

Host 
principale.com

e
Il cookie è emesso correttamente al login su principale.com (in realtá é tenant.principale.com girato sul dominio custom tramite route)


Se il cookie è stato emesso per tenant.principale.com non verrà inviato dal browser per richieste rivolte a principale.com.
Verifichiamo precisamente per quale dominio è stato emesso questo cookie: da Chrome, visita una pagina qualsiasi su principale.com, poi apri gli strumenti di sviluppo del browser e vai nella scheda "Application" e seleziona "Cookies". Il cookie è lì? Se non è lì, ripeti la stessa cosa ma visitando una pagina di tenant.principale.com.

ciao,
Moreno

P.S. Se un cookie viene emesso per principale.com non è detto che sia inviato dal browser anche per richieste verso tenant.principale.com. Dipende da come è stato settato il Domain. Leggi qui:
https://stackoverflow.com/questions/18492576/share-cookie-between-subdomain-and-domain

Enjoy learning and just keep making
619 messaggi dal 13 novembre 2008
Contributi
Ciao, il domain per il cookie è corretto '.principale.com', e il cookie è corretto e visibile sia per tenant.principale.com sia per principale.com; se l'ajax viene inviato dal tenant non ho problemi. il problema si pone quando tenant.principale.com è associato ad un dominio custom, es. Uno.com dove il cookie non c'è; lanciando la richiesta ajax da uno.com a principale.com pensavo che essendoci su principale.com il cookie si potesse verificare l'autenticazione con cors settato correttamente e con la richiesta crossdomain. Lo scopo è fare una verifica da un URL senza cookie all'url che ha il cookie.
10.907 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Lo scopo è fare una verifica da un URL senza cookie all'url che ha il cookie.

Sì sì, chiaro.

Ho provato a creare due progetti da zero per verificare la cosa ma non riesco a riprodurre il problema. Infatti vedo che il cookie viene correttamente inviato.

Lato ASP.NET Core Web API, sto emettendo un cookie con questo codice. Non si tratta di un cookie di autenticazione, comunque è sufficiente per verificare che poi l'applicazione client lo restituisca al server con la richiesta ajax.
[HttpGet]
public ActionResult<string> Get()
{
    string val = Request.Cookies["MyCookie"];
    if (val == null)
    {
        Response.Cookies.Append("MyCookie", Guid.NewGuid().ToString());
    }
    return Ok(val ?? "");
}


Ho configurato CORS in questo modo, senza configurare il CorsPolicyAccessor.
services.AddCors(corsoptions =>
{
    corsoptions.AddPolicy("myPolicy", builder =>
    {
        builder.AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithOrigins("http://localhost:64067");
    });
});


E poi ho aggiunto il middleware così, come avevi fatto tu:
app.UseCors("myPolicy");
app.UseMvc();

Ho avviato l'applicazione web api e ho inviato una richiesta digitando http://localhost:64957/api/values nella barra degli indirizzi del browser per farle emettere il cookie. Il cookie è stato correttamente emesso, come si vede dall'intestazione Set-Cookie della response. Nel mio caso non ho indicato alcun domain.
Content-Length: 0
Content-Type: text/plain; charset=utf-8
Date: Sun, 02 Sep 2018 11:11:52 GMT
Server: Kestrel
Set-Cookie: MyCookie=1636dad5-9848-4a40-af82-da2dc8970055; path=/


Poi ho avviato l'applicazione lato client, che ha inviato la richiesta ajax così:
<script>
    $.ajax({
        url: "http://localhost:64957/api/values",
        dataType: "json",
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true,
        cache: false,
        type: 'GET',

    }).always(function (response) {
        console.log("response: ", response);
    });
</script>


Vedo che il cookie è stato correttamente inoltrato, come si vede dall'intestazione Cookie della richiesta ajax.
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Cookie: MyCookie=1636dad5-9848-4a40-af82-da2dc8970055
Host: localhost:64957
Origin: http://localhost:64067
Pragma: no-cache
Referer: http://localhost:64067/Home/Index
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36


Non so bene perché nel tuo caso il cookie non venga inviato. L'unica differenza con le prove che ho fatto io è nel dominio.


il domain per il cookie è corretto '.principale.com',

Prova semplicemente a togliere il punto iniziale, in modo che sia 'principale.com'.
Come si legge qui:

Ad esempio, se viene impostato Domain=mozilla.org , il cookie viene incluso in tutti i sottodomini come developer.mozilla.org.


ciao,
Moreno
Modificato da BrightSoul il 02 settembre 2018 13.19 -

Enjoy learning and just keep making

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.