Comment faire pour activer la SCRO en ASP.net Core WebAPI

Ce que je suis en train de faire

J'ai un backend ASP.Net de Base de l'API Web hébergé sur Azure Plan Libre (Code Source: https://github.com/killerrin/Portfolio-Backend).

J'ai aussi un Site web pour les Clients qui je veux faire consommer de l'API. Le Client Demande ne sera pas hébergé sur Azure, mais plutôt sera hébergé sur Github Pages ou sur un autre Service d'Hébergement Web que j'ai accès. De ce fait les noms de domaine ne s'alignent pas.

À la recherche dans ce, j'ai besoin d'activer la SCRO sur le Web API côté, cependant, j'ai essayé à peu près tout depuis plusieurs heures maintenant et il refuse de travailler.

Comment j'ai de l'Installation du Client
C'est juste un simple client écrit en React.js. Je suis l'appel de l'Api par AJAX en Jquery. La Réagir site fonctionne si je sais que ses pas que. Le Jquery, les appels de l'API travaille comme je l'ai confirmé dans la Tentative 1. Voici comment je fais les appels

    var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
    //alert(username + "|" + password + "|" + apiUrl);
    $.ajax({
        url: apiUrl,
        type: "POST",
        data: {
            username: username,
            password: password
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            var authenticatedUser = JSON.parse(response);
            //alert("Data Loaded: " + authenticatedUser);
            if (onComplete != null) {
                onComplete(authenticatedUser);
            }
        },
        error: function (xhr, status, error) {
            //alert(xhr.responseText);
            if (onComplete != null) {
                onComplete(xhr.responseText);
            }
        }
    });

Ce que j'ai essayé


Tentative 1 - Le " bon " chemin

https://docs.microsoft.com/en-us/aspnet/core/security/cors

J'ai suivi ce tutoriel sur le Site web de Microsoft à un T, en essayant tous les 3 options de permettre à l'échelle Mondiale dans le Démarrage.cs, pour l'installer sur chaque contrôleur et l'Essayer sur chaque Action.

Suivant cette méthode, la Croix de Domaine fonctionne, mais seulement sur une seule Action sur un seul contrôleur (POST à la AccountController). Pour tout le reste, la Microsoft.AspNetCore.Cors middleware refuse de définir les en-têtes.

J'ai installé Microsoft.AspNetCore.Cors via NUGET et la version est 1.1.2

Voici comment je l'ai de configuration de Démarrage.cs

    //This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //Add Cors
        services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        }));

        //Add framework services.
        services.AddMvc();
        services.Configure<MvcOptions>(options =>
        {
            options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
        });

        ...
        ...
        ...
    }

    //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)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        //Enable Cors
        app.UseCors("MyPolicy");

        //app.UseMvcWithDefaultRoute();
        app.UseMvc();

        ...
        ...
        ...
    }

Comme vous pouvez le voir, je fais tout ce que dit. - Je ajouter de la Scro avant MVC deux fois, et quand cela ne fonctionne pas j'ai essayé de mettre [EnableCors("MyPolicy")] sur chaque contrôleur comme

[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller

Tentative 2 - Brute Forcer

https://andrewlock.net/adding-default-security-headers-in-asp-net-core/

Après plusieurs heures de l'essayer lors de la dernière tentative, j'ai pensé que je voudrais essayer de bruteforce en essayant de définir les en-têtes manuellement, en les forçant à exécuter sur chaque réponse. Je l'ai fait en suivant ce tutoriel comment ajouter manuellement des en-têtes à chaque réponse.

Ce sont les en-têtes, j'ai ajouté

.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")

Ce sont d'autres têtes que j'ai essayé qui a échoué

.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")

Avec cette méthode, la Croix-têtes de Site sont appliqués correctement et qu'ils se présentent dans mon developer console et en Facteur. Le problème, toutefois, est que bien qu'il passe le Access-Control-Allow-Origin vérification, le contrôle webbrowser jette un hissy fit sur (je crois) Access-Control-Allow-Headers indiquant 415 (Unsupported Media Type)

De sorte que la force brute méthode ne fonctionne pas, soit


Enfin

Quelqu'un a eu cela fonctionne et pourrait donner un coup de main, ou simplement être en mesure de me pointer dans la bonne direction?


MODIFIER

De sorte à obtenir appels API pour passer à travers, j'ai dû l'arrêter à l'aide de JQuery et de passer à un Pur Javascript XMLHttpRequest format.

Tentative 1

J'ai réussi à obtenir le Microsoft.AspNetCore.Cors de travailler par la suite MindingData de réponse, sauf dans le Configure Méthode de mettre le app.UseCors avant app.UseMvc.

En outre, lorsqu'il est mélangé avec l'API Javascript Solution options.AllowAnyOrigin() pour le soutien joker a commencé à travailler en tant que bien.

Tentative 2

J'ai donc réussi à obtenir Tentative 2 (force brute) pour le travail... à la seule exception que le caractère Générique pour Access-Control-Allow-Origin ne fonctionne pas et comme j'ai pour définir manuellement les domaines qui y ont accès.

Son évidemment pas idéal car je veux juste ce WebAPI être ouvert à tout le monde, mais il atleast fonctionne pour moi sur un site distinct, ce qui signifie que c'est un début

app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
    .AddDefaultSecurePolicy()
    .AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
    .AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
    .AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
  • Pour votre 415 (Unsupported Media Type) problème, définissez un Content-Type en-tête de demande application/json.
  • Merci d'avoir pris le temps d'écrire un tel descriptif question.
  • Si vous faites le test avec le Facteur, assurez-vous de définir l'Origine de * ou quelque chose pour l'en-tête de requête, puis Tentative #1 devrait fonctionner. Sans cette en-tête, Access-Control-Allow-Origin ne seront pas retournés dans l'en-tête de réponse.
InformationsquelleAutor killerrin | 2017-06-06