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.
hai commentato 'SuppressDefaultHostAuthentication' nel tuo WebApiConfig? –
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