In this post, we will focus on how to enable CORS in ASP.Net Core application, get knowledge about CORS policy, and how we can share resources through different origins.
The following topics will be discussed.
- What is CORS?
- Create .NET Core WebAPI Application
- Add Packages
- Add Database Connection
- Enable CORS
- Publishing to IIS
- Share Through .NET Core Sample Application
Introduction
First, let’s get introduced to CORS. According to Wikipedia, "Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts) on a web page to be requested from another domain outside the domain from which the resource originated."
Get more details from docs.asp.net. Let’s get started with a sample application.
Create New Application
Open Visual Studio 2015, then go top menu. and Click > File > New > Project
Choose Web API template.
Finally, .Net Core Welcome page will appear. Read more about .NET Core.
First, we need to add required packages to the sample application. Here, we have added those packages listed below in project.json file. After putting all those packages in our project config file, they will automatically be added to our application by IDE.
project.json
-
- "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
- "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
- "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
- "Microsoft.EntityFrameworkCore": "1.0.1",
-
- "Microsoft.AspNetCore.Cors": "1.0.0"
Now, let’s add Database connection to our application. Open appsettings.json file. We have put down our database connection string here, as you can see from the below code section.
appsettings.json - {
- "ConnectionStrings": {
- "dbConn": "Server=DESKTOP-JAKRV2S;Database=PhoneBook;Trusted_Connection=True;MultipleActiveResultSets=true"
- },
- "Logging": {
- "IncludeScopes": false,
- "LogLevel": {
- "Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
- }
- }
- }
After that, we need to call it in our application middle-ware in Startup.cs.
- publicvoidConfigureServices(IServiceCollection services) {
-
- varconnectionString = this.Configuration.GetConnectionString("dbConn");
- services.AddDbContext < PhoneBookContext > (options => options.UseSqlServer(connectionString));
-
- services.AddApplicationInsightsTelemetry(Configuration);
- services.AddMvc();
- }
Now, we are going to add & enable CORS to our sample API application. Open Startup.cs file from Solution Explorer. As you can see, I have added the CORS service in ConfigureServices method to enable it getting called on run-time.
Here, we have also specified different CORS enabled policies by using CorsPolicyBuilder. You may test by enabling different types with this sample application.
Startup.cs ConfigureServices- services.AddCors(
- options => options.AddPolicy("AllowCors",
- builder => {
- builder
-
-
- .AllowAnyOrigin()
-
-
-
- .WithMethods("GET", "PUT", "POST", "DELETE")
-
-
- .AllowAnyHeader();
- })
- );
Let’s separate the code with Origin.
With Origin
- Allow Specific Origin
builder.WithOrigins("http://localhost:4456")
- Allow Multiple Origins
builder.WithOrigins("http://localhost:4456", "http://localhost:4457")
- Allow All Origins
builder.AllowAnyOrigin()
With Methods
- Allow Specific Methods
builder.WithMethods("GET", "PUT", "POST", "DELETE")
- Allow All Methods
builder.AllowAnyMethod()
With Headers
- Allow Specific Headers
builder.WithHeaders("Accept", "Content-type", "Origin", "X-Custom-Header")
- Allow All Headers
builder.AllowAnyHeader()
After that, we have enabled CORS for your application, using an extension method “UseCors“.
Startup.cs Configure-
- app.UseCors("AllowCors");
Finally, the complete Startup.cs.
- publicclassStartup {
- public Startup(IHostingEnvironmentenv) {
- var builder = newConfigurationBuilder()
- .SetBasePath(env.ContentRootPath)
- .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
- .AddJsonFile($ "appsettings.{env.EnvironmentName}.json", optional: true);
-
- if (env.IsEnvironment("Development")) {
-
- builder.AddApplicationInsightsSettings(developerMode: true);
- }
-
- builder.AddEnvironmentVariables();
- Configuration = builder.Build();
- }
-
- publicIConfigurationRoot Configuration {
- get;
- }
-
-
- publicvoidConfigureServices(IServiceCollection services) {
-
-
- varconnectionString = this.Configuration.GetConnectionString("dbConn");
- services.AddDbContext < PhoneBookContext > (options => options.UseSqlServer(connectionString));
-
-
- services.AddApplicationInsightsTelemetry(Configuration);
-
- services.AddMvc();
-
-
-
-
-
-
-
- services.AddCors(
- options => options.AddPolicy("AllowCors",
- builder => {
- builder
-
-
- .AllowAnyOrigin()
-
-
-
-
- .WithMethods("GET", "PUT", "POST", "DELETE")
-
-
-
- .AllowAnyHeader();
- })
- );
-
- }
-
-
- publicvoid Configure(IApplicationBuilder app, IHostingEnvironmentenv, ILoggerFactoryloggerFactory) {
- loggerFactory.AddConsole(Configuration.GetSection("Logging"));
- loggerFactory.AddDebug();
-
- app.UseApplicationInsightsRequestTelemetry();
-
- app.UseApplicationInsightsExceptionTelemetry();
-
- app.UseMvc();
-
-
- app.UseCors("AllowCors");
-
- }
- }
MVC WebAPI
Here is the list of required namespaces.
- usingMicrosoft.AspNetCore.Mvc;
- usingMicrosoft.AspNetCore.Cors;
- usingCrossOrigin.WebService.Models.DbEntities;
- usingMicrosoft.EntityFrameworkCore;
API Controller
Here, we are applying specific CORS policies on APiController. It can also be applied on a per action basis, or globally, for all controllers.
We can disable CORS by using attribute “DisableCors“. In this controller, we have applied “PUT” method to disable the CORS.
Publishing to IIS
We need to prepare our Server for ASP.NET Core application to host. Get more details on
Publishing .NET Core Application. We have used localhost with assigning port 8081, to get accessed by our Sharing application.
http://localhost:8081 Let’s browse our application by using
http://localhost:8081 URL, as you can see our API is working with response of JSON data.
Now is the time to access the shared resource. I have added an
existing sample application to this solution. Given below is the simple change that I have made to access the resource via API from different origin.
Share Resource
Here, we have tried to access the resource through http://localhost:8081 but a server error occurred, as you can see below.
After enabling CORS we have successfully been able to access the shared resource through Web API.
Output Source Code
I’ve uploaded the full source code to download/clone
@github. Hope this will help.