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 unContent-Type
en-tête de demandeapplication/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.
Vous devez vous connecter pour publier un commentaire.
Parce que vous avez un très simple de la SCRO politique (Permettre à toutes les demandes de XXX de domaine), vous n'avez pas besoin de faire si compliqué. Essayez de faire la suite (Un très de base de la mise en œuvre de la SCRO).
Si vous ne l'avez pas déjà fait, installez le CORS de package nuget.
Dans le ConfigureServices méthode de démarrage.cs, ajoutez de la SCRO services.
Puis dans votre méthode Configure () de votre démarrage.cs, ajoutez la ligne suivante :
Maintenant de lui donner un aller. Les politiques sont pour quand vous voulez des politiques différentes pour les différentes actions (par exemple, les différents hôtes ou différents en-têtes). Pour votre exemple simple que vous n'avez vraiment pas besoin. Démarrer avec cet exemple simple et ajuster si vous avez besoin à partir de là.
Pour en savoir plus : http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/
app.UseCors
APRÈS ` app.UseMvc()`. Middlewares sont exécutées dans l'ordre où ils sont inscritsoptions.DisableHttpsRequirement();
pour tout ce travail. Il semble par https scro paramètres qui ne fonctionnaient pas.services.AddCors();
AVANT les services.AddMvc();Ajouter UseCors dans Configurer
Point principal est que ajouter
app.UseCors
, avant deapp.UseMvc()
.Assurez-vous de déclarer la SCRO fonctionnalités avant MVC ainsi, le middleware, les feux avant de la MVC pipeline obtient le contrôle et se termine à la demande.
Après la méthode ci-dessus fonctionne, vous pouvez le changer configurer une ORIGINE particulière pour accepter les appels d'api et d'éviter de laisser votre API donc ouvert à toute personne
Dans la configuration de la méthode de raconter de la SCRO à utiliser la stratégie que vous venez de créer:
Je viens de trouver ce petit article sur le sujet -
https://dzone.com/articles/cors-in-net-core-net-core-security-part-vi
Configure()
l'ordre n'est pas vraiment importante, ici, dansConfigureServices()
AllowCredentials()
avecAllowAnyOrigin()
comme ci-dessus. Pour utiliserAllowCredentials()
vous devez définirWithOrigins()
. docs.microsoft.com/en-us/aspnet/core/security/...builder.WithOrigins("http://localhost:4200").AllowAnyCredentials()...
Comme @NickDeBeer mentionné, il ne fonctionnera pas dans 2.2, sans préciser explicitement le permis origines.J'ai créé mon propre middleware classe qui a fonctionné pour moi, je pense qu'il ya quelque chose de mal avec .net middleware de base de la classe
et utilisé de cette façon dans le démarrage.cs
if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
Dans mon cas, seulement
get
demande fonctionne bien selon MindingData de réponse. Pour les autres types de demande, vous devez écrire:N'oubliez pas d'ajouter
.AllowAnyHeader()
De s'étendre sur les user8266077's réponse, j'ai trouvé que j'ai encore besoin de fournir des OPTIONS de réponse pour le contrôle en amont des demandes dans .NET de Base 2.1-aperçu dans mon cas d'utilisation:
puis activé le middleware comme dans de Démarrage.cs
app.Use<CorsMiddleware>();
await _next(context)
et le réglage du code d'état et de réponse manuellement si cela se produit. J'ai aussi dû ajouter "autorisation" pour Access-Control-Allow-en-Têtes pour le contrôle en amont de la demande de travail lorsque des demandes de réagir qui exige une autorisation.Aucune des procédures mentionnées ci-dessus ont aidé et j'ai ensuite lu l'article qui a résolu le problème.
Ci-dessous est le code.
et
et sur le haut de ma actionmethod
essayez d'ajouter
jQuery.support.cors = true;
avant l'appel AjaxIl se pourrait aussi que les données de votre envoi à l'API est bancale,
essayez d'ajouter le suivant JSON fonction
ensuite dans vos données: modification de l'objet à
Je pense que si vous utilisez votre propre de la SCRO middleware, vous devez vous assurer qu'il est vraiment de la SCRO demande en cochant origine en-tête.
Access-Control-Allow-Origin
en-tête n'a pas été émis par le serveur. En fait, j'ai envoyé des requêtes via le Facteur w/o laOrigin
en-tête. Cela a sauvé ma journée! (Ou au moins ma matinée 😉 )Basé sur votre commentaire dans MindingData réponse, il n'a rien à voir avec votre CORS, ça fonctionne.
Votre Contrôleur de l'action est de retour les données erronées. HttpCode 415 signifie, non pris en charge "type de Média". Cela se produit lorsque vous passez le mauvais format pour le contrôleur (c'est à dire XML à un contrôleur qui accepte uniquement json) ou lorsque vous revenez à un mauvais type (retour Xml dans un contrôleur qui est déclarée à seulement renvoyer du xml).
Pour plus tard, une vérification de l'existence de
[Produces("...")]
attribut sur votre actionPour moi, il n'avait rien à voir avec le code que j'ai utilisé. Pour Azure, nous avons dû aller dans les paramètres de l'Application de Service, dans le menu latéral de l'entrée "CORS". Là, j'ai dû ajouter le domaine que je demande des trucs de. Une fois que j'ai eu qui en, tout était magique.
Solution la plus simple est d'ajouter
de Démarrage.cs.
Dans launchSettings.json, sous iisSettings, ensemble anonymousAuthentication vrai:
Puis, dans la phase de Démarrage.cs, sous ConfigureServices, avant que les services.AddMvc, ajouter:
et ensuite, dans la méthode configure (), avant application.UseMvc() ajouter:
J'ai eu MindingData la réponse ci-dessus fonctionne, mais j'ai dû utiliser Microsoft.AspNet.Cors au lieu de Microsoft.AspNetCore.La scro. Je suis à l'aide .NetCore Application Web API projet dans Visual Studio 2019