web-dev-qa-db-fra.com

Asp.net core web api utilisant l'authentification Windows - Demande Cors non autorisée

Dans mon API web centrale asp.net, j'ai configuré Cors conformément à l'article de Documentation MS . L'application Web api utilise l'authentification Windows (l'authentification anonyme n'est pas activée). La politique de Cor est créée et le middleware est ajouté comme ci-dessous dans le startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.WithOrigins("http://localhost:4200")
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials()
            );
    });

    services.AddMvc().AddJsonOptions(options => {
        options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{         
    //Enable CORS policy 
    app.UseCors("CorsPolicy");
    app.UseMvc();
}

Applique également la stratégie par niveau de contrôleur

[EnableCors("CorsPolicy"), Route("api/[controller]")]
public class LocationController : BaseController<Location>
{
  //code
}

La demande d'options devient non autorisée. La demande et la réponse ressemble à 

 enter image description here

J'ai vu des questions similaires et essayé presque toutes les solutions, mais la requête d'options échoue toujours. 

9
rumi

Vous voudrez peut-être lire ce fil de discussion: https://github.com/aspnet/CORS/issues/60 . Vous pouvez combiner anonymes et NTLM afin que vos contrôles en amont CORS ne soient pas refusés (car ils n'incluent pas les informations d'identification Windows). IIS gère l'authentification NTLM avant même qu'elle n'atteigne le middleware. Il s'agit donc probablement d'un problème IIS. Vous devrez peut-être autoriser les vérifications de contrôle en amont des COR anonymes.

3
Kyle B

Il semble que vous souhaitiez transmettre les informations d'identification ou accompagner la demande.

Veuillez vérifier ce lien pour ajouter des informations d'identification/autoriser les informations d'identification d'utilisateur.

Faites attention lorsque vous autorisez les informations d'identification d'origine croisée. Un site Web situé dans un autre domaine peut envoyer les informations d'identification d'un utilisateur connecté à l'application pour le compte de l'utilisateur à l'insu de l'utilisateur. La spécification CORS indique également que la définition d'origines sur "*" (toutes origines) n'est pas valide si l'en-tête Access-Control-Allow-Credentials est présent.

0
Asav Vora

Ceci est très similaire à CORS activé, mais la réponse pour le contrôle en amont a un code de statut HTTP non valide 404 lors de l’envoi de JSON et la solution fournie fonctionne pour moi (j’avais une erreur 401 sur les demandes POST). De même, NTLM et Negotiate ne doivent pas être configurés tous les deux ( Négocier V/s NTLM ).

L’utilisation de IIS CORS Module a parfaitement résolu le problème. L'URL ci-dessous est pour référence.

Utilisation de l'authentification Windows .__ Bien que ce ne soit en aucun cas le seul scénario résolu par le module CORS, il était suffisamment important pour justifier un appel. Auparavant, si vous tentiez de faire une demande interdomaine à une application qui utilisait l'authentification Windows, votre demande de contrôle en amont échouait, car le navigateur n'envoyait pas les informations d'identification avec la demande de contrôle en amont. Il n'y avait aucun moyen de contourner ce problème sans activer l'authentification anonyme dans votre application. Etant donné que le module CORS démarre avant l’authentification, il permet de traiter une demande préalable au vol sans compromettre le modèle de sécurité de votre application. Voici un exemple de ce à quoi votre web.config pourrait ressembler.

https://blogs.iis.net/iisteam/getting-started-with-the-iis-cors-module

Exemple de code:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following section. 
         For more info see https://go.Microsoft.com/fwlink/?linkid=838655 -->
         <system.web>
        <authentication mode="Windows"/>
    </system.web>
  <system.webServer>
  <cors enabled="true" failUnlistedOrigins="true">
            <add Origin="http://localhost:60096" allowCredentials="true" >
            <allowHeaders allowAllRequestedHeaders="true">
                    <add header="Header1" />
                </allowHeaders>
            </add>
        </cors>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\Project.Api.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>
0
AJP