This prevents cookie confusion when applications are hosted at the same domain and path. For example, under default settings, WebMVC may attempt to decrypt Identity's antiforgery cookie rather than its own.
95 lines
3.5 KiB
C#
95 lines
3.5 KiB
C#
using System;
|
|
using Microsoft.AspNetCore.Antiforgery;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.SpaServices.Webpack;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json.Serialization;
|
|
using eShopOnContainers.WebSPA;
|
|
|
|
namespace eShopConContainers.WebSPA
|
|
{
|
|
public class Startup
|
|
{
|
|
private IHostingEnvironment _hostingEnv;
|
|
public Startup(IHostingEnvironment env)
|
|
{
|
|
_hostingEnv = env;
|
|
|
|
var builder = new ConfigurationBuilder()
|
|
.SetBasePath(env.ContentRootPath)
|
|
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
|
|
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
|
|
.AddEnvironmentVariables();
|
|
|
|
if (env.IsDevelopment())
|
|
{
|
|
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
|
|
builder.AddUserSecrets();
|
|
}
|
|
|
|
Configuration = builder.Build();
|
|
}
|
|
|
|
public static IConfigurationRoot Configuration { get; set;}
|
|
// This method gets called by the runtime. Use this method to add services to the container.
|
|
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
|
|
public void ConfigureServices(IServiceCollection services)
|
|
{
|
|
services.Configure<AppSettings>(Configuration);
|
|
|
|
services.AddDataProtection(opts =>
|
|
{
|
|
opts.ApplicationDiscriminator = "eshop.webspa";
|
|
});
|
|
|
|
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
|
|
|
|
services.AddMvc()
|
|
.AddJsonOptions(options =>
|
|
{
|
|
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
|
|
});
|
|
}
|
|
|
|
|
|
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
|
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IAntiforgery antiforgery)
|
|
{
|
|
if (env.IsDevelopment())
|
|
{
|
|
app.UseDeveloperExceptionPage();
|
|
}
|
|
|
|
// Configure XSRF middleware, This pattern is for SPA style applications where XSRF token is added on Index page
|
|
// load and passed back token on every subsequent async request
|
|
app.Use(async (context, next) =>
|
|
{
|
|
if (string.Equals(context.Request.Path.Value, "/", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
var tokens = antiforgery.GetAndStoreTokens(context);
|
|
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });
|
|
}
|
|
await next.Invoke();
|
|
});
|
|
|
|
app.UseStaticFiles();
|
|
|
|
|
|
app.UseMvc(routes =>
|
|
{
|
|
routes.MapRoute(
|
|
name: "default",
|
|
template: "{controller=Home}/{action=Index}/{id?}");
|
|
|
|
routes.MapSpaFallbackRoute(
|
|
name: "spa-fallback",
|
|
defaults: new { controller = "Home", action = "Index" });
|
|
});
|
|
}
|
|
}
|
|
}
|