webentwicklung-frage-antwort-db.com.de

Wurde von der CORS-Richtlinie blockiert: Die Antwort auf die Preflight-Anforderung besteht keine Zugriffskontrollprüfung

Ich habe Trip Server erstellt. Es funktioniert gut und wir können POST-Anfrage von Insomnia machen, aber wenn wir POST-Anfrage von Axios an unserem Frontend machen, sendet es einen Fehler:

has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.

Unsere Anfrage zu Axios:

let config = {
headers: {
  "Content-Type": "application/json",
  'Access-Control-Allow-Origin': '*',
  }
}

let data = {
  "id": 4
 }

 axios.post('http://196.121.147.69:9777/twirp/route.FRoute/GetLists', data, config)
   .then((res) => {
      console.log(res)
     })
    .catch((err) => {
      console.log(err)
   });
} 

Meine Go-Datei:

func setupResponse(w *http.ResponseWriter, req *http.Request) {
    (*w).Header().Set("Access-Control-Allow-Origin", "*")
    (*w).Header().Set("Access-Control-Allow-Methods", "POST,GET,OPTIONS, PUT, DELETE")

    (*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}


func WithUserAgent(base http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

    ctx := r.Context()
    ua := r.Header.Get("Jwt")
    ctx = context.WithValue(ctx, "jwt", ua)

    r = r.WithContext(ctx)

    setupResponse(&w, r)
     base.ServeHTTP(w, r)
  })
}

const (
    Host     = "localhost"
    port     = 5432
    user     = "postgres"
    password = "postgres"
    dbname   = "postgres"
)

func main() {

    psqlInfo := fmt.Sprintf("Host=%s port=%d user=%s "+
           "password=%s dbname=%s sslmode=disable",
               Host, port, user, password, dbname)

    server := &s.Server{psqlInfo}

    twirpHandler := p.NewFinanceServiceServer(server, nil)

    wrap := WithUserAgent(twirpHandler)
      log.Fatalln(http.ListenAndServe(":9707", wrap))
}

Wie ich bereits auf Insomnia gesagt habe, funktioniert es großartig, aber wenn wir eine axios POST-Anfrage machen, erscheint auf der Browserkonsole folgendes: 

wurde durch die CORS-Richtlinie blockiert: Die Antwort auf die Preflight-Anforderung besteht keine Zugriffskontrollprüfung: Sie hat keinen HTTP-Status "OK".

3
GGG

Ich glaube, das ist das einfachste Beispiel:

header := w.Header()
header.Add("Access-Control-Allow-Origin", "*")
header.Add("Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS")
header.Add("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With")

Sie können auch einen Header für Access-Control-Max-Age hinzufügen und natürlich auch beliebige Header und Methoden zulassen, die Sie wünschen.

Zum Schluss möchten Sie auf die erste Anfrage antworten:

if r.Method == "OPTIONS" {
    w.WriteHeader(http.StatusOK)
    return
}

Natürlich wäre es wahrscheinlich einfacher, dafür einfach Middleware zu verwenden. Ich glaube nicht, dass ich es benutzt habe, aber das hier scheint sehr zu empfehlen.

2
threeve

Die hier angegebene Lösung ist korrekt. Derselbe Fehler kann jedoch auch bei einem Benutzerfehler auftreten, bei dem Ihre Endpunktanforderungsmethode mit der Methode übereinstimmt, die Sie beim Erstellen der Anforderung verwenden.

Beispielsweise wird der Serverendpunkt mit "RequestMethod.PUT" definiert, während Sie die Methode als POST anfordern.

0
JAD

Cross-Origin-Anforderungen in ASP.NET-Web-API aktivieren Weitere Informationen finden Sie hier

Aktivieren Sie CORS in der WebService-App. Fügen Sie zunächst das CORS NuGet-Paket hinzu. Wählen Sie in Visual Studio im Menü Extras die Option NuGet Package Manager und dann Package Manager Console. Geben Sie im Fenster der Package Manager Console den folgenden Befehl ein:

Install-Package Microsoft.AspNet.WebApi.Cors

Dieser Befehl installiert das neueste Paket und aktualisiert alle Abhängigkeiten, einschließlich der Kern-Web-API-Bibliotheken. Verwenden Sie das Flag -Version, um auf eine bestimmte Version zu zielen. Für das CORS-Paket ist Web API 2.0 oder höher erforderlich.

Öffnen Sie die Datei App_Start/WebApiConfig.cs. Fügen Sie der WebApiConfig.Register-Methode den folgenden Code hinzu:

using System.Web.Http;
namespace WebService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // New code
            config.EnableCors();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

Fügen Sie als Nächstes das Attribut [EnableCors] zu Ihren Controller/Controller-Methoden hinzu

using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;

namespace WebService.Controllers
{
    [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
    public class TestController : ApiController
    {
        // Controller methods not shown...
    }
}

Aktivieren Sie Cross-Origin Requests (CORS) in ASP.NET Core

0
Usman Mahmood