2015-03-27 13 views
6

Ho una soluzione con 2 progetti. Uno è un'applicazione Web ASP.NET MVC e l'altro è un progetto API Web. Quello che voglio fare è condividere i cookie tra le 2 applicazioni. Una volta installato sul server, la prima applicazione è ospitata su mydomain.com e l'altra su api.mydomain.com (sottodominio). Io uso anche https. Io uso ASP.NET Identity nel progetto MVC come sistema di autenticazione. Dopo aver letto numerosi articoli su Internet ho fatto quanto segue:Condividere i cookie tra il progetto ASP.NET MVC e il progetto API Web

1) Nel file web.config, in entrambi i progetti, è stato inserito il seguente tag chiave della macchina.

<machineKey validationKey="3DF5D185FFB897592E14ED51A6DDC3E2729827A2F2180151A1BC39BE5C035D15F23700C928EFDBACEAEE498D05B76C65537FDEFB673039BCD961045C3BA8ACD3" 
      decryptionKey="CE274BA1DB61C086A80F5D8BD1AC5AC92A8BA19F37E04FC7" validation="SHA1" /> 

2) Nel progetto MVC Ho configurato il Cookie ASP.NET identità nel modo seguente:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Home/index"), 
     Provider = new CookieAuthenticationProvider 
     { 
      OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(TimeSpan.FromMinutes(30), (manager, user) => user.GenerateUserIdentityAsync(manager)) 
     }, 
     SlidingExpiration = true, 
     ExpireTimeSpan = TimeSpan.FromMinutes(45), 
     CookieName = "MyCookie", 
     CookieDomain = ".mydomain.com" 
}); 

3) Nel progetto Web API ho abilitato e configurato CORS ed io hanno aggiunto la seguente configurazione nel web.config (CORS funziona bene nella produzione ambiente):

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Credentials" value="true"></add> 
    <add name="Access-Control-Allow-Origin" value="mydomain.com" /> 
    <add name="Access-Control-Allow-Headers" value="content-type" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 

4) ho aggiunto la sezione httpCookies (in entrambi i progetti) come segue:

<httpCookies requireSSL="true" domain=".mydomain.com" httpOnlyCookies="true" /> 

Nei miei controllori API web ho applicato l'attributo Autorizza come segue:

[Authorize] 
public class MyController : ApiController 
{ 
    //My action methods here 
} 

Infine dal progetto MVC provo a chiamare il mio servizio con una richiesta di jQuery Ajax.

$.ajax({ 
    url: viewModelParameters.myUrl, 
    type: "get", 
    dataType: "json", 
    data: { userId: viewModelParameters.id }, 
    xhrFields: { 
     withCredentials: true 
    }, 
    crossDomain: true, 
    statusCode: { 
     200: function (user) { 
     } 
    } 
}); 

ricevo il seguente messaggio:

autorizzazione è stata negata per questa richiesta.

Nelle intestazioni di richiesta posso vedere che il cookie è incluso nella richiesta. Potresti suggerire una soluzione o pensare a cosa mi sto perdendo? Grazie in anticipo.

+0

hai commentato 'SuppressDefaultHostAuthentication' nel tuo WebApiConfig? –

+0

Salve, purtroppo non ho la risposta alla tua domanda, ma volevo dire che i tuoi cookie non sono più sicuri dopo aver postato le chiavi segrete nella tua domanda. – dustinmoris

risposta

0

è necessario includere lo app.UseCookieAuthentication() in entrambi i progetti WebAPI e MVC.

Problemi correlati