none
Windows Authentifizierung bei ASP.NET Core lässt nur GET Requests zu RRS feed

  • Frage

  • Hallo zusammen,

    Ich versuche nun seit geraumer Zeit eine Rest-API auf Basis des ASP.NET Cores zu erstellen. Aufgrund dessen, dass die Applikation lediglich intern genutzt wird, habe ich mich dazu entschieden die integrierte Windows Authentifizierung zu nutzen.

    Im Frontend nutze ich im allgemeinen VUE und für die Http-Requests axios (AXIOS - GitHub). Jeglicher GET-Request funktioniert hierüber auch super, allerdings egal ob POST, PATCH, PUT oder DELETE bei allen Request bekomme ich ein 401, sprich eine Meldung, dass ich nicht authentifiziert sei. Ich habe bereits versuch den Parameter "witchcredentials" in Axios auf "true" zu setzen allerdings brachte dies keine Besserung.

    Fehlermeldung in Chrome

      

    API.js

    import axios from 'axios'
    
    export default () => {
      return axios.create({
        baseURL: 'https://localhost:44378/api/',
        withCredentials: true,
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        }
      })
    }
    

    API Call

    Api().put('users/test', {
        })
        .then(function(res) {
          console.log(res)
        })
        .then(function(err) {
          console.log(err)
        })


    Ich hoffe, mir kann jemand weiterhelfen, da ich hierzu schlichtweg gar nichts mittels Dr. Google finde.
    Danke schon mal!
    Grüße Marcel

    Freitag, 19. Juli 2019 06:17

Antworten

Alle Antworten

  • Hallo Marcel,

    wie man in Chrome sieht, wird vor dem eigentlichen Request (GET, POST, PUT, ...) erstmal ein OPTIONS Request an den Server gestellt. Mit diesem will der Client bspw. ermitteln, ob der Zugriff überhaupt erlaubt wäre (unabhängig von der Authentifizierung, Stichwort CORS).

    Um CORS in ASP.NET 2.x Anwendungen zu aktivieren, schau mal bitte hier:

      Aktivieren Sie ursprungsübergreifende Anforderungen (CORS) in ASP.NET Core



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 19. Juli 2019 07:04
    Moderator
  • Hallo Stefan,

    Vielen Dank für deine Antwort. Allerdings verstehe ich nicht, das wenn es an CORS-Header liegt ein GET-Request funktioniert. Zumal ich bei meinen Test entweder den Header "Access-Control-Request-Method" nicht gesetzt habe oder "OPTIONS" in diesem Feld inkludiert habe.
    Des Weiteren musste ich die CORS Header immer mittles der applicationhost.config setzten, da jegliche Regel, die ich mittels Code programmiert hatte nicht gegriffen hat.

    Jetzt habe ich mal meine Einträge in der *.config wieder entfernt und meine Startup Klasse sieht im Moment, nach Vorbild deines verlinkten Beitrages, so aus:

    public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
    
            public IConfiguration Configuration { get; }
    
            // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddCors(options =>
                {
                    options.AddPolicy(MyAllowSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins("http://localhost:8080/").AllowAnyHeader().AllowAnyMethod();
                    });
                });
    
                services.Configure<IISOptions>(opt =>
                {
                    opt.AutomaticAuthentication = true;
                });
    
                services.AddAuthentication(IISDefaults.AuthenticationScheme);
    
                services.AddDbContext<FrühstücksshopContext>
                    (opt => opt.UseSqlServer(Configuration["Database:ConnectionString"]));
    
                services.AddMvc()
                    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                    .AddJsonOptions(
                        options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                    );
            }
    
            // 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, FrühstücksshopContext context)
            {
                /*Seeder seeder = new Seeder();
                seeder.seed(context);*/
                //System.Diagnostics.Debug.WriteLine(prod.Ratings.Count);
    
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseHsts();
                }
    
                app.UseCors(MyAllowSpecificOrigins);
                app.UseHttpsRedirection();
                app.UseMvc();
    
                app.UseMiddleware<NewUserMiddleware>();
            }

    Jetzt bekomme ich allerdings wieder selbst bei einem GET-Request, den CORS-Fehler.

    Grüße Marcel

    Freitag, 19. Juli 2019 07:35
  • Hallo,

    ich habe mir auf der Client-Seite das ganze auch noch einmal angeschaut. Wenn ich Chrome ohne CORS Validierung starte funktioniert alles. Sprich es muss tatsächlich noch am CORS Header liegen. Schaue ich mir allerdings die Header an, die gesendet werden, verstehe ich nicht, warum.

    Das wird im Chrome bei meinem geblockten Request angezeigt. Den Headern nach sollte alles soweit passen.


    PS: Es funktioniert auch nicht, wenn ich den header "Access-Control-Request-Method" hinzufüge. (

    Access-Control-Allow-Methods:
    POST,GET,PUT,DELETE,OPTIONS)

    Grüße Marcel


    • Bearbeitet Longbit Freitag, 19. Juli 2019 07:52 PS vergessen
    Freitag, 19. Juli 2019 07:46
  • Hallo

    versuch mal in der Startup.cs > ConfigureServices

    services.AddCors(o =>
                {
                    o.AddPolicy(
                        "MyAllowSpecificOrigins",
                        b => b
                        .AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials()
                        );
                });

    und in Configure

    app.UseCors("MyAllowSpecificOrigins");

    Wichtig ist das dies vor app.UseMvc(); steht


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings



    Freitag, 19. Juli 2019 17:08
  • Hallo Thomas.

    Wichtig ist das dies vor app.UserMVC(); steht

    ein kleiner Schreibfehler (nur, damit der TE nicht da steht und nicht weiß, dass das eben nur ein Schreibfehler ist^^)

    app.UseMvc();
     



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Freitag, 19. Juli 2019 21:58
    Moderator
  • Danke für die Korrektur 

    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings

    Freitag, 19. Juli 2019 21:59