webentwicklung-frage-antwort-db.com.de

Die gemischte Authentifizierung von JWT und Windows-Authentifizierung in ASP.Net Core 2.0 akzeptiert keine Anmeldeinformationen

Ich habe eine API in asp.net core 2.0 erstellt, in der ich die Authentifizierung im gemischten Modus verwende. Für einige Controller JWT und für einige mit Windows-Authentifizierung.

Ich habe kein Problem mit den Controllern, die mit JWT autorisieren. Aber für die Controller, auf denen ich Windows-Authentifizierung verwenden möchte, werde ich auf unbestimmte Zeit mit Benutzernamen und Passwort-Dialogfeld von Chrome aufgefordert.

Hier mein Beispiel-Controller-Code, in dem ich Windows-Authentifizierung anstelle von JWT verwenden möchte.

[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = "Windows")]
public class TestController : Controller
{
    [HttpPost("processUpload")]
    public async Task<IActionResult> ProcessUploadAsync(UploadFileModel uploadFileModel)
    {

    }
}

Mein Dienstecode konfigurieren

public void ConfigureServices(IServiceCollection services)
{
     services.AddAuthentication(options =>
     {
        options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
     .AddJwtBearer("Bearer", options =>
     {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false,       
            ValidateIssuer = false,  
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("blahblahKey")),
            ValidateLifetime = true, //validate the expiration and not before values in the token
            ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
        };
     });

     // let only my api users to be able to call 
     services.AddAuthorization(auth =>
     {
        auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
            .RequireClaim(ClaimTypes.Name, "MyApiUser").Build());
     });

     services.AddMvc();
}

Meine configure-Methode.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors("CorsPolicy");

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseAuthentication(); //needs to be up in the pipeline, before MVC
    app.UseMvc();
}

Schätzen Sie Ihre Vorschläge und helfen Sie dabei.

Update: Bis jetzt habe ich meinen Code auf Chrome getestet. Aber wenn ich IE 11 verwendet habe, läuft der obige Code ohne Probleme.

Kann dies eine CORS-Ausgabe von chrome where preflight issue sein?

Vielen Dank

13
coolcake

Sie müssen sicherstellen, dass Sie NICHT Authorization: Bearer <JWT_token> HTTP-Header, wenn Sie versuchen, Windows Auth zu verwenden. Der entscheidende Punkt hierbei ist, wie "Windows Auth" tatsächlich funktioniert. Schauen wir uns zum Beispiel an, wie es mit dem Browser funktioniert.

Nennen wir dies "einen normalen Ablauf":

  1. Sie navigieren zu http://example.com/api/resource in Ihrem Browser;
  2. Ihr Browser sendet eine HTTP-GET-Anfrage an http://example.com/api/resource ohne Authorization HTTP-Header für den Moment (eine anonyme Anfrage);
  3. Webserver (oder WebAPI selbst) erhalten eine Anfrage, stellen fest, dass es keinen Authorization Header gibt und antworten mit 401 Not Authorized Statuscode mit WWW-Authenticate: NTLM,Negotiate HTTP-Header eingerichtet ( "Geh weg, kein anonymer Zugriff. Nur 'NTLM'- oder' Negotiate'-Leute sind willkommen!" ) ;
  4. Browser erhält ein 401 Antwort, finde heraus, dass die Anfrage anonym war, schaut nach WWW-Authenticate Header und Anfrage sofort wiederholen, jetzt mit Authorization: NTLM <NTLM_token> HTTP Header ( "Okay, machen Sie es sich gemütlich, Herr Webserver! Hier ist mein NTLM-Token." );
  5. Server empfängt eine zweite Anfrage, findet NTLM - Token im Header Authorization, überprüft es und führt die Anfrage aus ( "Ok, Sie können übergeben. Hier ist Ihre resource. ").

Etwas anders sieht es aus, wenn Sie Authorization header initial auf einen Wert setzen:

  1. Dein JS benötigt http://example.com/api/resource mit JWT-Genehmigung;
  2. Ihr Browser sendet eine HTTP-GET-Anfrage an http://example.com/api/resource mit Authorization: Bearer <JWT_token> HTTP Header jetzt;
  3. Webserver (oder WebAPI selbst) erhalten eine Anfrage, stellen Sie fest, dass es Authorization Header mit "Bearer" -Authentifizierungsschema gibt, und antworten Sie erneut mit 401 Not Authorized Statuscode mit WWW-Authenticate: NTLM,Negotiate HTTP-Header eingerichtet ( "Geht weg, wir wissen nicht, wer diese 'Träger'-Typen sind, aber wir mögen sie nicht. Nur' NTLM 'oder' Verhandeln 'Jungs sind willkommen! ");
  4. Browser erhält ein 401 Antwort, stellen Sie fest, dass die Anforderung war autorisiert ist, und entscheiden Sie, dass dieses Token fehlerhaft ist. Wenn Sie jedoch den Header Authorization festlegen, bedeutet dies, dass Sie tatsächlich einige Anmeldeinformationen haben. In diesem Dialogfeld werden Sie nach diesen Anmeldeinformationen gefragt.
21
vasily.sib